[单片机芯片] 【CH32X035评估板测评】+4 USART+DMA实现双缓存高效收发

[复制链接]
 楼主| 6552918 发表于 2023-10-15 21:54 | 显示全部楼层 |阅读模式
#申请原创# #技术资源# @21ic小管家

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

tpgf 发表于 2024-4-7 14:53 | 显示全部楼层
缓存时如何建立起来的呢  大小可以随时调整吗
 楼主| 6552918 发表于 2024-4-7 14:56 | 显示全部楼层
tpgf 发表于 2024-4-7 14:53
缓存时如何建立起来的呢  大小可以随时调整吗

可以
wakayi 发表于 2024-4-7 15:37 | 显示全部楼层
是不是所有的额模块都会支持dma呢
 楼主| 6552918 发表于 2024-4-7 16:38 | 显示全部楼层
wakayi 发表于 2024-4-7 15:37
是不是所有的额模块都会支持dma呢

基本都支持
wowu 发表于 2024-4-7 20:38 | 显示全部楼层
一帧数据最多有多少个字节啊
renzheshengui 发表于 2024-4-7 21:12 | 显示全部楼层
4串口同时工作的话 每个串口都是dma的方式吗
paotangsan 发表于 2024-4-7 21:46 | 显示全部楼层
在什么情况下需要使用双缓存接收机制呢
keaibukelian 发表于 2024-4-7 22:20 | 显示全部楼层
双缓存在普通模式下也可以实现吧
黑心单片机 发表于 2024-4-10 13:56 | 显示全部楼层
DMA+双缓存太好用了
 楼主| 6552918 发表于 2024-4-10 13:59 | 显示全部楼层

是的,就是占内存多点
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:北京汇冠触摸技术有限公司/电子工程师
简介:电子工程师,嵌入式应用爱好者。

102

主题

1290

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部