通过STM32Cube配置STM32G0系列ADC DMA多通道连续采样时存在的问题

背景

最近在使用STM32G0系列ADC时遇到一些问题,我需要使用ADC的八个通道、使用DMA方式连续不间断的进行采样,通过STM32Cube图形化工具配置时遇到一些问题,特此做个记录说明。

本文开发工具与数据包版本如下:
STM32CubeIDE - V1.9.0
STM32Cube MCU Package for STM32G0 Series - V1.5.1

问题说明与解决方法

通常ADC使用DMA多通道连续采样时部分参数应该设置如下:
在这里插入图片描述
其中 Continuous Conversion Mode 应该为 EnabledDiscontinuous Conversion Mode 应该为 Disbaled 。但是在文章开头的条件下设置时参数会设置为如下:
在这里插入图片描述
并且无法手动在图形界面中进行更改:
在这里插入图片描述
在这里插入图片描述
使用这个参数进行测试时ADC DMA多通道连续采样结果不符合预期。

所以使用时需要手动调整初始化代码:
在这里插入图片描述
调整后工作就正常了。

更多内容可以参考: 《使用HAL库开发STM32:ADC基础使用》

您好,了解您的需求,如果您想实现STM32L0系列MCU的ADC多通道多次采集,但是不使用DMA,可以参考以下步骤: 1. 确定ADC采样的通道数和采样的次数,以及采样间间隔等参数。 2. 配置ADC钟和模式,设置采样间和采样分辨率等参数。 3. 配置ADC多通道采样模式,设置每个通道的采样顺序和采样间等参数。 4. 使用软件触发ADC的转换,等待每次转换完成并读取采样值。 5. 循环采样多次并计算平均值,最终得到多通道多次采样的结果。 下面是一个简单的示例代码: ```c #define ADC_CHANNEL_NUM 2 // ADC采样通道数 #define ADC_SAMPLE_NUM 10 // 每个通道的采样次数 uint16_t adc_values[ADC_CHANNEL_NUM][ADC_SAMPLE_NUM]; // 存储采样结果的数组 void adc_init() { // 配置ADC钟和模式 RCC->APB2ENR |= RCC_APB2ENR_ADCEN; // 使能ADCADC1->CR |= ADC_CR_ADCAL; // 校准ADC while (ADC1->CR & ADC_CR_ADCAL); // 等待校准完成 ADC1->CR |= ADC_CR_ADEN; // 使能ADC while (!(ADC1->ISR & ADC_ISR_ADRDY)); // 等待ADC就绪 ADC1->CFGR1 |= ADC_CFGR1_CONT; // 连续转换模式 ADC1->CFGR1 |= ADC_CFGR1_RES_12_BIT; // 12位分辨率 ADC1->SMPR |= ADC_SMPR_SMP_239_5; // 采样间239.5个钟周期 // 配置ADC多通道采样模式 ADC1->CHSELR |= ADC_CHSELR_CHSEL0; // 选择通道0 ADC1->CHSELR |= ADC_CHSELR_CHSEL1; // 选择通道1 ADC1->SQR1 |= (ADC_CHANNEL_NUM - 1) << ADC_SQR1_L_Pos; // 采样序列长度为通道数-1 ADC1->SQR3 |= 0 << ADC_SQR3_SQ1_Pos; // 通道0在第1个采样位置 ADC1->SQR3 |= 1 << ADC_SQR3_SQ2_Pos; // 通道1在第2个采样位置 } void adc_sample() { for (int i = 0; i < ADC_SAMPLE_NUM; i++) { ADC1->CR |= ADC_CR_ADSTART; // 启动ADC转换 while (!(ADC1->ISR & ADC_ISR_EOC)); // 等待转换完成 adc_values[0][i] = ADC1->DR; // 读取通道0的采样值 while (!(ADC1->ISR & ADC_ISR_EOC)); // 等待转换完成 adc_values[1][i] = ADC1->DR; // 读取通道1的采样值 } } int main() { adc_init(); while (1) { adc_sample(); // 计算平均值或其他数据处理操作 } } ``` 需要注意的是,在此示例代码中,每次采样都是由软件触发的,而非使用DMA。如果您需要在采样过程中处理其他任务,可以使用中断或定器来触发ADC转换。此外,由于ADC转换的间较长,可能会导致CPU占用较高,因此建议采用低功耗模式或其他优化方法来降低功耗。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naisu Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值