良许Linux教程网 干货合集 STM32串口空闲中断接收不定长数据(DMA方式)

STM32串口空闲中断接收不定长数据(DMA方式)

在使用STM32的串口接收数据时,通常会利用接收中断来实现数据的接收。其中,常用的接收中断标志是RXNE。然而,在本文中,我将分享另一种接收数据的方式——利用IDLE中断(需要说明的是,本文的示例基于STM32F103ZET6微控制器)。

一、IDLE中断的发生时机是什么?

IDLE中断在串口接收到一帧数据后触发。什么是一帧数据呢?例如,单片机一次发送1个字节或者8个字节的数据,这些数据一次发送过来的,就被称为一帧数据,也可以称为一包数据。

二、RXNE中断和IDLE中断有什么区别?

当接收到1个字节时,会触发RXNE中断;当接收到一帧数据时,会触发IDLE中断。例如,如果单片机一次性发送了8个字节的数据,将触发8次RXNE中断和1次IDLE中断。

三、如何配置IDLE中断?

要配置IDLE中断,需要按照以下步骤进行操作:

  1. 初始化串口及对应的GPIO引脚。
  2. 配置串口的波特率、数据位、停止位等参数。
  3. 使能串口的接收中断(包括RXNE中断和IDLE中断)。
  4. 实现中断服务函数,在其中处理接收到的数据。

通过以上步骤,可以成功配置IDLE中断,并实现串口数据的接收功能。需要注意的是,在处理中断服务函数时,应注意数据的处理顺序和精确性,以确保接收到的数据能够正确处理。

希望以上内容能对您有所帮助!如有其他问题,请随时提问。

IDLE中断由USART_CR1 寄存器进行配置:

image-20230922122324315
image-20230922122324315

对于STM32F103ZET6来说,配置USART_CR1寄存器bit5为1则打开RXNE中断,配置USART_CR1寄存器bit4为1则打开IDLE中断。

image-20230922122339758
image-20230922122339758

这是状态寄存器,当串口接收到一个字节数据时,bit5就会自动变成1,当接收完一帧数据后,bit4就会变成1.

需要注意的是,在中断函数里面,需要把对应的位清0,否则会影响下一次数据的接收。

对于RXNE中断,对USART_DR的读操作可以将该位清零:

image-20230922122344993
image-20230922122344993

对于IDLE中断,由软件序列清除该位(先读USART_SR,然后读USART_DR):

image-20230922122349903
image-20230922122349903

四、USART+DMA+IDLE接收不定长数据例程

1、USART初始化

image-20230922122354189
image-20230922122354189

2、中断服务函数

image-20230922122359164
image-20230922122359164

3、主函数

image-20230922122402758
image-20230922122402758

4、运行结果

image-20230922122406090
image-20230922122406090

五、最后

1、参考资料

(1)http://www.armbbs.cn/forum.php?mod=viewthread&tid=94751&extra=page%3D1
(2)http://www.51hei.com/bbs/dpj-39885-1.html
(3)https://www.cnblogs.com/einstein-2014731/p/5768083.html

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部