| name | adc-dac-baremetal |
| description | Bare-metal ADC and DAC skill. Use when configuring analog sampling, DMA-driven ADC, calibration, or DAC output on MCUs. Activates on queries about ADC bare-metal, sampling time, DMA ADC, or DAC channel setup. |
ADC and DAC (Bare-Metal)
Purpose
Configure ADC and DAC peripherals: channel selection, sampling times, calibration sequences, DMA circular buffers, and DAC static/dynamic output.
When to Use
- Reading analog sensors (temperature, voltage)
- Audio or control voltage output via DAC
- Continuous sampling with DMA
- Post-reset ADC calibration on STM32
Workflow
1. STM32 ADC single conversion
ADC1->CR2 |= ADC_CR2_ADON;
for (volatile int i = 0; i < 10000; i++);
ADC1->SMPR2 |= ADC_SMPR2_SMP0_2;
ADC1->SQR3 = 0;
ADC1->CR2 |= ADC_CR2_SWSTART;
while (!(ADC1->SR & ADC_SR_EOC))
;
uint16_t sample = ADC1->DR;
Run ADC_Calibration() / ADC_CR2_RSTCAL/CAL per RM on F1/F4 families.
2. DMA circular ADC
ADC1->CR2 |= ADC_CR2_DMA | ADC_CR2_CONT;
DMA2_Stream0->CR |= DMA_SxCR_EN;
Half-transfer / transfer-complete IRQs for double buffering.
3. DAC output (STM32)
RCC->APB1ENR |= RCC_APB1ENR_DACEN;
DAC->CR |= DAC_CR_EN1;
DAC->DHR12R1 = 2048;
4. Agent usage
/adc-dac-baremetal Set up ADC1 channel 0 with DMA circular buffer
Common Problems
| Symptom | Cause | Fix |
|---|
| Noisy readings | Short sample time | Increase SMP bits |
| Stuck EOC | Clock not enabled | RCC ADC enable |
| Wrong voltage | Vref not 3.3V | Measure VDDA; calibrate |
| DMA corrupt | Buffer alignment | Use uint16_t aligned buffer |
Related Skills
skills/baremetal/dma-baremetal — ADC DMA streams
skills/baremetal/timers-pwm-baremetal — ADC external trigger
skills/baremetal/gpio-baremetal — analog pin mode