关于 adc-dac-baremetal
用于配置 ADC 和 DAC 外设的裸机开发技能,示例以 STM32 为主,涵盖单次转换、校准、DMA 连续采样,以及 DAC 静态或动态输出。
主要功能
- 01STM32 ADC 单次转换
- 02ADC 校准流程
- 03循环 DMA 采样与缓冲
- 04DAC 静态输出配置
- 05模拟读数与 DMA 问题排查
适用场景
- 01读取模拟温度或电压传感器
- 02使用 DMA 持续采样
- 03通过 DAC 输出音频或控制电压
- 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