从寄存器到HAL库:STM32串口DMA接收的三种实现方式对比(F1/F4/H7通用)

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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值