#申请原创# #技术资源# @21ic小管家
X035有4个USART,这个4个USART支持DMA
DMA的中断支持如下
USART支持如下中断
这里我使用发送完成(TC)中断+DMA实现发送
使用线路空闲(IDLE)中断+DMA传输过半中断和传输完中断实现不定长度数据的双缓冲接收
具体实现如下
涉及的外设有 RCC GPIO NVIC DMA UART
RCC初始化使能外设时钟 DMA GOIC UART等
NVIC初始化内配置外设中断优先级涉及到 UART DMA
GPIO初始化是配置UART的复用管脚
DMA初始化对 接收 发送通道进行了配置,这里发送通道因为只在发送时才知道有多少数据要传输,所有在初始化时配置的传输次数是0,即使通道使能,也不会进行发送传输。
接收通道用到了传输一半中断和传输完中断,所有要开启这两个中断,实现双缓冲也是依赖着两个中断来实现的。
UART初始化配了串口的基本参数和使能要用的中断
初始化完这些外设后,因为我们使能了发送完成(TC)中断线路空闲(IDLE)中断DMA传输过半中断和DMA传输完中断,我们看看在这些中断中都做了哪些处理
首先看看和发送相关的发送完成(TC)中断
发送完成(TC)中断内只进行了中断标志的清除操作,因为发送时由DMA实现搬运的,只要设置好要发送的内存地址和传输数量,DMA会根据每次发送数据寄存器空(TXE)
请求实现一次传输搬运,直到传输次数为0,因为以后一个字节发送完成前,DMA传输计数已经清零,所有会触发发送完成中断,所有只在发送完成中断内进行清楚中断标志即可。
我们再来看看和接收相关的DMA中断和线路空闲(IDLE),对于不定长度的数据接收,一共分为4种情况,分别为1接收数据长度小于DMA传输过半中断;2 接收数据长度等DMA传输过半中断;3 接收数据长度大于DMA传输过半中断,小DMA传输完长度;4 收数据长度等于DMA传输完长度
第一种情况,只会进入串口线路空闲(IDLE)中断
数据处理函数会将DMA接收到的数据拷贝至接收缓存区,然后进行数据处理。
第二种情况,会先进入DAM 传输过半中断,然后再进入线路空闲(IDLE)中断
在DMA数据处理函数内,会将接收到的数据进行拷贝处理
在串口线路空闲(IDLE)中断,内确认一帧数据接收完成,重置DMA接收计数后,进行数据解析处理
第三种情况会先进入DMA传输过半中断,然后再进入线路空闲(IDLE)中断,只不过在串口中断内会对大于传输过半中断之后的数据进行拷贝后,再进行数据处理
在DMA数据处理函数内,会将接收到的数据进行拷贝处理
在串口线路空闲(IDLE)中断,内确认一帧数据接收完成,拷贝大于传输过半中断的数据,重置DMA接收计数后,进行数据解析处理
第四种情况会先进入DMA传输过半中断,然后进入DMA 传输完中断,后面还分两种情况,一种是进入线路空闲(IDLE)中断,或再进入DMA 传输过半中断,这两种情况基本都意味着接收缓存区溢出了,所有合并为一类问题处理了,直接在DMA传输完中断内进行了重置DMA传输次数的处理。
在刚好传输完中断后,再进入线路空闲(IDLE)中断,进行了个特殊处理
上述方案实现了配置一次DMA接收传输,进行了2次中断处理,实现了双缓存效果,在尽量小的暂用CPU情况下,可以大大提高串口的效率,是一种比较高效的机制。
SPI_SD_IAP_BOOT.zip
(2.86 MB)
|