搜索
查看: 22059|回复: 25

[分享] STM32CUBE F407ZET6串口1通过DMA方式接收不定长数据

  [复制链接]

该用户从未签到

3

主题

95

帖子

4

蝴蝶豆

高级会员

最后登录
2019-9-22
发表于 2017-5-3 23:25:31 | 显示全部楼层 |阅读模式
本帖最后由 yygkqzh 于 2017-5-4 14:14 编辑

最近买了一块STM32F407的板子,玩了较长时间,开发使用的是STM32CUBE,发现这个软件确实很实用,只要在软件界面进行选择,就可以帮你配置好各项参数。今天根据Paderboy的帖子【NUCLEO-L476RG开发】DMA-ADC1-串口不定长接收,也在自己的板子上搞了一把串口通过DMA方式接收数据,并通过显示接收到数据长度和接收到的数据
下面上图:
配置时钟为外部高速时钟 1.png
配置串口1为异步收发模式
2.png
配置时钟为外部8MHz晶振,配置系统时钟168MHz
3.png
配置串口波特率115200,使能发送和接收
4.png
开启串口接收中断
5.png
使能DMA串口接收
6.png
配置NVIC
7.png
NVIC生成代码
8.png
然后输出代码 ,下面是在生成的代码中添加的。
变量定义
  1. /* USER CODE BEGIN PV */
  2. /* Private variables ---------------------------------------------------------*/
  3. /*        可以接收的最大字符个数        */
  4. #define BUFFERSIZE 255                                
  5. uint8_t ReceiveBuff[BUFFERSIZE];                                                //接收缓冲区
  6. uint8_t recv_end_flag = 0,Rx_len;        //接收完成中断,接收到字符长度
  7. /* USER CODE END PV */
复制代码
函数声明
  1. /* USER CODE BEGIN PFP */
  2. /* Private function prototypes -----------------------------------------------*/
  3. void uartdamget(void);
  4. #ifdef __GNUC__
  5. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  6. #else
  7. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  8. #endif
  9. PUTCHAR_PROTOTYPE
  10. {
  11.         HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
  12. return ch;
  13. }
  14. /* USER CODE END PFP */
复制代码
开启串口IDLE中断
  1.   /* USER CODE BEGIN 2 */
  2.         printf("This is a USART DMA Receive Test!!!\r\n");
  3.         /*        使能串口1 IDLE中断        */
  4.         __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
  5.         
  6.   /* USER CODE END 2 */
复制代码
while(1)循环
  1.   /* Infinite loop */
  2.   /* USER CODE BEGIN WHILE */
  3.   while (1)
  4.   {
  5.                 uartdamget();
  6.                
  7.   /* USER CODE END WHILE */
复制代码
串口DMA获取
  1. /* USER CODE BEGIN 4 */
  2. void uartdamget(void)
  3. {
  4.         if(recv_end_flag ==1)
  5.         {
  6.                 /*        打印接收到的数据长度 */
  7.                 printf("\nrx_len=%d\r\n",Rx_len);

  8.                 for(int i=0;i<Rx_len;i++)
  9.                 {
  10.                         /*        打印接收到的数据 */
  11.                                 printf("%c",ReceiveBuff[i]);
  12.                 }
  13.                 printf("\r\n");         
  14.                 /*        清空接收缓存区        */
  15.                 for(int i = 0; i < Rx_len ; i++)
  16.                         ReceiveBuff[i]=0;
  17.                 /*        接收数据长度清零        */
  18.                 Rx_len=0;
  19.                 recv_end_flag=0;
  20.         }
  21.         /*        开启下一次接收        */
  22.         HAL_UART_Receive_DMA(&huart1,(uint8_t*)ReceiveBuff,BUFFERSIZE);
  23. }
  24. /* USER CODE END 4 */
复制代码
#include "stm32f4xx_it.c"文件中断外部变量引用
  1. /* USER CODE BEGIN 0 */
  2. #define BUFFERSIZE 255
  3. extern uint8_t recv_end_flag,Rx_len,bootfirst;
  4. /* USER CODE END 0 */
复制代码
串口1中断函数
  1. /**
  2. * @brief This function handles USART1 global interrupt.
  3. */
  4. void USART1_IRQHandler(void)
  5. {
  6.   /* USER CODE BEGIN USART1_IRQn 0 */

  7.   /* USER CODE END USART1_IRQn 0 */
  8.   HAL_UART_IRQHandler(&huart1);
  9.   /* USER CODE BEGIN USART1_IRQn 1 */
  10.         uint32_t temp;
  11.         /*        如果是串口1中断        */
  12.         if(USART1 == huart1.Instance)
  13.         {        /* 如果是串口1IDLE中断        */
  14.                 if(RESET != __HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)){
  15.                         /*        清除中断标志        */
  16.                         __HAL_UART_CLEAR_IDLEFLAG(&huart1);
  17.                         /*        停止DMA接收        */
  18.                         HAL_UART_DMAStop(&huart1);
  19.                         /*        获取DMA当前还有多少未填充        */
  20.                         temp  = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
  21.                         /*        计算串口接收到的数据个数        */
  22.                         Rx_len =  BUFFERSIZE - temp;
  23.                         recv_end_flag = 1;
  24.                 }
  25.         }
  26.   /* USER CODE END USART1_IRQn 1 */
  27. }
