
前言 利用 ST 提供的辅助开发工具 STM32CubeMX,可以快速开发 STM32 应用。在本文中讨论的 ADC 应用,同样是建立在STM32CubeMX 生成工程的基础上。具体为在 STM32H743ZI 上,利用 DMA 自动实现 ADC 数据周期采集和转移,在采集指定数量的采样值后产生中断,对数据进行处理。 文中仅对上述实现过程中出现的一种异常,进行介绍和分析。不涉及具体的 ADC 采集和处理实现的介绍。 一 实验环境 硬件平台:Nucleo-H743ZI STM32CubeMX 版本:v4.28.0 STM32CubeH7 版本:v1.2.0 IDE: MDK-ARM v5.25.2.0 (优化级别 Level3) 首先利用 STM32CubeMX 生成 ADC 应用的初始化工程,涉及的配置如下所示: ![]() 然后在工程中增加对 ADC 周期采集和 DMA 传输实现的命令,如下所示。并且增加回调函数内容,本文中实现仅添加了空指令。在调试过程中,在空指令处增加断点,判断 ADC DMA 传输半完成和传输完成中断是否正常进入。 ![]() 注: 如果在编译链接的过程中,出现没有定义 ECC_IRQn 提示,需将 stm32h7xx_hal_msp.c 中对HAL_NVIC_SetPriority(ECC_IRQn, 0, 0);的调用移除。 二 异常现象 在运行过程中,无法进入 HAL_ADC_ConvHalfCpltCallback 和 HAL_ADC_ConvCpltCallback 回调函数(分别对应 DMA传输半完成和传输完成回调函数)。 跟踪中断服务函数,发现在首次 DMA1 传输后,DMA_LISR 寄存器值为 0x8。即 TEIF0 置位,Stream 0 出现传输错误。 三 原因分析 根据错误信息,问题可能与 DMA 1 传输错误有关。重点围绕 DMA1 传输配置, 进行检查,并没有发现异常。 不过,同样的初始化配置和执行命令,放置在 ADC 例程(路径:STM32Cube_FW_H7_V1.2.0\Projects\STM32H743ZINucleo\Examples\ADC\ADC_DMA_Transfer),进行编译链接后,能够正常执行。 比对两者间的工程配置,发现在 RAM 分配上存在差异。下图为 STM32CubeMX 生生成工程中,对应的 RAM 分配情况。与此对应,例程中 RAM 分配至 IRAM2 (0x24000000)。 ![]() 打开.map 文件可以看到: a. 配置至 IRAM1 时: aADCxConvertedData 0x200000b4 Data 64 main.o(.bss) b. 配置至 IRAM2 时: aADCxConvertedData 0x240000b4 Data 64 main.o(.bss) 而 aADCxConvertedData 数组设置为 DMA 目标地址。问题定位为 DMA 目标地址引起的异常。 aADCxConvertedData 数组都分配在 RAM 中,RAM 区域情况如下表所示。 ![]() STM32H7 内部包含三个域,每个区域中含有总线矩阵,具有不同的 DMA 主设备支持。不同区域 DMA 主设备能够访问的空间不同,如下表所示(下表摘自 RM0433,更多详细介绍请参考 RM0433)。其中,红色框中表示 DMA1 不支持对DTCM 区域的访问。绿色框中,表示 DMA1 支持对 SRAM1/2/3/4,后备 SRAM 和 AXI SRAM 的访问。 上述不同的工程配置,分别将 aADCxConvertedData 分配至 DMA1 不能访问的 DTCM 区域和 DMA1 能够访问的 AXI SRAM 区域。 从而出现描述的现象。 ![]() 四 解决方法 通过上述分析,问题产生的原因在于 DMA1 访问了无法访问到的地址。 介绍两种解决方法,方法一,通过原因分析中描述的方法,通过在工程中,指定 RAM 使用空间实现目标地址(访问的数组)在支持的 RAM 区域。方法二,通过在数组定义时,强制分配至支持的 RAM 空间区域,如下所示。 uint16_t aADCxConvertedData[BUFFER_SIZE] __attribute__((section(".ARM.__at_0x24000000"))); 其中 __attribute__((section(".ARM.__at_address")))是被 MDK-ARM 支持的,指定对应空间的方式。 小结 STM32H7 相对于之前 STM32 系列,具有更灵活,更多样的内部区域,以及总线矩阵。带来应用灵活性提升的同时,也一定程度上增加了使用的复杂度。用户在进行 STM32H7 开发时,要注意各区域和多区域之间应用实现的实际情况。在遇到问题时,可与 ST 提供的大量例程进行比对,并结合数据手册和参考手册,进行问题的定位和解决。 |
【经验分享】STM32H7时钟
拷打cubemx【003】——找不到的芯片包
【2025·STM32峰会】GUI解决方案实训分享5-调通板载的NRF24L01 SPI接口并使用模块进行无线通信(发送和接收)
【2025·STM32峰会】GUI解决方案实训分享4-使用MVP架构从硬件外设读取数据并显示到图形界面、从图形界面发送指令控制硬件外设
【2025·STM32峰会】GUI解决方案实训分享3-搭建空白TouchGFX例程并实现简单的功能(含硬件部分的串口打印)
【2025·STM32峰会】GUI解决方案实训分享2-编译运行TouchGFX咖啡机例程(含桌面仿真)
【2025·STM32峰会】+TouchGFX实现动态进度显示以及界面切换
【2025·STM32峰会】+使用TouchGFX快速创建GUI
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
实战经验 | 关于STM32H7使用LL库生成ADC代码工作异常问题说明