|
STM32H7 DMA 传输异常案例分析" f9 d, G m' {& @ 前言 8 a. K& j7 w1 k+ X$ B) | 利用 ST 提供的辅助开发工具 STM32CubeMX,可以快速开发 STM32 应用。在本文中讨论的 ADC 应用,同样是建立在STM32CubeMX 生成工程的基础上。具体为在 STM32H743ZI 上,利用 DMA 自动实现 ADC 数据周期采集和转移,在采集指定数量的采样值后产生中断,对数据进行处理。 5 B/ V: J% w3 `* U5 t) @ 文中仅对上述实现过程中出现的一种异常,进行介绍和分析。不涉及具体的 ADC 采集和处理实现的介绍。 - w; K ~$ R" |, ]" Z 一 实验环境 & f' Q/ n, X* K; m o+ h ! g/ } K9 G1 ~. v. V. Q8 C D 硬件平台:Nucleo-H743ZISTM32CubeMX 版本:v4.28.0STM32CubeH7 ! R" b, f% r, [8 S, N 版本:v1.2.0 2 d( ]0 P9 A; r, [2 {& [ IDE: MDK-ARM v5.25.2.0 (优化级别 Level3) * p# |+ R# A4 x7 ?% X4 e1 q: l 首先利用 STM32CubeMX 生成 ADC 应用的初始化工程,涉及的配置如下所示0 a0 A$ H+ w1 Q$ w * c3 U$ {/ x/ o( k& m* B
然后在工程中增加对 ADC 周期采集和 DMA 传输实现的命令,如下所示。并且增加回调函数内容,本文中实现仅添加了空指令。在调试过程中,在空指令处增加断点,判断 ADC DMA 传输半完成和传输完成中断是否正常进入。 4 N) |) {2 _+ m% `! F( P
注: 如果在编译链接的过程中,出现没有定义 ECC_IRQn 提示,需将 stm32h7xx_hal_msp.c 中对HAL_NVIC_SetPriority(ECC_IRQn, 0, 0);的调用移除。 二 异常现象 在运行过程中,无法进入 HAL_ADC_ConvHalfCpltCallback 和 HAL_ADC_ConvCpltCallback 回调函数(分别对应 DMA传输半完成和传输完成回调函数)。 $ Q) R% V& w! W7 [跟踪中断服务函数,发现在首次 DMA1 传输后,DMA_LISR 寄存器值为 0x8。即 TEIF0 置位,Stream 0 出现传输错误。 * ^) k( P( |( ?- x三 原因分析 根据错误信息,问题可能与 DMA 1 传输错误有关。重点围绕 DMA1 传输配置, 进行检查,并没有发现异常。 不过,同样的初始化配置和执行命令,放置在 ADC 例程(路径: STM32Cube_FW_H7_V1.2.0\Projects\STM32H743ZINucleo\Examples\ADC\ADC_DMA_Transfer),进行编译链接后,能够正常执行。 比对两者间的工程配置,发现在 RAM 分配上存在差异。下图为 STM32CubeMX 生成工程中,对应的 RAM 分配情况。与此对应,例程中 RAM 分配至 IRAM2 (0x24000000)。 ) h9 I5 @% C9 _2 f0 O1 Q 7 b" M9 G/ G; h/ E, t, V4 q+ c2 h5 R5 }# I |
| 已收藏 |
【 逢7发帖赢大礼】1、利用CubeMX生成正点原子H7R7开发板的STM32CubeIDE工程
【STM32H735G-DK测评】ADC3+TIMER1+DMA 采样模拟信号
【STM32H735DK测评】Ethernet+lwip DHCP获取IP地址
STM32H743基于CubeMx5.0配置手册
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
【福利三:逢7发帖赢大礼】使用MPU6050模块、img_dsc、img_btn机制实现一些简单有趣的动画效果
【福利三:逢7发帖赢大礼】使用arc弧形拉条控件控制PWM舵机及使用SPI3接口操作NRF24L01模块进行无线通信
【福利三:逢7发帖赢大礼】调试nucleo-WBA65RI工程测试样板的一些心得
【福利三:逢7发帖赢大礼】lv_timer和BME680实现温度、湿度、气压数据读取
微信公众号
手机版