使用UART IDLE中断接收不定长数据

电子说

1.3w人已加入

描述

 

前言

在串口通信过程中,我们常常用到接受和发送中断,相信大家都不陌生。这里还有另一个非常有用的中断可能被大家所忽略,即总线空闲状态IDLE中断。当一帧数据传输结束之后,总线会维持高电平空闲,此时会触发MCU的IDLE中断。在本文中,将介绍使用该中断来进行不定长串口数据接收的办法。通过该中断,可以省却用于检测数据传输是否完成的判断操作。

实验环境

· STM32F411RE-NUCLEO

· STM32CubeMX

总线状态分析

下图是发送0xAA 0x55的所抓取到的波形。从图中我们可以看到在发送该帧之前和之后,总线时钟处于IDLE状态。在该帧中,字节与字节之间,没有IDLE状态出现,即不会出现IDLE误触发的情况。

参数

不定长数据接收

本次制作的工程是基于HAL库的。在原生的HAL库中,并没有集成IDLE中断的处理。所以,在本文我们介绍的方法中,需要修改一些库文件来实现。

使用 STM32CubeMX 生成实验工程

工程的配置如下图:

1. 系统始终配置为100MHz

2. 配置USART2为Asynchrones,管脚配置为PA2,PA3。

3. USART2参数:9600Bits/s, 8bits, None,1Stop

参数

 

参数

 

参数

为了方便打印接收到的相关信息,需要对生成的工程做如下修改来映射print函数。

main.c-声明

参数

main.c-Code

参数

修改工程代码

增加接收Buffer

main.c

参数

stm32f4xx_hal_uart.c

参数

在接收函数中使能IDLE中断

stm32f4xx_hal_uart.c -> HAL_UART_Receive_DMA()函数

参数

处理IDLE中断

stm32f4xx_hal_uart.c -> HAL_UART_IRQHandler ()函数

参数

接收完成处理(IDLE产生,一帧数据传输完成)

stm32f4xx_hal_uart.c -> HAL_UART_AbortReceive_IT ()函数

参数

main.c

参数

使能接收

main.c

参数

实验结果

使用串口调试,通过STLINK的虚拟串口发送数据,MCU会返回接收多少个字节的数据,并将接收到的数据打印出来。下图是发送0xAA 0x55的实验结果。

参数

小结

合理使用串口总线空闲状态中断,在接收那些数据量不确定的场合会非常方便,同时也能很好地优化代码设计。

        审核编辑:彭菁

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分