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

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

[复制链接]
STMCU小助手 发布时间:2022-2-15 21:48
前言
" L0 Z( \6 m. d' a0 e# P9 G/ z利用 ST 提供的辅助开发工具 STM32CubeMX,可以快速开发 STM32 应用。在本文中讨论的 ADC 应用,同样是建立在STM32CubeMX 生成工程的基础上。具体为在 STM32H743ZI 上,利用 DMA 自动实现 ADC 数据周期采集和转移,在采集指定数量的采样值后产生中断,对数据进行处理。
! z2 |7 Q' b' T" V1 @文中仅对上述实现过程中出现的一种异常,进行介绍和分析。不涉及具体的 ADC 采集和处理实现的介绍。
+ x) F0 T) h& V/ M: f- v' @; v
( ~( k* E' ~0 k! u) u9 }. i5 }一 实验环境9 @) L  U4 v& E1 N: k' ~) v
硬件平台:Nucleo-H743ZI
2 n( K3 c5 K- n' m  D3 sSTM32CubeMX 版本:v4.28.0# J2 j% F3 K2 n! a7 J/ s, I* p# h
STM32CubeH7 版本:v1.2.0
5 u  u2 Z, L: ^# Y$ P3 L: oIDE: MDK-ARM v5.25.2.0 (优化级别 Level3)9 I( Y' R8 z$ ?
首先利用 STM32CubeMX 生成 ADC 应用的初始化工程,涉及的配置如下所示:
  M' D( v9 ^6 W/ E! z3 _
3 G. h+ i9 `' e' p [FN84T[Y8]59%}P_N3YS`QM.png
% P7 u2 B0 A' i) g" b+ N: M, W& z8 I$ ~. h. J' G, C& |
然后在工程中增加对 ADC 周期采集和 DMA 传输实现的命令,如下所示。并且增加回调函数内容,本文中实现仅添加了空指令。在调试过程中,在空指令处增加断点,判断 ADC DMA 传输半完成和传输完成中断是否正常进入。
# f6 l) B# ^- b% w1 m; ^
! ~' _" G( k: E1 g 57Z5~[B]I@UO%JX12KAWTFF.png ; b2 a1 c& A9 u+ K8 O: o

& W2 J0 G  f# q% K7 }2 Q, Z注: 如果在编译链接的过程中,出现没有定义 ECC_IRQn 提示,需将 stm32h7xx_hal_msp.c 中对HAL_NVIC_SetPriority(ECC_IRQn, 0, 0);的调用移除。
1 t/ s* K; R3 E, u# [: }
& ~4 {( E: @* T' I3 o1 f; Z* {二 异常现象+ w9 N- M6 ^6 c$ Y! s' @
在运行过程中,无法进入 HAL_ADC_ConvHalfCpltCallback 和 HAL_ADC_ConvCpltCallback 回调函数(分别对应 DMA传输半完成和传输完成回调函数)。
4 l* @/ i# X& o  S7 j/ e& D2 r3 l跟踪中断服务函数,发现在首次 DMA1 传输后,DMA_LISR 寄存器值为 0x8。即 TEIF0 置位,Stream 0 出现传输错误。
1 ^& p5 ?5 C& ^# y  u5 P6 Z
( [8 B+ [$ u, S7 s三 原因分析
8 o/ Y1 u; m( q8 r9 W根据错误信息,问题可能与 DMA 1 传输错误有关。重点围绕 DMA1 传输配置, 进行检查,并没有发现异常。
& [& I! s& S5 O* q0 G" S不过,同样的初始化配置和执行命令,放置在 ADC 例程(路径:STM32Cube_FW_H7_V1.2.0\Projects\STM32H743ZINucleo\Examples\ADC\ADC_DMA_Transfer),进行编译链接后,能够正常执行。
4 e( ^5 h  |4 J7 W: M0 [: W  m比对两者间的工程配置,发现在 RAM 分配上存在差异。下图为 STM32CubeMX 生生成工程中,对应的 RAM 分配情况。与此对应,例程中 RAM 分配至 IRAM2 (0x24000000)。
; S3 z" O& n' U* H2 D9 W% G, l9 v- T
& z8 f* Q4 |) r3 D. w( Y0 H; f
( ?  `0 ~1 c8 w 9]N)6}JENGXLGTM]P{QTGBF.png & [: t) m5 C0 E6 K  p: i
; M3 R+ g4 ~/ ^3 N' ]# d1 O0 A
打开.map 文件可以看到:& e8 R" @$ e4 i- v7 F  j) E" x6 ?5 w' ~4 e
a. 配置至 IRAM1 时:$ b3 a5 B' C% A- p+ X% P
aADCxConvertedData                 0x200000b4 Data         64 main.o(.bss)- T2 O( h, m  ?% ]4 ^
b. 配置至 IRAM2 时:5 ^! c6 ?. m  _2 J2 ^' ?: G
aADCxConvertedData                 0x240000b4 Data         64 main.o(.bss)
* t5 Q5 k- T4 ~9 |/ Y; L- a1 Y而 aADCxConvertedData 数组设置为 DMA 目标地址。问题定位为 DMA 目标地址引起的异常。
+ p! k3 C! Y0 ~* O* MaADCxConvertedData 数组都分配在 RAM 中,RAM 区域情况如下表所示。8 X+ G; S+ A! [' f

* a3 {  n' F8 H! Z %IXIFZONWB~%Z)YQ~V2O8AG.png
2 \- Z- y1 F# J+ X& O+ @2 A, [# c8 B. q% |' F
STM32H7 内部包含三个域,每个区域中含有总线矩阵,具有不同的 DMA 主设备支持。不同区域 DMA 主设备能够访问的空间不同,如下表所示(下表摘自 RM0433,更多详细介绍请参考 RM0433)。其中,红色框中表示 DMA1 不支持对DTCM 区域的访问。绿色框中,表示 DMA1 支持对 SRAM1/2/3/4,后备 SRAM 和 AXI SRAM 的访问。+ @8 Y* I; P5 R3 U
上述不同的工程配置,分别将 aADCxConvertedData 分配至 DMA1 不能访问的 DTCM 区域和 DMA1 能够访问的 AXI SRAM 区域。 从而出现描述的现象。
& J3 ?; z% v* b& E2 c0 ~
8 T% K6 d6 w+ |/ Y4 w' { @DBB}75VE$TP)7G$A%L6V43.png
( n. X; ~8 E: m4 d, E" n  d$ |9 |& \8 z
四 解决方法) ]; h3 }" C+ `8 ^
通过上述分析,问题产生的原因在于 DMA1 访问了无法访问到的地址。
( c& G* w" m( r$ {介绍两种解决方法,方法一,通过原因分析中描述的方法,通过在工程中,指定 RAM 使用空间实现目标地址(访问的数组)在支持的 RAM 区域。方法二,通过在数组定义时,强制分配至支持的 RAM 空间区域,如下所示。$ _1 V* f$ U% m0 _
uint16_t aADCxConvertedData[BUFFER_SIZE] __attribute__((section(".ARM.__at_0x24000000")));& ^5 G5 f5 J; \0 Y2 |# W, B
其中 __attribute__((section(".ARM.__at_address")))是被 MDK-ARM 支持的,指定对应空间的方式。
8 _" D$ u$ z1 T7 x) ?% ~* @
- i6 ?; v- {" J7 X4 |小结
- r" G1 I+ H- ~: Y/ X2 Q9 T8 {' tSTM32H7 相对于之前 STM32 系列,具有更灵活,更多样的内部区域,以及总线矩阵。带来应用灵活性提升的同时,也一定程度上增加了使用的复杂度。用户在进行 STM32H7 开发时,要注意各区域和多区域之间应用实现的实际情况。在遇到问题时,可与 ST 提供的大量例程进行比对,并结合数据手册和参考手册,进行问题的定位和解决。  [3 c' T- a- l

* T2 A0 g# u: j3 F4 n8 G5 B2 k- u1 ]" X: G8 k

' t( J% H. z2 a0 `1 T, z
赞 收藏 评论0 发布时间:2022-2-15 21:48

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版