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

【经验分享】STM32H7:解决DMA传输无效的问题

[复制链接]
STMCU小助手 发布时间:2021-12-23 15:00
在STM32H743芯片上使用DMA传输数据时,如果出现收不到数据,并且不进入回调函数,基本上是RAM地址映射错误,DMA无法访问目标地址导致的。- ^* U) n. j6 c5 ^
0 c+ i- F5 R0 F" |* B
问题分析:
+ v- h, K+ n4 F' V通常使用STM32CubeMX生成项目时,程序默认执行地址是从RAM1: 0x20000000处开始执行,而0x20000000是DTCM段,DMA无法进行访问,这就导致使用DMA传输时无法读写数据,也无法进入回调。
9 T' R2 R/ ]; p0 x! a5 {$ x  [" f: ?3 a8 c: H) ^, R
6ee0fb6a96bfe3e52f466416d62921b4.png

( O3 S+ G5 r  n% b6 n
0 Q5 U% @! k8 W% JSTM32H7总线" i' p  z( |: W! [0 q/ T6 k- |
从上图可以看出,ITCM和 DTCM 是不支持 DMA1、DMA2 和 BDMA访问的,而AXI SRAM支持,所以把数据读写地址指定到AXI SRAM(0x24000000)区域内即可。
" D$ f/ }1 P& X; k6 |. z8 E1 T) K! r6 k1 v2 E
解决办法:
2 S9 H* k. S8 `% s+ n, A4 b5 q方法一:修改项目配置,选择支持DMA访问的AXI SRAM区域作为通用RAM起始地址。
9 j5 `2 g: T; o' p8 I3 J方法二:使用__attribute__((section(".ARM.__at_address")))指定DMA访问的目标地址为AXI SRAM区域。
( N/ T9 a3 |  q, F# ?% E) O0 I) p3 N  O( H1 [
6 j, q6 \& \( y1 D, E0 @' y: g8 X
下面分别介绍两种解决办法:
2 i7 H9 V& a; i1 Z2 |5 U  C' P  |6 J
修改项目配置。更改通用RAM起始地址为AXI SRAM(0x24000000),修改后如下图所示:6 E# B# |! x) A& x" G
2 D# N0 S$ ^7 [" J. Y
d1cdb30a33e72d77e163b5f705912b9d.png

9 I$ Z& _- T6 b/ d; y! f8 v  v, p0 `# W' Q+ w
修改通用RAM地址
3 L; r7 ^- s" {0 ]4 [7 u使用__attribute__((section( )))指定DMA访问的目标地址。9 G# L; v; h! T
在定义数组时,通过__attribute__((section(".ARM.__at_address")))指令把数组地址分配到AXI SRAM区域内即可(此时不需要修改项目配置)。
1 p2 ?) C* c, e) ~下面以SAI外设为例:0 ~( p9 B' A! w) R
  1. // 指定数组地址
    ' p& _3 }0 L+ C4 s( `; G8 M
  2. uint8_t SAI_Buffer_A[2 * 4] __attribute__((section(".ARM.__at_0x24000000")));9 e5 U' m- W+ }. K1 X& f2 y
  3. 8 g5 k# r1 d; j, m0 ]$ O' ^, ^: L; a
  4. .../ e# P" w- G0 R& C6 ?4 B  n9 i4 N7 W
  5. + H3 o' X4 p3 x8 t6 G! d) _
  6. // 开始DMA传输* M4 H0 y9 q' ?! g
  7. HAL_SAI_Receive_DMA(&hsai_BlockA1, SAI_Buffer_A, 2): v( G- t, y* x2 P, Y

  8. : n/ t: Z3 Q& l% e1 s3 x
  9. ...
    + G/ d& }/ V1 ?9 {0 S2 f
  10. $ Z5 o2 G4 ]7 s( Y: M7 b5 M
  11. // SAI接收完成回调6 ~3 l# C& [0 j8 X* F: F" b
  12. void HAL_SAI_RxCpltCallback(SAI_HandleTypeDef *hsai)) _$ q- h$ F9 y8 \
  13. {% r% P) f' D4 v/ Y; ]9 p3 |
  14.   ...
    . Q: i0 Y1 j( ?' A1 {
  15. }
复制代码

: C4 k7 |3 {6 O通过以上两种方案,就可以解决STM32H7芯片使用DMA无效的问题。) t" B# G3 R& a1 A, K9 |- S4 H
" }; d* [1 X8 \8 \5 z

" S0 c/ r2 A  F
- Y- M# B; Z/ c$ C/ s: x  a' s
赞 收藏 评论0 发布时间:2021-12-23 15:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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