复制代码
将程序下载到板子后,使用串口调试助手发送数据到MCU,
1.png
下面是源代码
USART DMA Receive.zip (578.77 KB, 下载次数: 926)

评分

参与人数 1ST金币 +2 收起 理由
kardel + 2 很给力!

查看全部评分

回复

使用道具 举报

  • TA的每日心情
    开心
    2018-2-6 09:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    1182

    主题

    4967

    帖子

    1

    蝴蝶豆

    论坛元老

    最后登录
    2020-3-17
    发表于 2017-5-15 15:34:57 | 显示全部楼层
    谢谢分享
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    蝴蝶豆

    初级会员

    最后登录
    2019-1-17
    发表于 2017-7-10 17:22:48 | 显示全部楼层
    亲 你的这个代码 上电  包头掉一个字节  第二次通信正常  是怎么回事
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    9

    帖子

    0

    蝴蝶豆

    初级会员

    最后登录
    2019-5-10
    发表于 2017-9-21 15:02:06 | 显示全部楼层
    6666666666666666666666666
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    9

    帖子

    0

    蝴蝶豆

    中级会员

    最后登录
    2020-11-24
    发表于 2017-11-20 19:03:46 | 显示全部楼层
    感谢 学习了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    5

    帖子

    0

    蝴蝶豆

    初级会员

    最后登录
    2023-9-28
    发表于 2018-3-9 10:31:29 | 显示全部楼层
    非常好用,已经参考这个结局了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    15

    帖子

    0

    蝴蝶豆

    初级会员

    最后登录
    2018-8-2
    发表于 2018-3-16 11:53:40 | 显示全部楼层
    好东西, 正需要, 谢谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    2

    帖子

    0

    蝴蝶豆

    新手上路

    最后登录
    2018-4-27
    发表于 2018-4-27 01:47:07 | 显示全部楼层
    Rx_len =  BUFFERSIZE - temp;
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    37

    主题

    2167

    帖子

    32

    蝴蝶豆

    论坛元老

    最后登录
    2023-2-9
    发表于 2018-4-27 07:30:45 | 显示全部楼层
    感谢分享
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    5

    帖子

    0

    蝴蝶豆

    新手上路

    最后登录
    2019-4-1
    发表于 2018-4-27 08:42:36 | 显示全部楼层
    很好的资料,以前用标准库做过,现在学习一下cube

    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

    GMT+8, 2024-4-27 06:40 , Processed in 0.192209 second(s), 43 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表