串口作为最常用的通信接口,在日常使用中是用的最多的,串口使用一般用法分为查询方式,中断方式,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)
|