1.概述
本篇文章主要介绍利用STM32的串口空闲中断和DMA来进行变帧长数据接收。
2. 空闲中断介绍
STM32串口空闲中断是指STM32的串口由数据接收状态转入空闲状态时产生的一个中断。在某些处理器(AT91系列的ARM9)中,该中断也被称为超时中断,并且超时的时间是可以设置的。但是在STM32这个超时的时间是不能设置。
空闲中断对于数据的接收是有十分重要的意义。例如在一些时序控制保证得比较好的场景,它可以用来作为一帧数据接收完成的标志。这样相对于DMA 接收满中断,可以更方便地去获取一帧完整的数据,并且减小MCU中断的次数。
当串口产生出现空闲时,串口的状态寄存器(USART_SR)中的IDLE位会由硬件置1。

这里要注意的是该标志位如果清零的话,需要通过软件读取USART_SR和USART_DR两个寄存器中的数据。


串口的控制寄存器1(USART_CR1),将BIT4 IDLEIE位置1使能中断,则如果USART_SR中的IDLE=1时,系统将产生一个空闲中断。
3. 空闲中断接收串口数据
利用串口的DMA功能和空闲中断功能,可以对不等长的数据进行接收,流程如下:

初始化时,将DMA的CNDTR寄存器的长度设置为LEN,LEN的长度要大于接收最长帧的长度。利用CNDTR接收到一个数据减1的原理,当空间中断发生时,LEN-CNDTR就可以得到当时接收到的数据长度了。
代码如下:
// UART1_RxDMA 初始化
void UART1_RxDMA_Init

1万+

被折叠的 条评论
为什么被折叠?



