【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时也有问题。
源码路径:
源码:
感觉和STM32一样的开发程序 xu@xupt 发表于 2022-12-19 10:34
感觉和STM32一样的开发程序
原理上是一样的,但细节有不同 UART1使用115200时也有问题,是啥问题?发送数据丢包? OKAKAKO 发表于 2022-12-22 12:57
UART1使用115200时也有问题,是啥问题?发送数据丢包?
总线时钟问题,分频那需要改一下 一般在什么情况下我们会启用双缓冲呢 tpgf 发表于 2023-1-4 14:42
一般在什么情况下我们会启用双缓冲呢
高速传输,大数据量传输 这种接收不定长度的数据 如何判定是否已经接收完成呢 我们使用dma进行接收数据的时候 和普通模式相比 数据包的间隔时间有没有变化呢 请问什么是半传输中断呢 如何判定呢 有标志位吗 115200的波特率已经很快了比较容易出问题 木木guainv 发表于 2023-1-4 15:13
请问什么是半传输中断呢 如何判定呢 有标志位吗
使用 半传输中断传输完中断空闲中断 实现接收过程的双缓冲接收不定长度数据 磨砂 发表于 2023-1-4 15:20
115200的波特率已经很快了比较容易出问题
不至于那么不靠谱。 滴答时钟用的宏定义可能是为了后续开发引用 晓伍 发表于 2023-1-4 15:32
滴答时钟用的宏定义可能是为了后续开发引用
可能是吧 总线时钟问题 Jacquetry 发表于 2023-1-5 17:10
总线时钟问题
串口波特率和总线时钟有关系 习惯于使用串口中断的 一般都是使用定时器判断的 这个idle中断实现的效果好用吗?
页:
[1]
2