你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32H7 DMA 传输异常案例分析

[复制链接]
STMCU小助手 发布时间:2022-2-15 21:48
前言+ @. q  K% Y6 {
利用 ST 提供的辅助开发工具 STM32CubeMX,可以快速开发 STM32 应用。在本文中讨论的 ADC 应用,同样是建立在STM32CubeMX 生成工程的基础上。具体为在 STM32H743ZI 上,利用 DMA 自动实现 ADC 数据周期采集和转移,在采集指定数量的采样值后产生中断,对数据进行处理。/ c" m! [, U: C3 Q0 H
文中仅对上述实现过程中出现的一种异常,进行介绍和分析。不涉及具体的 ADC 采集和处理实现的介绍。
2 H3 L7 k; f8 Q0 N8 f8 y+ h. N" S0 w/ Y; G0 E/ O, W
一 实验环境
% o4 w) E9 d7 L. S( n2 D# a4 a3 |- i硬件平台:Nucleo-H743ZI4 j" v* }7 a: U
STM32CubeMX 版本:v4.28.0
3 `7 y& X9 Z" D8 G4 P, tSTM32CubeH7 版本:v1.2.0
+ U! U" E( r4 wIDE: MDK-ARM v5.25.2.0 (优化级别 Level3)
* R5 I$ F6 q, N( ]- R9 _首先利用 STM32CubeMX 生成 ADC 应用的初始化工程,涉及的配置如下所示:: u( W  X- B' h4 ~
" W) ]) J6 }' F5 F9 A) M) U
[FN84T[Y8]59%}P_N3YS`QM.png
" B- q. y$ z5 c% x7 S3 L3 Q# O2 v% T! N, p$ \
然后在工程中增加对 ADC 周期采集和 DMA 传输实现的命令,如下所示。并且增加回调函数内容,本文中实现仅添加了空指令。在调试过程中,在空指令处增加断点,判断 ADC DMA 传输半完成和传输完成中断是否正常进入。# t4 V4 _- I$ ~1 Z/ Y

5 }, r! b$ L* Y3 h( g 57Z5~[B]I@UO%JX12KAWTFF.png 6 l$ ?: x% p/ E% b- Q, R/ w

: V9 a# z$ l( b+ j2 }6 ]: f) |注: 如果在编译链接的过程中,出现没有定义 ECC_IRQn 提示,需将 stm32h7xx_hal_msp.c 中对HAL_NVIC_SetPriority(ECC_IRQn, 0, 0);的调用移除。+ x, ?+ r4 |( k4 q/ t) P& s' ^! G
& M* G& w6 h4 ~+ S9 x# U; ], g; K
二 异常现象, {! S0 g6 e  C: {9 _6 M
在运行过程中,无法进入 HAL_ADC_ConvHalfCpltCallback 和 HAL_ADC_ConvCpltCallback 回调函数(分别对应 DMA传输半完成和传输完成回调函数)。
7 ]" T3 J( a+ C4 N4 k8 |# m跟踪中断服务函数,发现在首次 DMA1 传输后,DMA_LISR 寄存器值为 0x8。即 TEIF0 置位,Stream 0 出现传输错误。
' b; u2 h. H. u8 W8 Z' p/ z! t- a' m5 x+ I3 @
三 原因分析0 Z$ m" M: k4 X- }) ?
根据错误信息,问题可能与 DMA 1 传输错误有关。重点围绕 DMA1 传输配置, 进行检查,并没有发现异常。$ r3 B4 L# I3 r2 X
不过,同样的初始化配置和执行命令,放置在 ADC 例程(路径:STM32Cube_FW_H7_V1.2.0\Projects\STM32H743ZINucleo\Examples\ADC\ADC_DMA_Transfer),进行编译链接后,能够正常执行。: M: J$ {7 L( o
比对两者间的工程配置,发现在 RAM 分配上存在差异。下图为 STM32CubeMX 生生成工程中,对应的 RAM 分配情况。与此对应,例程中 RAM 分配至 IRAM2 (0x24000000)。2 f3 G* m4 N7 U% G2 R
* S4 x. @. T4 G* w+ T, _9 d6 \

& N. ?% r; M9 u6 g 9]N)6}JENGXLGTM]P{QTGBF.png & q+ X  B* K9 ]- j, ^( N2 X
1 F) A0 Z3 Z2 ?4 q8 N* t1 h
打开.map 文件可以看到:
5 M4 X1 \* V; [9 U  N! Ma. 配置至 IRAM1 时:! F1 h7 ~4 y  A7 @% e2 E# Y( p
aADCxConvertedData                 0x200000b4 Data         64 main.o(.bss)
/ S& u# x8 n; {9 O" e0 Db. 配置至 IRAM2 时:1 f7 y% v1 g& X- F
aADCxConvertedData                 0x240000b4 Data         64 main.o(.bss)
" A3 ^" J8 L8 f' \2 d而 aADCxConvertedData 数组设置为 DMA 目标地址。问题定位为 DMA 目标地址引起的异常。
7 v# h5 Q& @7 o  B2 v+ ZaADCxConvertedData 数组都分配在 RAM 中,RAM 区域情况如下表所示。  a! }0 U6 N/ F! I
) ]0 U+ P( j/ u
%IXIFZONWB~%Z)YQ~V2O8AG.png ( f' i5 c0 c2 r0 W% l

, ^9 R4 d" p) m  J7 U9 ~STM32H7 内部包含三个域,每个区域中含有总线矩阵,具有不同的 DMA 主设备支持。不同区域 DMA 主设备能够访问的空间不同,如下表所示(下表摘自 RM0433,更多详细介绍请参考 RM0433)。其中,红色框中表示 DMA1 不支持对DTCM 区域的访问。绿色框中,表示 DMA1 支持对 SRAM1/2/3/4,后备 SRAM 和 AXI SRAM 的访问。& q: m' h7 h' C: ?: J
上述不同的工程配置,分别将 aADCxConvertedData 分配至 DMA1 不能访问的 DTCM 区域和 DMA1 能够访问的 AXI SRAM 区域。 从而出现描述的现象。7 h% [$ G7 Q1 r, V4 T: h
4 Q2 r6 E6 D; A2 Q  r) Q# I8 H
@DBB}75VE$TP)7G$A%L6V43.png
) m) a& n% E0 U1 ~+ P. J; y
9 E  p5 W, j8 L& L" a1 P四 解决方法9 `1 z# o% ?5 M6 b$ V; s
通过上述分析,问题产生的原因在于 DMA1 访问了无法访问到的地址。
% e6 x9 A% V( p: i2 M, f0 O介绍两种解决方法,方法一,通过原因分析中描述的方法,通过在工程中,指定 RAM 使用空间实现目标地址(访问的数组)在支持的 RAM 区域。方法二,通过在数组定义时,强制分配至支持的 RAM 空间区域,如下所示。( \- E/ Y, m9 {1 n- ^) G
uint16_t aADCxConvertedData[BUFFER_SIZE] __attribute__((section(".ARM.__at_0x24000000")));1 r* E$ @# ?) U" `
其中 __attribute__((section(".ARM.__at_address")))是被 MDK-ARM 支持的,指定对应空间的方式。. M& w6 x0 P0 f# D9 C, [# P
8 j2 S5 I5 `0 T7 ^
小结6 x. M; k" i. j% \8 `
STM32H7 相对于之前 STM32 系列,具有更灵活,更多样的内部区域,以及总线矩阵。带来应用灵活性提升的同时,也一定程度上增加了使用的复杂度。用户在进行 STM32H7 开发时,要注意各区域和多区域之间应用实现的实际情况。在遇到问题时,可与 ST 提供的大量例程进行比对,并结合数据手册和参考手册,进行问题的定位和解决。
+ W+ {/ \  v. e7 ~1 v' X" t0 n
; A& \# e* w  |! u/ n% h' X: ]
1 X" B7 i) s& v1 ^6 Q1 C' Z' ]+ [* \" \8 ?
收藏 评论0 发布时间:2022-2-15 21:48

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版