[学习资料] 【凌鸥创芯电机开发板LKS32MC071CBT8评测报告】4 DMA例程问题UART库BUG和UART+DMA实现双缓冲高...

[复制链接]
 楼主| 6552918 发表于 2023-7-30 21:36 | 显示全部楼层 |阅读模式
<
本帖最后由 6552918 于 2023-7-30 22:04 编辑

#申请原创# #技术资源#[url=home.php?mod=space&uid=760190]@21小跑堂 [/url]
原厂例程包里的DMA例程是有错误的,编译提示有个符号是未定义的
f18c43d1006cfc0ca9ed3b4cc4871a64
按规格书描述修改定义如下后可以编译通过
0fb51b4437ea820e87d0bafc7ebefd47
手动为添加3个DMA请求的定义
f4555b4c5924f325cf28a71907e93615
使能DMA发送完请求
1ffe2d47a37c034ce39e6642a17589e4
修改完上述设置,可以在串口助手内看到DMA的发送数据了
8256f735b7bbe1650b7f8cbd446ef089
虽然功能已经实现,但不具有实际使用意义,我给大家带来具有实际意义的UART+DMA实现双缓冲的使用。
在实现的过程总过程中发现一处笔误
b6b9790b8fdfbe8807c3e42c984e554d
还发现一处严重BUG,配置时使能了空闲中断但空闲中断无法被使能
28bf0d093fd20f93bb36429265d35db7
经过分析发现问题原因是,中断使能寄存器配置配置结构体中IRQEna长度为1个字节
c84e089b4995389d6f98c12e0bc4e3dd
但实际这个寄存器的大小超过了一个字节,导致初始化时bit8丢失,所以,空闲中断无法被使能
54d27bd5d451dabb19cdc82de3dc5e10
需要将IRQEna改为uint16_t才行
6a0bfa2e45b30e924e82923e07307e5d
接下来看看UART+DMA实现高效收发是如何实现的吧
本例程实现功能如下:
1实现UART0和UART1使用DMA发送数据
2实现UART0和UART1使用DMA接收不定长度数据
3实现UART0和UART1使用DMA接收数据的双缓冲方式
初始化需要实现DMA GPIO UART NVIC等的初始化。先关具体实现都在UART_DMA.c和UART_DMA.h文件内。
a4146d010e9c6db316b4ab6e4743f2c8
DMA初始化配置
UART0 TX使用DMA通道0,UART0 RX使用DMA通道1;
UART1 TX使用DMA通道2,UART0 RX使用DMA通道3;
发送通道在发送数据时才能使能,因此在初始化时是不使能的,这里需要注意一下。
1aef2ef54ae6d324322ba2cb542965cd
3382af045ea64123a36883a0644ccccd
GPIO初始化配置
UART0_RXD  P0.15;UART0_TXD  P1.0
UART1_RXD  P2.8;UART1_TXD  P3.9
0a47093f6387522d386174b356a60b7f
UART初始化配置
串口中断使用了,空闲中断,用于不定长度数据结尾的判断
DMA请求使用了 收完成DMA请求 和 送缓冲区空 DMA 请求,用于数据收发的DMA请求。
ef1d7b6df2867b8dcb186388fc1e4f7a
NVIC初始化配置
使用了DMA中断,用于DMA传输完成处理(接收区收满数据情况)
UART0和UART1中断,用于空闲中断处理(接收一帧完成)
83761f400bbb4fe2fb1c68fe85b5946a
DMA中断
通道1是UART0 RX使用
通道3是UART1 RX使用
8e20e0eba14381253f17d9b5013fab1f
我们看看DMA中断内的数据接收处理
7b8f5b78638bd9c355de02f2dbe377e3
串口中断
仅处理了空闲中断,用于判断数据帧接收完成。
进入这个中断有3中情况
1接收数据长度不到DMA传输次数时,检测到空闲
2接收数据长度等于DMA传输次数时,检测到空闲
3接收数据长度大于DMA传输次数时,检测到空闲
ddb6339f1d9fe092671f2f76e498577e
我们再来看一下,接收数据的处理,
0fb6633413959300c6db68925be552e5
当接收数据长度等于DMA传输次数时,检测到空闲 和 接收数据长度大于DMA传输次数时,检测到空闲,这两种情况是先进入DMA中断再进入串口中断的,数据在DMA中断中就已经拷贝和切换过缓冲区,所以数据不存在丢包和覆盖问题。
开启调试输出后测试效果如下
271b8470a3f7157a47f885894b6e3d96
因为这款MCU的DMA没有DMA半传输中断或硬件双缓存功能,所以实现双缓存只能采用软件方式。

例程源码如下: Demo29_UART_DMA.zip (2 MB, 下载次数: 50)

打赏榜单

15279701520 打赏了 5.00 元 2024-10-31
理由:写的很详细,很好,官网例程有很多BUG

caigang13 发表于 2023-8-2 18:18 来自手机 | 显示全部楼层
官方的例程都跑一下测试就放出来了吗?
 楼主| 6552918 发表于 2023-8-2 20:00 | 显示全部楼层
caigang13 发表于 2023-8-2 18:18
官方的例程都跑一下测试就放出来了吗?

原厂例程就没有用空闲中断的例程,怎么会容易发现。。。
木鱼21 发表于 2025-7-29 19:52 | 显示全部楼层
你好,手册上,不是说发送、接收不能都使用dma吗?
 楼主| 6552918 发表于 2025-7-30 09:29 | 显示全部楼层
木鱼21 发表于 2025-7-29 19:52
你好,手册上,不是说发送、接收不能都使用dma吗?

我测试时是可以使用的
木鱼21 发表于 2025-7-30 18:51 | 显示全部楼层
6552918 发表于 2025-7-30 09:29
我测试时是可以使用的

感谢,不过我看了08的um,没有上面的DNA空闲中断信息了,已经改过来了,不知道什么适配了……
还有,能请教一下,mcpwm持续输出高低电平吗?以及输出指定pwm脉冲个数。

我想使用mcpwm中断来计数实现脉冲个数,但是持续输出高低电平,我设置thxx的比较值,不知道是不是死区影响,无法完全拉低、拉高
 楼主| 6552918 发表于 2025-7-31 09:40 | 显示全部楼层
木鱼21 发表于 2025-7-30 18:51
感谢,不过我看了08的um,没有上面的DNA空闲中断信息了,已经改过来了,不知道什么适配了……
还有,能请 ...

理论上你的需求都可以实现,但我最近没看这款芯片,我发提供具体的实现方式。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

102

主题

1290

帖子

10

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