1. 串口通信基础与DMA技术优势
在实际的嵌入式开发中,串口通信是最常用的调试和数据传输方式之一。传统的轮询方式虽然简单,但在处理大量数据时会导致CPU占用率过高,影响系统整体性能。而中断方式虽然能提高效率,但频繁的中断响应仍然会消耗不少CPU资源。
这就是DMA(Direct Memory Access)技术大显身手的地方。DMA允许外设直接与内存进行数据交换,完全不需要CPU参与。想象一下,CPU就像公司的总经理,而DMA就像能干的助理——总经理只需要吩咐一句"把这份文件发给客户",剩下的抄写、封装、邮寄等工作全部由助理完成,总经理可以继续处理其他重要事务。
我在实际项目中就遇到过这样的案例:需要每秒传输100KB的传感器数据。如果使用传统轮询方式,CPU占用率会高达70%以上,系统几乎无法处理其他任务。改用DMA后,CPU占用率直接降到5%以下,整个系统运行流畅多了。
2. STM32CubeMX环境搭建与工程配置
2.1 硬件准备与芯片选型
首先需要准备一块STM32开发板,我常用的是STM32F103C8T6(蓝色pill板)或者STM32F407VET6。这两种芯片都具备丰富的DMA资源,非常适合做串口通信实验。
打开STM32CubeMX后,在Pinout视图中找到USART1。通常PA9和PA10会自动配置为TX和RX引脚,CubeMX很智能地会帮你完成引脚的复用功能配置,不需要手动调整。
2.2 时钟树配置要点
时钟配置是很多新手容易出错的地方。记得有一次我调试了整整一个下午,最后发现是时钟配置错了,波特率根本对不上。这里有个小技巧:在Clock Configuration界面,确保USART的时钟源正确设置。对于USART1,它通常挂载在APB2总线上,而其他USART可能挂在APB1上。
以STM32F103为例,如果使用8MHz外部晶振,可以这样配置:
- PLL倍频到72MHz
- APB2预分频器设置为不分频(72MHz)
- APB1预分频器设置为2分频(36MHz)
这样USART1就能获得72MHz的时钟源,为后续波特率计算打好基础。
2.3 DMA通道配置详解
在Connectivity → USART1 → DMA Settings中点击Add添加DMA通道。这里需要注意几个关键参数:
发送通道配置:
- Direction: Memory To Peripheral
- Priority: Medium
- Mode: Normal
- Increment Address: Memory要选Yes,Peripheral选No
接收通道配置:
- Direction: Peripheral To Memory
- 其他参数与发送通道类似
为什么


637

被折叠的 条评论
为什么被折叠?



