打印
[MM32生态]

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

[复制链接]
1368|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
串口作为最常用的通信接口,在日常使用中是用的最多的,串口使用一般用法分为查询方式,中断方式,DMA+中断方式。MM32L0136C7P正好带有DMA,我来介绍一下这款芯片串口中断+DMA实现发送和双缓冲接收,顺便介绍一下调试过程中发现的问题和注意点。
由于MM32L0136C7P芯片主频只有48M,算不上快,如果串口大数据量通信时采用查询和中断方式会给CPU带来很大负担,照成其他任务处理不及时。DMA方式会很好的解决上述问题,大大减轻CPU负担。

串口接收双缓冲是利用DMA半传输中断和传输完中断实现的。再配上串口IDLE中断,实现不定长度接收,下面我对源码进行主要部分的讲解。
主函数没添加相关初始化函数,所有函数都在UART_DMA.c文件内


时钟初始化处理

中断使能初始化

串口IO初始化

DMA初始化,DMA_ReloadMode_AutoReload 自动重装功能,在DMA接收完重新配置时很有用,简化的配置步骤,这是这款芯片比较有特点的地方


串口初始化配置,中断只需要开启接收空闲中断(不定长度数据接收使用)和发送完中断即可

DMA中断处理函数,处理接收半传输和传输完中断,实现双缓冲

双缓冲数据拷贝处理

串口中断处理,实现了接收空闲中断(不定长度接收)和发送完中断

数据接收完的统一处理函数

APB1 APB2 AHB最大都能到48M,但为了让波特率能到115200,APB1 APB2需要分到到12M才行

串口官方例程波特率是9600,直接改为115200是不行了,需要改总线时钟,下面会有说明

时钟初始化时会对APB1 APB2进行分频处理,为满足波特率能都到115200,APB1 APB2需要对AHB 4分频才行,这里需要重点注意

需要修改总线数字,用于其他函数的使用

UART1发现个问题,115200bps存在问题,最高只能到57600bps(不是时钟配置问题)。

UART库文件中定义的状态太少了,建议把状态都列出才好。

仿真列表中的串口,名称应该为UART,现在是UART1

这款芯片的串口数据发送寄存器和数据接收寄存器是分开的,这点和其他单片机不太一样。

红框内的两个函数是分别获取收发寄存器地址,两个地址是不同的,与上图相对应。

无意中看到滴答计时器相关还的宏定义,没看明白这是要干嘛,有知道的给指导一下

源码中,对UART1和UART2进行的测试,没有问题,LPUART没有测试,代码也不全,后续会完善。
UART1使用115200时也有问题。
源码路径:

源码: evb-l0130_mdk(UART+DMA).zip (2.12 MB)

使用特权

评论回复
沙发
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时也有问题,是啥问题?发送数据丢包?

使用特权

评论回复
5
6552918|  楼主 | 2022-12-22 13:42 | 只看该作者
OKAKAKO 发表于 2022-12-22 12:57
UART1使用115200时也有问题,是啥问题?发送数据丢包?

总线时钟问题,分频那需要改一下

使用特权

评论回复
6
tpgf| | 2023-1-4 14:42 | 只看该作者
一般在什么情况下我们会启用双缓冲呢

使用特权

评论回复
7
6552918|  楼主 | 2023-1-4 14:51 | 只看该作者
tpgf 发表于 2023-1-4 14:42
一般在什么情况下我们会启用双缓冲呢

高速传输,大数据量传输

使用特权

评论回复
8
wowu| | 2023-1-4 14:53 | 只看该作者
这种接收不定长度的数据 如何判定是否已经接收完成呢

使用特权

评论回复
9
xiaoqizi| | 2023-1-4 15:04 | 只看该作者
我们使用dma进行接收数据的时候 和普通模式相比 数据包的间隔时间有没有变化呢

使用特权

评论回复
10
木木guainv| | 2023-1-4 15:13 | 只看该作者
请问什么是半传输中断呢 如何判定呢 有标志位吗

使用特权

评论回复
11
磨砂| | 2023-1-4 15:20 | 只看该作者
115200的波特率已经很快了  比较容易出问题

使用特权

评论回复
12
6552918|  楼主 | 2023-1-4 15:22 | 只看该作者
木木guainv 发表于 2023-1-4 15:13
请问什么是半传输中断呢 如何判定呢 有标志位吗

使用 半传输中断  传输完中断  空闲中断 实现接收过程的双缓冲接收不定长度数据

使用特权

评论回复
13
6552918|  楼主 | 2023-1-4 15:23 | 只看该作者
磨砂 发表于 2023-1-4 15:20
115200的波特率已经很快了  比较容易出问题

不至于那么不靠谱。

使用特权

评论回复
14
晓伍| | 2023-1-4 15:32 | 只看该作者
滴答时钟用的宏定义可能是为了后续开发引用

使用特权

评论回复
15
6552918|  楼主 | 2023-1-4 15:44 | 只看该作者
晓伍 发表于 2023-1-4 15:32
滴答时钟用的宏定义可能是为了后续开发引用

可能是吧

使用特权

评论回复
16
Jacquetry| | 2023-1-5 17:10 | 只看该作者
总线时钟问题

使用特权

评论回复
17
6552918|  楼主 | 2023-1-5 18:24 | 只看该作者

串口波特率和总线时钟有关系

使用特权

评论回复
18
vivilyly| | 2023-1-9 14:21 | 只看该作者
习惯于使用串口中断的              

使用特权

评论回复
19
kkzz| | 2023-1-9 14:29 | 只看该作者
一般都是使用定时器判断的               

使用特权

评论回复
20
sheflynn| | 2023-1-9 16:43 | 只看该作者
这个idle中断实现的效果好用吗?

使用特权

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

本版积分规则

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

102

主题

1237

帖子

6

粉丝