STM32如何高效接收串口数据?
内容提要
本文介绍了使用DMA方式处理STM32F10x串口数据收发。通过DMA直接在内存中读写数据,减轻CPU负担,提高系统效率。具体实现包括USART3_DR寄存器地址设置、DMA通道配置、DMA中断设置、USART接收回调函数实现、DMA基本配置和环形队列接收数据处理。
延伸解读
DMA接收的关键配置点
使用DMA接收串口数据时,必须正确设置外设地址和数据流向。文中强调USART3_DR的地址为0x40004804,且DMA_DIR应配置为DMA_DIR_PeripheralSRC,确保数据从串口寄存器搬运到内存缓冲区。若方向设反,RxBuffer将无法获得预期数据。此外,DMA通道需按硬件分配规则选择,USART3_RX对应DMA1通道3。
环形队列与空闲中断的配合
为避免线性缓冲区满导致数据丢失,文中采用DMA循环模式,并在USART3空闲中断中处理数据。通过head和tail变量管理环形队列,将RxBuffer中的数据搬运到用户缓冲区,再调用回调函数。这种方式适合不定长数据的接收,但需注意队列满时的覆盖风险,读取速度应匹配接收速度。
回调机制与参考用例
标准库没有内置串口接收回调,文中自定义了rx_cbk类型和注册函数usart_set_rx_cbk。参考用例中,motor_get_cmd_from_uart函数检查数据长度和包头包尾,解析后置位处理标志。若不注册回调,接收完成也不会执行用户代码。这种设计提高了模块的复用性,但需确保回调函数执行时间不宜过长。
标准库与HAL库的取舍
文章基于STM32F10x标准库3.5版本实现,但指出ST已不再更新标准库,并推荐使用CubeMX工具配合HAL/LL库快速配置。对于新项目,HAL库能简化开发;若需深入理解底层或维护旧代码,标准库方式仍有参考价值。选择取决于项目需求和个人偏好。
Q&A
STM32如何通过DMA接收串口数据?
通过DMA直接在内存中读写数据,设置USART3_DR寄存器地址,配置DMA通道和中断,最后实现接收回调函数。
DMA在STM32串口数据接收中有什么优势?
DMA可以减轻CPU负担,提高系统效率,因为数据的读写是直接在内存中进行的。
如何配置USART3_DR寄存器地址?
USART3_DR寄存器地址为0x40004800 + 0x004,即0x40004804,需要在DMA配置中使用该地址。
STM32的DMA支持哪些中断?
DMA支持传输过半、传输完成和传输出错三种中断,本文使用的是传输完成中断。
如何实现USART接收的回调函数?
可以通过定义回调函数类型,并使用usart_set_rx_cbk接口进行注册,实现接收完成后的处理。
环形队列在串口数据接收中有什么作用?
环形队列可以避免缓冲区满的问题,允许数据自动覆盖,从而实现连续接收。