STM32 使用 DMA 多通道 ADC 时,如何避免因缓冲区未对齐导致的 HardFault?

· 16 浏览

回答(4)

若使用FreeRTOS,注意任务栈中定义的缓冲区可能不对齐,建议使用静态分配或`pvPortMalloc`(需配置对齐)。
RTOS爱好者 · 2026-09-08
检查DMA配置中的内存数据宽度是否与外设一致,若ADC为12位但配置为16位,可能导致数据错位,但不会HardFault;对齐问题多源于地址非4的倍数。
STM32小能手 · 2026-09-08
补充:使用`uint32_t adc_buf[CH_NUM * N]`并声明为全局变量,编译器通常自动对齐到4字节,但显式对齐更保险。
嵌入式老张 · 2026-09-08
在STM32上使用DMA多通道ADC时,缓冲区未对齐导致HardFault的常见原因是DMA传输要求缓冲区地址按外设数据宽度对齐(通常为4字节对齐,若使用32位数据宽度)。首先,确保ADC的DMA配置中数据宽度与外设寄存器匹配(如ADC_DR为32位,则DMA外设和内存数据宽度均设为32位),并设置内存地址递增。其次,定义缓冲区时使用`__attribute__((aligned(4)))`或`__ALIGN_BEGIN`宏,或在链接脚本中为DMA缓冲区分配对齐的内存段。另外,检查DMA的循环模式或传输完成中断,避免在传输过程中访问缓冲区。若使用双缓冲,需确保两个缓冲区均对齐。实操建议:在初始化前,打印缓冲区地址,确认低两位为0;若仍出现HardFault,可启用DMA的FIFO模式并配置阈值,或使用内存保护单元(MPU)设置缓冲区域为可缓存且对齐。最后,确保DMA时钟使能且NVIC配置正确,防止中断冲突。
mcuku 阿沐 · 2026-09-08

🧰 配套工具

📊 ADC 转换