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

【经验分享】STM32CubeMX配置小记录——F7串口DMA收发

[复制链接]
STMCU小助手 发布时间:2021-12-12 21:44

之前没有写调试记录的习惯,导致前段时间刚弄过的一个东西,现在拿起来要么翻之前的代码,要么就再慢慢调,虽然知道自己肯定是可以战胜困难,但总是浪费很多时间,所以以后准备多写一些记录,方便自己用的时候查。嘻嘻

STM32CubeMX这个工具用习惯了还是很爽的,就是有些傻逼的地方是,他并不能给你弄到位,有的东西还是得自己调一下。

打开串口并使能中断后,如果要开启DMA收发的功能,只需要使能对应的通道就可以了。

生成代码的过程就不废话了。

在串口初始化里面调用这个函数来定义串口中断接受长度。

HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, 1);

不要忘记在中断函数里面再次调用。

一个完整的发送周期如下,清除完成标志也可以放在下次发送的开始。

  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  2. {
  3.     static uint8_t sta = 0;
  4.     if(huart->Instance==USART1)//Èç¹ûÊÇ´®¿Ú1
  5.     {
  6. //        USART_RX1_BUF[Usart1_len]=aRx1Buffer[0];
  7. //        Usart1_len++;
  8. //        if(Usart1_len == 0x04)                             
  9. //    {
  10.         HAL_UART_Transmit_DMA(&huart1,(uint8_t*)aRx1Buffer,USART_RX1_LEN);
  11.         while(1)
  12.             {
  13.                 if(__HAL_DMA_GET_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
  14.                 {
  15.                     __HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
  16.                     HAL_UART_DMAStop(&huart1);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
  17.                     break;
  18.                 }
  19.                             //    __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);
  20.                             }
  21.         switch(sta)
  22.         {
  23.             case 0:if(aRx1Buffer[0] == 0x55) sta = 1;break;
  24.             case 1:if(aRx1Buffer[0] == 0xaa) mode = 1,sta = 2;else sta = 0;break;
  25.             case 2:mode = 0;sta = 0;break;
  26.         }        
  27.         HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, RX1BUFFERSIZE);   
  28. //        }            
  29.     }
  30.     if(huart->Instance==USART2)//Èç¹ûÊÇ´®¿Ú2
  31.     {
  32.         HAL_UART_Transmit_DMA(&huart2,(uint8_t*)aRx2Buffer,USART_RX2_LEN);
  33.         while(1)
  34.             {
  35.                 if(__HAL_DMA_GET_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
  36.                 {
  37.                     __HAL_DMA_CLEAR_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
  38.                     HAL_UART_DMAStop(&huart2);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
  39.                     break;
  40.                 }
  41.                             //    __HAL_DMA_GET_COUNTER(&hdma_usart2_tx);
  42.                             }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý
  43.         while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø
  44.         HAL_UART_Receive_IT(&huart2, (uint8_t *)aRx2Buffer, RX2BUFFERSIZE);   
  45.     }
  46.     if(huart->Instance==USART3)//Èç¹ûÊÇ´®¿Ú3
  47.     {
  48.         HAL_UART_Transmit_DMA(&huart3,(uint8_t*)aRx3Buffer,USART_RX3_LEN);
  49.         while(1)
  50.             {
  51.                 if(__HAL_DMA_GET_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
  52.                 {
  53.                     __HAL_DMA_CLEAR_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
  54.                     HAL_UART_DMAStop(&huart3);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
  55.                     break;
  56.                 }
  57.                             //    __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);
  58.                             }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý
  59.         while(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø
  60.         HAL_UART_Receive_IT(&huart3, (uint8_t *)aRx3Buffer, RX3BUFFERSIZE);   
  61.     }
  62.     if(huart->Instance==UART4)//Èç¹ûÊÇ´®¿Ú4
  63.     {
  64.         HAL_UART_Transmit_DMA(&huart4,(uint8_t*)aRx4Buffer,USART_RX4_LEN);
  65.         while(1)
  66.             {
  67.                 if(__HAL_DMA_GET_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
  68.                 {
  69.                     __HAL_DMA_CLEAR_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
  70.                     HAL_UART_DMAStop(&huart4);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
  71.                     break;
  72.                 }
  73.                             //    __HAL_DMA_GET_COUNTER(&hdma_uart4_tx);
  74.                             }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý
  75.         while(__HAL_UART_GET_FLAG(&huart4,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø
  76.         HAL_UART_Receive_IT(&huart4, (uint8_t *)aRx4Buffer, RX4BUFFERSIZE);   
  77.     }
  78. }
复制代码
这个我是放在中断里实现串口自收自发的。
  1. void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
  2. 2 {
  3. 3         uint32_t isrflags   = READ_REG(huart->Instance->ISR);//?????,???????SR
  4. 4         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_PE))!=RESET)
  5. 5         {
  6. 6                         READ_REG(huart->Instance->RDR);//PE???,????DR
  7. 7                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF);//???
  8. 8         }
  9. 9         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_FE))!=RESET)
  10. 10         {
  11. 11                         READ_REG(huart->Instance->RDR);//FE???,????DR
  12. 12                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF);
  13. 13         }
  14. 14         
  15. 15         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))!=RESET)
  16. 16         {
  17. 17                         READ_REG(huart->Instance->RDR);//NE???,????DR
  18. 18                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF);
  19. 19         }        
  20. 20         
  21. 21         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE))!=RESET)
  22. 22         {
  23. 23                         READ_REG(huart->Instance->RDR);//ORE???,????CR
  24. 24                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
  25. 25         }        
  26. 26 }
复制代码




收藏 评论0 发布时间:2021-12-12 21:44

举报

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