关于 dma-baremetal
面向裸机嵌入式开发 Agent 的 DMA 配置指导,介绍传输设置、循环与双缓冲、中断处理及 Cortex-M7 缓存一致性。
主要功能
- 01配置内存与外设间的 DMA 传输
- 02设置循环和双缓冲模式
- 03处理中断与半传输事件
- 04处理 Cortex-M7 的缓存一致性
适用场景
- 01通过 DMA 卸载 UART、SPI 或 ADC 传输
- 02构建音频或流数据双缓冲
- 03排查 DMA 未触发或数据损坏
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill dma-baremetal安装后在 Claude Code 中输入/dma-baremetal确认已加载。
详细介绍
DMA(裸机)
用途
配置 DMA 控制器,以在内存与外设之间传输数据:设置通道/流、突发传输大小、循环模式、半传输中断,以及 Cortex-M7 上的缓存一致性。
适用场景
- 将 UART/SPI/ADC 的大批量传输任务从 CPU 卸载
- 音频/流式传输双缓冲
- 调试 DMA 未触发或数据损坏的问题
工作流
1. STM32 DMA2 流(外设→内存)
/* UART2 RX DMA — Stream5, Channel 4 (verify RM matrix) */
RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN;
DMA1_Stream5->PAR = (uint32_t)&USART2->DR;
DMA1_Stream5->M0AR = (uint32_t)rx_buf;
DMA1_Stream5->NDTR = sizeof(rx_buf);
DMA1_Stream5->CR = DMA_SxCR_MINC /* mem increment */
| DMA_SxCR_TCIE /* transfer complete IRQ */
| DMA_SxCR_CHSEL_2 /* channel 4 */
| DMA_SxCR_EN;
USART2->CR3 |= USART_CR3_DMAR;
2. 循环/双缓冲
DMA1_Stream5->CR |= DMA_SxCR_CIRC; /* auto-reload NDTR */
/* HTIF = first half, TCIF = second half — process in IRQ */
3. Cortex-M7 缓存(H7)
将 DMA 缓冲区放在非缓存区域,或清理/失效 D-Cache:
SCB_CleanDCache_by_Addr((void*)tx_buf, len);
/* after DMA TX */
SCB_InvalidateDCache_by_Addr((void*)rx_buf, len);
4. Agent 用法
/dma-baremetal Configure UART RX DMA circular buffer on STM32F4
常见问题
| 现象 | 原因 | 解决方法 |
|---|---|---|
| DMA 未启动 | 流/通道不匹配 | 查阅 RM DMA 请求映射表 |
| RX 数据损坏 | 缓存一致性问题(M7) | RX 完成后使缓存失效 |
| NDTR 卡住 | 未启用外设 DMA | USART_CR3 DMAR/DMAT |
| IRQ 风暴 | 在 ISR 中清除标志 | DMA_LISR/HIFCR |
相关技能
skills/baremetal/uart-serial-baremetal— 启用 USART DMAskills/baremetal/adc-dac-baremetal— ADC DMA 模式skills/low-level-programming/cpu-cache-opt— 缓存行概念
评论
支持 Markdown