STM32G0 ADC-HAL库 DMA 连续采集

2023-12-15 19:32:20

1、简介

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

2、特殊说明

使用STM32CubexMx初始化时会发现某些通道是灰色的,不能使用
在这里插入图片描述
原因是和Sequencer配置参数有关,大致意思是

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

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

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

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

3、配置


3.1、基础配置

在这里插入图片描述


3.2、取消中断

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


3.2、循环采集

在这里插入图片描述

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;
        }
    }
}

文章来源:https://blog.csdn.net/ai5945fei/article/details/135023497
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。