打印
[单片机芯片]

【CH32X035评估板测评】+4 USART+DMA实现双缓存高效收发

[复制链接]
4753|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创# #技术资源# @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)

使用特权

评论回复
沙发
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呢

使用特权

评论回复
5
6552918|  楼主 | 2024-4-7 16:38 | 只看该作者
wakayi 发表于 2024-4-7 15:37
是不是所有的额模块都会支持dma呢

基本都支持

使用特权

评论回复
6
wowu| | 2024-4-7 20:38 | 只看该作者
一帧数据最多有多少个字节啊

使用特权

评论回复
7
renzheshengui| | 2024-4-7 21:12 | 只看该作者
4串口同时工作的话 每个串口都是dma的方式吗

使用特权

评论回复
8
paotangsan| | 2024-4-7 21:46 | 只看该作者
在什么情况下需要使用双缓存接收机制呢

使用特权

评论回复
9
keaibukelian| | 2024-4-7 22:20 | 只看该作者
双缓存在普通模式下也可以实现吧

使用特权

评论回复
10
黑心单片机| | 2024-4-10 13:56 | 只看该作者
DMA+双缓存太好用了

使用特权

评论回复
11
6552918|  楼主 | 2024-4-10 13:59 | 只看该作者

是的,就是占内存多点

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

102

主题

1251

帖子

9

粉丝