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

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

[复制链接]
eefishing 发布时间:2019-10-2 11:53
前言
在串口通信应用中,我们常使用接受和发送中断,相信大家都不陌生。这里有个非常有用的中断可能被大家所忽略,即总线IDLE中断。当一帧数据传输结束之后,总线会维持高电平状态,此时,就可以触发MCU的IDLE中断。在本文中,将介绍使用该中断来进行不定长串口数据接收的办法。通过该中断,可以省却很多用于检测数据传输是否完成的判断动作。
实验环境
  • STM32F411RE-NUCLEO
  • STM32CubeMX


总线状态分析
下图是发送0xAA 0x55的所抓取到的波形。从图中我们可以看到在发送该帧之前和之后,数据线处于IDLE的状态。在该帧中,字节与字节之间,没有IDLE状态出现,即不会出现IDLE误触发的情况。
1.jpg
不定长数据接收
本次制作的工程是基于HAL库。在原生的HAL库中,并没有集成IDLE中断的处理。所以,在本文我们介绍的方法中,需要修改一些库文件来实现。

使用STM32CubeMX生成实验工程
工程的配置如下图:
1.系统始终配置为100MHz
2.配置USART2为Asynchrones,管脚配置为PA2,PA3。
3.USART2参数:9600Bits/s, 8bits, None, 1Stop
2.jpg

3.jpg
为了方便打印接收到的相关信息,需要对生成的工程做如下修改来映射print函数。
main.c-声明
4.jpg
main.c-Code
5.jpg
修改工程代码
增加接收Buffer
main.c
6.jpg
stm32f4xx_hal_uart.c
7.jpg
在接收函数中使能IDLE中断
stm32f4xx_hal_uart.c  HAL_UART_Receive_DMA()函数
8.jpg
处理IDLE中断
stm32f4xx_hal_uart.c  HAL_UART_IRQHandler ()函数
9.jpg
接收完成处理(IDLE产生,一帧数据传输完成)
stm32f4xx_hal_uart.c  HAL_UART_AbortReceive_IT ()函数
11.jpg
main.c
12.jpg
使能接收
main.c
13.jpg
实验结果
使用串口调试串口,通过STLINK的虚拟串口发送数据,MCU会返回接收多少个字节的数据,并将接收到的数据打印出来。下图是发送0xAA 0x55的实验结果。
14.jpg

小结
IDLE作为指示总线空闲状态的中断,合理的使用能够很大程度的节省代码程序设计工作量。这里只是做个简单示范,抛砖引玉,实际应用中希望大家可以灵活使用满足所需。


收藏 评论0 发布时间:2019-10-2 11:53

举报

0个回答

所属标签

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