你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
yygkqzh 发布时间:2017-5-3 23:25
本帖最后由 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, 下载次数: 887)

评分

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

查看全部评分

收藏 8 评论24 发布时间:2017-5-3 23:25

举报

24个回答
zero99 回答时间:2017-5-15 15:34:57
谢谢分享
假装微风 回答时间:2017-7-10 17:22:48
亲 你的这个代码 上电  包头掉一个字节  第二次通信正常  是怎么回事
luocheng1234 回答时间:2017-9-21 15:02:06
6666666666666666666666666
耘灬耔 回答时间:2017-11-20 19:03:46
感谢 学习了
kardel 回答时间:2018-3-9 10:31:29
非常好用,已经参考这个结局了
lifengliu1 回答时间:2018-3-16 11:53:40
好东西, 正需要, 谢谢了
Ziv.Lin 回答时间:2018-4-27 01:47:07
Rx_len =  BUFFERSIZE - temp;
andeyqi 回答时间:2018-4-27 07:30:45
感谢分享
_瞬_ 回答时间:2018-4-27 08:42:36
很好的资料,以前用标准库做过,现在学习一下cube

123下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版