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

相关推荐
嵌入式科普16 分钟前
十一、从0开始卷出一个新项目之瑞萨RA6M5串口DTC接收不定长
c语言·stm32·cubeide·e2studio·ra6m5·dma接收不定长
云山工作室1 小时前
基于单片机的视力保护及身姿矫正器设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
艺术家天选3 小时前
STM32点亮LED灯
stm32·单片机·嵌入式硬件
向阳逐梦3 小时前
基于STM32F4单片机实现ROS机器人主板
stm32·单片机·机器人
小猪写代码4 小时前
STM32 水质水位检测项目 (调试模块)和(延时模块)
stm32·单片机·嵌入式硬件
御风_215 小时前
STM32单片机使用CAN协议进行通信
stm32·单片机·嵌入式硬件
逝灮6 小时前
【蓝桥杯——物联网设计与开发】拓展模块3 - 温度传感器模块
驱动开发·stm32·单片机·嵌入式硬件·物联网·蓝桥杯·温度传感器
Wallace Zhang7 小时前
STM32F407 | Embedded IDE01 - vscode搭建Embedded IDE开发环境(支持JLINK、STLINK、DAPLINK)
ide·vscode·stm32
youk1108 小时前
STM32 HAL库之配置数据FLASH存储
stm32·单片机·嵌入式硬件
小菜鸟学代码··10 小时前
STM32相关知识及其创建工程
stm32·单片机·嵌入式硬件