mcpField
D
dma-baremetal

dma-baremetal

github.com/mohitmishra786开发269307 次安装18 周前更新
代码仓库

关于 dma-baremetal

面向裸机嵌入式开发 Agent 的 DMA 配置指导,介绍传输设置、循环与双缓冲、中断处理及 Cortex-M7 缓存一致性。

主要功能

  1. 01配置内存与外设间的 DMA 传输
  2. 02设置循环和双缓冲模式
  3. 03处理中断与半传输事件
  4. 04处理 Cortex-M7 的缓存一致性

适用场景

  1. 01通过 DMA 卸载 UART、SPI 或 ADC 传输
  2. 02构建音频或流数据双缓冲
  3. 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 卡住未启用外设 DMAUSART_CR3 DMAR/DMAT
IRQ 风暴在 ISR 中清除标志DMA_LISR/HIFCR

相关技能

  • skills/baremetal/uart-serial-baremetal — 启用 USART DMA
  • skills/baremetal/adc-dac-baremetal — ADC DMA 模式
  • skills/low-level-programming/cpu-cache-opt — 缓存行概念

评论

支持 Markdown