[MM32生态] 【EV Board (MM32L0136C7P)测评】+串口DMA发送和DMA双缓冲不定长度接收及调试注意事项

[复制链接]
2152|22
 楼主| 6552918 发表于 2022-12-10 22:53 | 显示全部楼层 |阅读模式
串口作为最常用的通信接口,在日常使用中是用的最多的,串口使用一般用法分为查询方式,中断方式,DMA+中断方式。MM32L0136C7P正好带有DMA,我来介绍一下这款芯片串口中断+DMA实现发送和双缓冲接收,顺便介绍一下调试过程中发现的问题和注意点。
由于MM32L0136C7P芯片主频只有48M,算不上快,如果串口大数据量通信时采用查询和中断方式会给CPU带来很大负担,照成其他任务处理不及时。DMA方式会很好的解决上述问题,大大减轻CPU负担。
c039466a2eaccf55ea1309ad490a8c93
串口接收双缓冲是利用DMA半传输中断和传输完中断实现的。再配上串口IDLE中断,实现不定长度接收,下面我对源码进行主要部分的讲解。
主函数没添加相关初始化函数,所有函数都在UART_DMA.c文件内
7b0a36e2ba3c82f5ebf9269356465193
fd402099fd4aa6b92ba0a48fa33d70d3
时钟初始化处理
b78ec22c244d79e0e2e8159a0a7bfc30
中断使能初始化
74422b5f719993f1424afd7c36e334d5
串口IO初始化
d66e48c1c17c594f400a7ac998e88b0f
DMA初始化,DMA_ReloadMode_AutoReload 自动重装功能,在DMA接收完重新配置时很有用,简化的配置步骤,这是这款芯片比较有特点的地方
59fddf89dfd105c0719107d5a4223b7a
8770f1e783afbdc9a226f6148eff3d37
串口初始化配置,中断只需要开启接收空闲中断(不定长度数据接收使用)和发送完中断即可
2d3a8d89a1066de3a30864a58594022c
DMA中断处理函数,处理接收半传输和传输完中断,实现双缓冲
f79a680af4b89506f1337a4bc4dacd91
双缓冲数据拷贝处理
1da273e11261c830545901429b70f3bf
串口中断处理,实现了接收空闲中断(不定长度接收)和发送完中断
c729228eaa6c48e336e355b471c09ae5
数据接收完的统一处理函数
67c6182b5918bebc4d67e91c0dc022f2
APB1 APB2 AHB最大都能到48M,但为了让波特率能到115200,APB1 APB2需要分到到12M才行
a25eecad2a872e0aee370589b7acd9d1
串口官方例程波特率是9600,直接改为115200是不行了,需要改总线时钟,下面会有说明
87a4bfe96f7c2560ecf2f4165a96c3be
时钟初始化时会对APB1 APB2进行分频处理,为满足波特率能都到115200,APB1 APB2需要对AHB 4分频才行,这里需要重点注意
2eec1ecf459776f616bc0930a5454ce9
需要修改总线数字,用于其他函数的使用
94acc3fe5208fbedd32f726d2d31d63b
UART1发现个问题,115200bps存在问题,最高只能到57600bps(不是时钟配置问题)。
e6b347dc97d1ac532ed63ad70905f7cb
UART库文件中定义的状态太少了,建议把状态都列出才好。
520d54d88e281bda8227509751525142
仿真列表中的串口,名称应该为UART,现在是UART1
d3a2286b744f0e9412511af565967c3e
这款芯片的串口数据发送寄存器和数据接收寄存器是分开的,这点和其他单片机不太一样。
afa445822bce073735e0932903e9d12e
红框内的两个函数是分别获取收发寄存器地址,两个地址是不同的,与上图相对应。
c2c7fb8dbf483745b43aab1a6248e318
无意中看到滴答计时器相关还的宏定义,没看明白这是要干嘛,有知道的给指导一下
99ee013bb885c445b98b465733c59fad
源码中,对UART1和UART2进行的测试,没有问题,LPUART没有测试,代码也不全,后续会完善。
UART1使用115200时也有问题。
源码路径:
5ace5daab39cc8c762f2ff3d05f020b8
源码: evb-l0130_mdk(UART+DMA).zip (2.12 MB, 下载次数: 8)

xu@xupt 发表于 2022-12-19 10:34 | 显示全部楼层
感觉和STM32一样的开发程序
 楼主| 6552918 发表于 2022-12-19 11:21 | 显示全部楼层
xu@xupt 发表于 2022-12-19 10:34
感觉和STM32一样的开发程序

原理上是一样的,但细节有不同
OKAKAKO 发表于 2022-12-22 12:57 | 显示全部楼层
UART1使用115200时也有问题,是啥问题?发送数据丢包?
 楼主| 6552918 发表于 2022-12-22 13:42 | 显示全部楼层
OKAKAKO 发表于 2022-12-22 12:57
UART1使用115200时也有问题,是啥问题?发送数据丢包?

总线时钟问题,分频那需要改一下
tpgf 发表于 2023-1-4 14:42 | 显示全部楼层
一般在什么情况下我们会启用双缓冲呢
 楼主| 6552918 发表于 2023-1-4 14:51 | 显示全部楼层
tpgf 发表于 2023-1-4 14:42
一般在什么情况下我们会启用双缓冲呢

高速传输,大数据量传输
wowu 发表于 2023-1-4 14:53 | 显示全部楼层
这种接收不定长度的数据 如何判定是否已经接收完成呢
xiaoqizi 发表于 2023-1-4 15:04 | 显示全部楼层
我们使用dma进行接收数据的时候 和普通模式相比 数据包的间隔时间有没有变化呢
木木guainv 发表于 2023-1-4 15:13 | 显示全部楼层
请问什么是半传输中断呢 如何判定呢 有标志位吗
磨砂 发表于 2023-1-4 15:20 | 显示全部楼层
115200的波特率已经很快了  比较容易出问题
 楼主| 6552918 发表于 2023-1-4 15:22 | 显示全部楼层
木木guainv 发表于 2023-1-4 15:13
请问什么是半传输中断呢 如何判定呢 有标志位吗

使用 半传输中断  传输完中断  空闲中断 实现接收过程的双缓冲接收不定长度数据
 楼主| 6552918 发表于 2023-1-4 15:23 | 显示全部楼层
磨砂 发表于 2023-1-4 15:20
115200的波特率已经很快了  比较容易出问题

不至于那么不靠谱。
晓伍 发表于 2023-1-4 15:32 | 显示全部楼层
滴答时钟用的宏定义可能是为了后续开发引用
 楼主| 6552918 发表于 2023-1-4 15:44 | 显示全部楼层
晓伍 发表于 2023-1-4 15:32
滴答时钟用的宏定义可能是为了后续开发引用

可能是吧
Jacquetry 发表于 2023-1-5 17:10 | 显示全部楼层
总线时钟问题
 楼主| 6552918 发表于 2023-1-5 18:24 | 显示全部楼层

串口波特率和总线时钟有关系
vivilyly 发表于 2023-1-9 14:21 | 显示全部楼层
习惯于使用串口中断的              
kkzz 发表于 2023-1-9 14:29 | 显示全部楼层
一般都是使用定时器判断的               
sheflynn 发表于 2023-1-9 16:43 | 显示全部楼层
这个idle中断实现的效果好用吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

102

主题

1290

帖子

10

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