工程师笔记 | 使用UART IDLE中断接收不定长数据

发布时间:2023-02-06  

前言

在串口通信过程中,我们常常用到接受和发送中断,相信大家都不陌生。这里还有另一个非常有用的中断可能被大家所忽略,即总线空闲状态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的实验结果。


小结

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


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    DPL”两条指令取代其做用不就可以达到同样的推出地址的效果么?这样可以解决由于只有进堆栈指令(硬件自动生成)没有出堆栈所导致的堆栈溢出错误,但是并不能解决文章开始所提到的“进不了中断”问题。这让......
    应用中,只要不是特殊情况,比如测试某个功能可以添加延时函数,都不建议在中断函数添加延时函数。 2、ORE上溢错误 ORE上溢错误是什么意思呢? 可能很多人不了解,简单说就是:UART接收到有数据,没有......
    接收到有数据,没有去取,但又来了数据,此时就会产生ORE上溢错误。(请看“参考手册”) 其实,上面这种长时间在占用中断,就会导致UART接收数据上溢。 很多人没有在意这个,如果是使能了中断接收,标志......
    基于LL库实现STM32U5 LPTIM功能;有人打算使用STM32U5系列片内LPTIM做低功耗模式唤醒。基于STM32 LL库组织代码,折腾几天后似乎连中断都进不了,想找找是否有现存LL库例......
    理解是不对的,应该是数据后有空闲了一帧就会触发。 3.清中断的方式感觉奇怪,使用函数USART_ClearITPendingBit( USART1, USART_IT_IDLE )清除不了中断的。我用......
    响应,而只是执行那句清零报警标志然后退出循环体。由于中断响应已经关闭,不管外部怎么报警都不会得到响应,报警标志也就永远不会被置1,这样主循环体也进不了内循环来开启中断响应。 如果有了第2句......
    GPIO管脚做中断,我这边就是进不了中断”。 然后他把基于标准外设库、寄存器写的代码都给我发过来了。我仔细看了又看,没发现有什么毛病啊。(但是,代码是截图分来给我发过来的)。 于是,我将之前配置IO外部中断......
    吗,就是GPIO管脚做中断,我这边就是进不了中断”。 然后他把基于标准外设库、寄存器写的代码都给我发过来了。我仔细看了又看,没发现有什么毛病啊。(但是,代码是截图分来给我发过来的)。 于是,我将......
    =spi_Rec_buf.tail= 0;   (5)内核机制相关的数据结构初始化。本设计所使用的内核机制包括了中断上下半部的操作和睡眠等待机制,因此需要对发送、接收等待队列以及tasklet结构......
    无法触发。请确保正确配置了中断优先级,并确保串口接收中断的优先级高于其他中断。 3. 接收缓冲区溢出:如果接收缓冲区溢出,可能会导致串口接收中断无法触发。确保在接收中断处理函数中及时读取接收......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>