STMCU小助手
发布时间:2022-2-15 22:07
|
前言 在串口通信应用中,我们常使用接受和发送中断,相信大家都不陌生。这里有个非常有用的中断可能被大家所忽略,即总线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_IRQHandler ()函数
接收完成处理(IDLE 产生,一帧数据传输完成) stm32f4xx_hal_uart.c -> HAL_UART_AbortReceive_IT ()函数
main.c
使能接收 main.c
实验结果 使用串口调试串口,通过 STLINK 的虚拟串口发送数据,MCU 会返回接收多少个字节的数据,并将接收到的数据打印出来。 下图是发送 0xAA 0x55 的实验结果。
小结 IDLE 作为指示总线空闲状态的中断,合理的使用能够很大程度的节省代码程序设计工作量。这里只是做个简单示范,抛砖引 玉,实际应用中希望大家可以灵活使用满足所需。 |
经验分享 | USART接收的数据怎么错位啦?
经验分享 | 基于STM32H7 UART 空闲事件及DMA传输示例
经验分享 | STM32G4 UART+TIMER+DMA应用示例
经验分享 | STM32H563 UART+DMA 2D功能演示
经验分享 | 基于STM32H563演示UART+DMA功能
【STM32U3评测】实现双通道串口通信系统
STM32G系列RS485自动收发控制以及自适应波特率实战
【STM32H7S78-DK评测】CoreMark移植和优化--兼记printf重定向实现方法及常见问题
【STM32MP135-DK】裸机移植shell
NUCLEO-U545RE-Q评测】3. 串口基本收发测试
微信公众号
手机版