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。(这个方法也不是每次都有效,有兴趣的同学可以自己测试一下)

相关推荐
坏柠24 分钟前
深入浅出SPI通信协议与STM32实战应用(W25Q128驱动)(理论部分)
stm32·单片机·嵌入式硬件
Invinciblenuonuo2 小时前
STM32八股【5】----- TIM定时器
stm32·单片机·嵌入式硬件
猫猫的小茶馆5 小时前
【PCB工艺】软件是如何控制硬件的发展过程
开发语言·stm32·单片机·嵌入式硬件·mcu·51单片机·pcb工艺
多多*10 小时前
Java设计模式 简单工厂模式 工厂方法模式 抽象工厂模式 模版工厂模式 模式对比
java·linux·运维·服务器·stm32·单片机·嵌入式硬件
Android洋芋10 小时前
C语言深度解析:从零到系统级开发的完整指南
c语言·开发语言·stm32·条件语句·循环语句·结构体与联合体·指针基础
小麦嵌入式16 小时前
Linux驱动开发实战(九):Linux内核pinctrl_map详解与优势分析
linux·c语言·汇编·驱动开发·stm32·嵌入式硬件·硬件工程
傍晚冰川20 小时前
【STM32】最后一刷-江科大Flash闪存-学习笔记
笔记·科技·stm32·单片机·嵌入式硬件·学习·实时音视频
电子艾号哲1 天前
STM32单片机入门学习——第1-2节: [1-1、2]课程和STM32简介
stm32·单片机·学习
触角010100012 天前
MPU6050模块详解:从原理到STM32驱动指南(上) | 零基础入门STM32第八十九步
驱动开发·stm32·单片机·嵌入式硬件·物联网
不被定义的~wolf2 天前
【STM32】系统滴答计时器systick
stm32·单片机·嵌入式硬件