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

STM32F0串口UART+DMA不定长数据空闲中断与溢出重置

[复制链接]
289466080 发布时间:2019-5-17 14:06
本帖最后由 289466080 于 2019-5-23 14:34 编辑

  最近调试一个串口通讯刚开始固定接收8字节没问题,实际应用时偶尔会接收16字节不规律,后来网上找不定长接收,(因只会用cube配置的所以很多方式都行不通只有DMA+IDLE可行)但是问题有来了如果接收超过设定最大值也无法再正常接收,后来再当产生闲时中断时定时器计时超过10ms重置DMA。下面是我配置的配置
   超过最大值10ms重置,实测20ms间隔发送接收正常STM32F030。

1.cube配置图
debug

debug

debug

tim1
02.PNG
uart1
03.PNG
时钟
04.PNG
uart1
05.PNG
uart1
06.PNG
uart1
07.PNG
tim1
08.PNG
tim1
09.PNG
2.main.h 添加串口接收最大值
  1. /* USER CODE BEGIN Private defines */
  2. typedef unsigned char        u8;
  3. typedef unsigned short  int u16;
  4. typedef unsigned long       u32;
  5. #define RECEIVELEN 16
  6. /* USER CODE END Private defines */
复制代码
3.1 main.c添加
  1. /* USER CODE BEGIN Includes */
  2. #include "string.h"
  3. /* USER CODE END Includes */

  4. /* Private variables ---------------------------------------------------------*/

  5. /* USER CODE BEGIN PV */
  6. /* Private variables ---------------------------------------------------------*/
  7. //uatr1
  8. u8  uart1_Rx_flag;            //接收空閒標誌位
  9. u8  uart1_Rx_Err;             //接收異常標誌位
  10. u8  uart1_Rx_Tem;             //接收異常計時重置接收
  11. u8  uart1_RxBuff[RECEIVELEN]; //接收缓冲
  12. u16 uart1_Rx_Len;             //接收长度
  13. /* USER CODE END PV */
复制代码
3.2 main.c添加
  1.   /* USER CODE BEGIN 2 */
  2. //tim1
  3.   HAL_TIM_Base_Start_IT(&htim1);              //启用TIM1并使能其中断
  4. //uart1
  5.   HAL_UART_Receive_DMA(&huart1, uart1_RxBuff, RECEIVELEN);
  6.   __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
  7.   /* USER CODE END 2 */
复制代码
3.3 main.c添加接收处理
  1.   /* USER CODE BEGIN 3 */
  2.     if(uart1_Rx_flag==1)
  3.     {
  4.       uart1_Rx_flag = 0;
  5.       uart1_Rx_Err  = 1;
  6.       if(uart1_RxBuff[0] == 0 && uart1_RxBuff[1] == 1)
  7.       {
  8.         uart1_Rx_Err  = 0;
  9.         uart1_Rx_Tem  = 0;
  10.         
  11.         HAL_UART_Transmit(&huart1, (uint8_t *)&uart1_RxBuff, uart1_Rx_Len,0xFFFF);
  12.         memset(uart1_RxBuff,0x00,sizeof(uart1_RxBuff));                            //清空数组
  13.       }
  14.     }
  15.   }
  16.   /* USER CODE END 3 */
复制代码
3.4 main.c添加溢出DMA重置
  1. /* USER CODE BEGIN 4 */
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  3. {
  4.   if (htim->Instance == htim1.Instance)
  5.   {
  6.     if(uart1_Rx_Err==1)
  7.     {
  8.       if(uart1_Rx_Tem++ >=10)
  9.       {
  10.         uart1_Rx_Tem    = 0;
  11.         uart1_Rx_Err    = 0;
  12.         __HAL_UART_CLEAR_IDLEFLAG(&huart1);
  13.         HAL_UART_DMAStop(&huart1);
  14.         HAL_UART_Receive_DMA(&huart1,uart1_RxBuff,RECEIVELEN);
  15.       }
  16.     }
  17.   }
  18. }
  19. /* USER CODE END 4 */
复制代码
4.1 stm32f0xx_it.c添加
  1. /* USER CODE BEGIN 0 */
  2. extern  u8  uart1_Rx_flag;            //接收空閒標誌位
  3. extern  u8  uart1_RxBuff[RECEIVELEN]; //接收缓冲
  4. extern  u16 uart1_Rx_Len;             //接收长度
  5. /* USER CODE END 0 */
复制代码
4.2 stm32f0xx_it.c添加
  1. void USART1_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN USART1_IRQn 0 */
  4.   uint32_t temp;
  5.   if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) != RESET))
  6.   {
  7.     uart1_Rx_flag = 1;
  8.     __HAL_UART_CLEAR_IDLEFLAG(&huart1);
  9.     HAL_UART_DMAStop(&huart1);
  10.     temp = huart1.hdmarx->Instance->CNDTR;
  11.     uart1_Rx_Len  = RECEIVELEN - temp;
  12.     HAL_UART_Receive_DMA(&huart1,uart1_RxBuff,RECEIVELEN);
  13.   }
  14.   /* USER CODE END USART1_IRQn 0 */
  15.   HAL_UART_IRQHandler(&huart1);
  16.   /* USER CODE BEGIN USART1_IRQn 1 */

  17.   /* USER CODE END USART1_IRQn 1 */
  18. }
复制代码



测试代码 UATR.rar (832.17 KB, 下载次数: 46)
收藏 1 评论0 发布时间:2019-5-17 14:06

举报

0个回答

所属标签

相似分享

官网相关资源

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