|
在嵌入式开发领域,USART外设可以说是被应用最广的片上外设。从最基础的作为调试输入输出口使用外,USART也常被用于各种功能模块的交互接口。例如市面上常见的串口屏,各种WiFi、蓝牙等无线模组等。
在使用USART作为通讯接口应用过程中,我们经常会使用USART口接收外部数据帧解析并做进一步的接收处理。在这个过程中,如果USART数据帧不是特别长,并且交互次数不是很频繁的情况下,我们可以通过串口接收中断一个字节一个字节地做接收处理(放到代码缓存中),在接收到一帧数据后,给个标志位并主程序中做解析处理。但是在实际的应用中,我们遇到的,更多的是需要接收不定长数据,并且频繁交互的情况。今天,我们要介绍的,就是如何使用USART+DMA去接收一帧不定长的数据。
USART+DMA接收不定长数据
DMA,直接存储器访问控制器。同USART一样,这也是一种片上硬件外设。它的主要功能是能在CPU不参与的前提下进行数据的传输。关于DMA的介绍可以直接阅读用户手册第十章《直接存储器访问控制器》,这里也不再进行赘述。
对于采用DMA方式实现USART数据接收的配置,在手册上也能找到相关的配置流程图
除了以上配置外,我们还需要思考两个问题:
这里我们介绍下USART中的IDLE线检测中断和DMA中的通道计数寄存器。
IDLE线检测中断
也叫空闲中断。在开始接收串口数据后,当检测总线上出现空闲的时候,USART状态寄存器上的IDLEF标志位会被置位,同时会产生中断。利用此中断,我们可以获知一帧不定长的数据的传输是否完成。
DMA通道计数寄存器
关于此寄存器,手册上说明如下
在进行DMA的相关配置时,我们可以预先往这个寄存器写一个足够大的数,而在接收完每一帧数据包后,我们可以在IDLE中断中再去读这个寄存器的值,前后读这个寄存器值相减,就可以得到接收的这一帧数据包的字节数。
综上所述,USART+DMA的接收处理流程如下: