STM32串口DMA接收的三种实现方式深度解析(寄存器/LL库/HAL库)
在嵌入式开发中,高效处理串口数据是每个工程师的必修课。面对STM32全系列芯片,从经典的F1到高性能的H7,如何选择最优的串口DMA接收方案?本文将带您深入剖析三种主流实现方式:寄存器直接操作、LL库和HAL库,通过同一块STM32F103RET6开发板的实战演示,揭示不同方案的核心差异与适用场景。
1. 串口DMA接收的技术本质
串口通信中的DMA(直接内存访问)技术解放了CPU,使其从繁重的数据搬运工作中脱身。结合空闲中断(IDLE Interrupt)的机制,我们能够智能识别数据帧的边界,实现不定长数据的可靠接收。这种组合方案的核心优势在于:
- 零拷贝接收:DMA直接将数据从外设搬运到内存缓冲区
- 硬件级效率:无需CPU介入每个字节的传输过程
- 帧完整性判断:空闲中断准确标识数据包的结束时刻
- 低功耗设计:大幅减少中断触发次数,降低系统能耗
关键提示:STM32的USART空闲中断特性是当总线检测到1个字符时间的空闲状态后触发,与传统的RXNE(接收缓冲区非空)中断形成互补关系。
2. 寄存器级实现:极致性能控制
对于追求极致效率和资源控制的场景,直接操作寄存器仍是最佳选择。下面以STM32F103RET6为例,展示核心配置步骤:
2.1 硬件初始化流程
// 使能时钟
RCC->APB2ENR |= RCC_APB2ENR_USART1EN; // USART1时钟
RCC->AHBENR |= RCC_AHBENR_DMA1EN; // DMA1时钟
// GPIO配置
GPIOA->CRH &= ~(GPIO_CRH_CNF9 | GPIO_CRH_MODE9); // PA9(TX)
GPIOA->CRH |= GPIO_CRH_CNF9_1 | GPIO_CRH_MODE9_0;
GPIOA->CRH &= ~(GPIO_CRH_CNF10 | GPIO_CRH_MODE10); // PA10(RX)
GPIOA->CRH |= GPIO_CRH_CNF10_0;
// USART基础配置
USART1->BRR = SystemCoreClock / 115200; // 波特率
USART1->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE;
2.2 DMA通道配置关键代码
DMA1_Channel5->CCR &= ~DMA_CCR_EN; // 先禁用DMA
DMA1_Channel5->CPAR = (uint32_t)&(USART1->DR); // 外设地址
DMA1_Channel5

&spm=1001.2101.3001.5002&articleId=155091966&d=1&t=3&u=06fb9cbb4ca64c76b4746756476f93c3)
199

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



