6552918 发表于 2022-12-10 22:53

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

串口作为最常用的通信接口,在日常使用中是用的最多的,串口使用一般用法分为查询方式,中断方式,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时也有问题。
源码路径:

源码:

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

Jacquetry 发表于 2023-1-5 17:10
总线时钟问题

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

vivilyly 发表于 2023-1-9 14:21

习惯于使用串口中断的            

kkzz 发表于 2023-1-9 14:29

一般都是使用定时器判断的               

sheflynn 发表于 2023-1-9 16:43

这个idle中断实现的效果好用吗?
页: [1] 2
查看完整版本: 【EV Board (MM32L0136C7P)测评】+串口DMA发送和DMA双缓冲不定长度接收及调试注意事项