前言 在串口通信过程中,我们常常用到接受和发送中断,相信大家都不陌生。这里还有另一个非常有用的中断可能被大家所忽略,即总线空闲状态 IDLE 中断。当一帧数据传输结束之后,总线会维持高电平空闲,此时会触发 MCU 的 IDLE中断。在本文中,将介绍使用该中断来进行不定长串口数据接收的办法。通过该中断,可以省却用于检测数据传输是否完成的判断操作。 实验环境 •STM32F411RE-NUCLEO% D; W2 v) {0 w: C- |' ?# J •STM32CubeMX4 w8 O8 t- m8 k- i- F. R/ s8 f9 ^ + e& X: p2 X y1 `0 e3 T7 q 总线状态分析 ( q" \% V+ b& n 下图是发送 0xAA 0x55 的所抓取到的波形。从图中我们可以看到在发送该帧之前和之后,总线时钟处于 IDLE 状态。 在该帧中,字节与字节之间,没有 IDLE 状态出现,即不会出现 IDLE 误触发的情况。 + C) I: Y+ c+ }- F$ { & n% q$ @ B7 f2 L+ {' c0 [7 M0 @+ T+ V; ^6 F 不定长数据接收 本次制作的工程是基于 HAL 库的。在原生的 HAL 库中,并没有集成 IDLE 中断的处理。所以,在本文我们介绍的方法中,需要修改一些库文件来实现。: j* D( v% M8 j( A8 ~1 Q 1 v6 D6 s- T3 ], I: u3 l% I7 O 使用 STM32CubeMX 生成实验工程' o& N/ V. _, e: P2 i! Q 工程的配置如下图: 1. 系统始终配置为 100MHz) X/ D: I8 `: P2 |1 R 2. 配置 USART2 为 Asynchrones,管脚配置为 PA2,PA3。 3. USART2 参数:9600Bits/s, 8bits, None,1Stop - L6 B( `! Y0 p' u- j 0 h' F6 l6 W5 O0 r9 z. R! i 为了方便打印接收到的相关信息,需要对生成的工程做如下修改来映射 print 函数。 main.c-声明
完整版请查看:附件 2 W0 L$ ~ o0 ~ |
LAT0534_UART_IDLE中断使用_接收不定长串口数据.pdf
下载427.31 KB, 下载次数: 10
【STM32MP135-DK】裸机移植shell
NUCLEO-U545RE-Q评测】3. 串口基本收发测试
NUCLEO-U545RE-Q评测】4. 串口实用收发测试
基于STM32模拟UART串口通信
【STM32H503评测】+ coremark跑分移植测试
基于STM32H563演示UART+DMA经验分享
STM32的通用同步异步收发器USART模块
STMCube UART与ADC配置
STM32™ 自举程序中使用的 USART 协议
开启Cache后UART无法发送新数据