STM32G0 ADC-HAL库 DMA 连续采集

文章目录

    • 1、简介
    • 2、特殊说明
    • 3、配置
      • 3.1、基础配置
      • 3.2、取消中断
      • 3.2、循环采集
    • 4、使用
      • 4.1、校准
      • 4.2、启动
    • 5、测试代码

1、简介

测试平台:STM32G030C8
需求:ADC-DMA连续转换

2、特殊说明

使用STM32CubexMx初始化时会发现某些通道是灰色的,不能使用
STM32G0 ADC-HAL库 DMA 连续采集_第1张图片
原因是和Sequencer配置参数有关,大致意思是

  • Sequencer set to fully configurable (完全序列模式)

    在这个模式下,用户可以自己配置通道轮询的次序。但该模式明确指出,只支持AN0~AN14通道。

  • Sequencer set to not fully configurable (不完全序列模式)

    在这个模式下,ADC通道轮询次序是按照通道号从小到大(或从大到小)的顺序依次轮询的,不可改变。该模式支持AN0~AN18通道(即所有通道都可用)。

3、配置


3.1、基础配置

STM32G0 ADC-HAL库 DMA 连续采集_第2张图片


3.2、取消中断

注意:如果开启中断,会连续触发DMA转换完成中断,转换完一轮也就是所有通道就会中断一次,时间在us级别,会极大浪费CPU时间。
在这里插入图片描述


3.2、循环采集

STM32G0 ADC-HAL库 DMA 连续采集_第3张图片

4、使用

4.1、校准

  • 使用ADC前需要主动校准一次,否则转换精度异常
  • 实测如过不校准,采集VBAT时会偏大200mV
  LL_ADC_StartCalibration(ADC1); 
  while( LL_ADC_IsCalibrationOnGoing(ADC1)); 

4.2、启动

除去STM32CubeMX自动添加的 MX_ADC1_Init(); 还需手动启动DMA转换

 HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_dma_value, 5);

5、测试代码

void adc_test()
{
    uint16_t adc_dma_value[5];
    LL_ADC_StartCalibration(ADC1);
    while (LL_ADC_IsCalibrationOnGoing(ADC1));
    HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_dma_value, 5);
    while (1)
    {
        HAL_Delay(100);
        board_iwdg();
        SEGGER_RTT_printf(0, "adc value:\t%d\t%d\t%d\t%d\t%d\r\n", adc_dma_value[0] * 3300 / 4096, adc_dma_value[1] * 3300 / 4096, adc_dma_value[2] * 3300 / 4096, adc_dma_value[3] * 3300 / 4096, adc_dma_value[4] * 3300 / 4096);
        for (size_t i = 0; i < 5; i++)
        {
            adc_dma_value[i] = 0;
        }
    }
}

你可能感兴趣的:(stm32,嵌入式硬件,单片机)