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

stm32串口DMA空闲中断接收不定长数据

[复制链接]
STMCU小助手 发布时间:2023-1-8 12:00
串口数据的接收可以用三种方式:

1、阻塞方式(接收数据很少用到)

2、中断方式(用的比较多,但是在接收不定长协议数据时候,逻辑判断较复杂)

3、DMA IDLE方式(常用做接收不定长数据)

用cubemx配置下串口驱动如下

5f4834cdd1d048478b116a1e73f0865d.png

0ed858769ddd4027924597d212fb7555.png

0cda97d07ed045e586c6c85c856417ff.png

9de17471c88e46c4b053104db539a82c.png

接收数据用到的结构体
  1. #define uart_buf_size    256
  2. typedef union{
  3.         struct{
  4.                 uint8_t buf[uart_buf_size];
  5.                 uint8_t timeout;
  6.                 uint16_t len;
  7.         }bf;
  8.         uint8_t data[uart_buf_size+3];
  9. }uart_struct_t;
复制代码

使能串口空闲中断

99c0dedd3bb4410aa17e33ee6ebcf212.png

  1. __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
  2. HAL_UART_Receive_DMA(&huart1,(uint8_t *)&uart_info.bf.buf[0],uart_buf_size);
  3. __HAL_UART_CLEAR_IDLEFLAG(&huart1);
复制代码

重定义printf需要在头文件中加入stdio.h,同时也添加下string.h好使用memxxx函数
  1. int fputc(int ch, FILE *f)
  2. {
  3.         while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC) != SET);
  4.         HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,100);
  5.         return ch;
  6. }
复制代码

中断中进行数据的处理
  1. void USART1_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN USART1_IRQn 0 */
  4.         if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) == SET)
  5.         {
  6.                 __HAL_UART_CLEAR_IDLEFLAG(&huart1);
  7.                 HAL_UART_DMAStop(&huart1);
  8.                 if(uart_info.bf.timeout == 0)
  9.                 {
  10.                         uart_info.bf.timeout = 1;
  11.                         uart_info.bf.len = uart_buf_size - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
  12.                         
  13.                         HAL_UART_Transmit(&huart1,(uint8_t *)&uart_info.bf.buf[0],uart_info.bf.len,100);
  14.                 }
  15.                 uart_info.bf.timeout = 0;
  16.                 memset(uart_info.bf.buf,0,uart_buf_size);
  17.                 HAL_UART_Receive_DMA(&huart1,(uint8_t *)&uart_info.bf.buf[0],uart_buf_size);
  18.         }
  19.   /* USER CODE END USART1_IRQn 0 */
  20.   HAL_UART_IRQHandler(&huart1);
  21.   /* USER CODE BEGIN USART1_IRQn 1 */

  22.   /* USER CODE END USART1_IRQn 1 */

复制代码

以上代码是将接收到的数据原样返回
————————————————
版权声明:jiangxinzhumeng

收藏 评论0 发布时间:2023-1-8 12:00

举报

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