mcpField
A
adc-dac-baremetal

adc-dac-baremetal

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

关于 adc-dac-baremetal

用于配置 ADC 和 DAC 外设的裸机开发技能,示例以 STM32 为主,涵盖单次转换、校准、DMA 连续采样,以及 DAC 静态或动态输出。

主要功能

  1. 01STM32 ADC 单次转换
  2. 02ADC 校准流程
  3. 03循环 DMA 采样与缓冲
  4. 04DAC 静态输出配置
  5. 05模拟读数与 DMA 问题排查

适用场景

  1. 01读取模拟温度或电压传感器
  2. 02使用 DMA 持续采样
  3. 03通过 DAC 输出音频或控制电压
  4. 04STM32 复位后校准 ADC

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill adc-dac-baremetal

安装后在 Claude Code 中输入/adc-dac-baremetal确认已加载。

详细介绍

ADC 和 DAC(裸机)

用途

配置 ADC 和 DAC 外设:通道选择、采样时间、校准序列、DMA 循环缓冲区,以及 DAC 静态/动态输出。

使用场景

  • 读取模拟传感器(温度、电压)
  • 通过 DAC 输出音频或控制电压
  • 使用 DMA 连续采样
  • STM32 复位后的 ADC 校准

工作流

1. STM32 ADC 单次转换
/* Enable ADC1 and GPIOA clock; PA0 analog mode */
ADC1->CR2 |= ADC_CR2_ADON;
for (volatile int i = 0; i < 10000; i++);  /* stabilization — RM value */

ADC1->SMPR2 |= ADC_SMPR2_SMP0_2;  /* 84 cycles sample time ch0 */
ADC1->SQR3   = 0;                 /* channel 0, 1 conversion */
ADC1->CR2   |= ADC_CR2_SWSTART;

while (!(ADC1->SR & ADC_SR_EOC))
    ;
uint16_t sample = ADC1->DR;

在 F1/F4 系列上,按照 RM 执行 ADC_Calibration() / ADC_CR2_RSTCAL/CAL。

2. DMA 循环 ADC
/* ADC1 → DMA2 Stream0, circular mode into buffer[64] */
/* Configure DMA: periph-to-mem, halfword, increment mem, circular */
ADC1->CR2 |= ADC_CR2_DMA | ADC_CR2_CONT;
DMA2_Stream0->CR |= DMA_SxCR_EN;

使用半传输/传输完成中断实现双缓冲。

3. DAC 输出(STM32)
RCC->APB1ENR |= RCC_APB1ENR_DACEN;
DAC->CR |= DAC_CR_EN1;
DAC->DHR12R1 = 2048;  /* mid-scale 3.3V reference */
4. Agent 使用方法
/adc-dac-baremetal Set up ADC1 channel 0 with DMA circular buffer

常见问题

症状原因解决方法
读数有噪声采样时间过短增大 SMP 位值
EOC 卡住未启用时钟启用 RCC ADC
电压错误Vref 不是 3.3V测量 VDDA;进行校准
DMA 数据损坏缓冲区未对齐使用对齐的 uint16_t 缓冲区

相关技能

  • skills/baremetal/dma-baremetal — ADC DMA 流
  • skills/baremetal/timers-pwm-baremetal — ADC 外部触发
  • skills/baremetal/gpio-baremetal — 模拟引脚模式

评论

支持 Markdown