STM32CubeIDE使用ADC采用DMA重大BUG

问题描述

STM32CubeIDE 1.8.0问题

大牛攻城狮最近调试STM32L151CBT6。由于项目上使用该款芯片做控制电源使用,其中涉及到多路ADC的数据采样。使用STM32CubeIDE 1.8.0版本详细如下图所示

这里大概率是STM32CubeMX版本太低了,从图上看才是6.4.0

注意这里的使用的软件版本号很关键。采用该款软件搭建工程,第一次搭建工程,配置ADC时候,不打开DMA,生成代码如下 :

再次,修改工程,打开DMA后,重新生成代码如下:

这里就出现了问题,具体分析如下,MX_DMA_Init函数首先打开DMA时钟,所以必须在MX_ADC_Init函数之前,所以生成如下代码是错误的,这里只是ADC的DMA存在这个问题,应该其他外设的DMA是不是也有这个问题。

cpp 复制代码
 MX_ADC_Init();
 MX_DMA_Init();

这个问题的核心是在DMA时钟未打开之前,进行了DMA的操作,后续的现象的ADC采样数据都是错误的,基本上全是0。

这个问题前前后后折腾了一个星期,主要是没有怀疑到STM32CubeIDE生成的代码会有问题,看这种现象,生成的代码也是没有问题,就是代码顺序出现了问题,这些细节对用户来说发现出来真累,主要是是心累,要不断的进行自我怀疑。这个做个记录,希望别人遇到这个问题,一下就能解决了。该工程下载地址

STM32CubeIDE使用ADC采用DMA重大BUG,初始化代码中将MX-DMA-Init函数MX-ADC-Init搞反资源-CSDN文库

STM32CubeMX V6.8.1测试

使用STM32CubeMX,版本V6.8.1未发现该问题

使用STM32CubeMX,版本V6.8.1生成代码如下,反复打开关闭DMA都能保证如下顺序, MX_DMA_Init在MX_ADC_Init之前。

STM32CubeIDE 1.16.0测试

反复打开关闭DMA也都能保证如下顺序, MX_DMA_Init在MX_ADC_Init之前。

其中项目使用STM32CubeMX

解决方法

升级STM32CubeMX版本,STM32CubeIDE版本到最新版本

如果不想升级软件,比如我,因为这个版本的STM32CubeIDE开发了很多工程,如果更换新版本,编译出来的固件,没有时间和条件测试了。这里需要如下图所示复位一下ADC的配置,然后,再把所有配置,一次性配置好,尤其是DMA,复位ADC配置后,第一次就要选择打开DMA。(这个方法也不是每次都有效,有兴趣的同学可以自己测试一下)

相关推荐
andylauren5 小时前
(5)STM32 USB设备开发-USB键盘
stm32·嵌入式硬件·计算机外设
Ronin-Lotus6 小时前
嵌入式硬件篇---ADC模拟-数字转换
笔记·stm32·单片机·嵌入式硬件·学习·低代码·模块测试
华清远见IT开放实验室7 小时前
嵌入式STM32创新教学:华清远见虚拟仿真实验平台与智能车项目师资培训
stm32·单片机·嵌入式硬件
andylauren8 小时前
(1)STM32 USB设备开发-基础知识
stm32·单片机·嵌入式硬件
末时清8 小时前
OLED--软件I2C驱动__标准库和HAL库
stm32·单片机·嵌入式硬件
BreezeJuvenile11 小时前
USART_串口通讯轮询案例(HAL库实现)
stm32·单片机·串口·hal库开发
RayTz12 小时前
STM32-CAN总线
网络·stm32·嵌入式硬件
黄金右肾12 小时前
STM32之FreeRTOS开发介绍(十九)
stm32·单片机·freertos
Echo_cy_14 小时前
STM32 硬件I2C读写
stm32·单片机·嵌入式硬件
Kisorge21 小时前
【电机控制器】FM33LF015芯片——IO口模拟串口
stm32·单片机·嵌入式硬件