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

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

[复制链接]
STMCU小助手 发布时间:2021-12-23 15:00
在STM32H743芯片上使用DMA传输数据时,如果出现收不到数据,并且不进入回调函数,基本上是RAM地址映射错误,DMA无法访问目标地址导致的。
* U* ]6 V" Y5 N- f
' {/ X: F0 [& T, a$ a# u$ n问题分析:9 O0 _  E& s& b8 q6 o
通常使用STM32CubeMX生成项目时,程序默认执行地址是从RAM1: 0x20000000处开始执行,而0x20000000是DTCM段,DMA无法进行访问,这就导致使用DMA传输时无法读写数据,也无法进入回调。
% V: l9 [) |- V& B: R$ N  }  H7 L  }' a
6ee0fb6a96bfe3e52f466416d62921b4.png

1 \2 ]1 o; L9 l6 m7 V8 ?" {' O+ H
  l- E$ h1 @9 D- d" A; HSTM32H7总线1 Y" }* r% o3 O. y  J: s
从上图可以看出,ITCM和 DTCM 是不支持 DMA1、DMA2 和 BDMA访问的,而AXI SRAM支持,所以把数据读写地址指定到AXI SRAM(0x24000000)区域内即可。
5 s  E, ?2 S( U$ E) q8 c% u: {
* R/ [% ^; A  J$ N# G解决办法:* t" l# {) @- q% w* V( m  D
方法一:修改项目配置,选择支持DMA访问的AXI SRAM区域作为通用RAM起始地址。
! y" V: e# w5 A方法二:使用__attribute__((section(".ARM.__at_address")))指定DMA访问的目标地址为AXI SRAM区域。
0 Q: b+ u# K- p2 T5 X3 m
7 H  l/ n% p) u, @( b- h
3 [/ ?6 I4 k# g0 K下面分别介绍两种解决办法:
1 R0 [+ R( h7 a& O& X+ X
4 P/ c0 M9 _- P) i修改项目配置。更改通用RAM起始地址为AXI SRAM(0x24000000),修改后如下图所示:
1 R3 D3 I$ N4 U+ |8 h0 Q9 j7 v  \
d1cdb30a33e72d77e163b5f705912b9d.png

. R% C0 \3 n/ Q3 n5 A" a) d5 B6 d" Q, ?8 F: _' w' h* `- v
修改通用RAM地址! p+ s+ l% ~9 Y! z, x  w
使用__attribute__((section( )))指定DMA访问的目标地址。; n, w% h% x. o4 }& ^# i5 i# s& ~
在定义数组时,通过__attribute__((section(".ARM.__at_address")))指令把数组地址分配到AXI SRAM区域内即可(此时不需要修改项目配置)。' H" T% P8 J  M+ \; N6 Q+ _
下面以SAI外设为例:
5 J1 X- N- f  b7 N
  1. // 指定数组地址
    3 e3 l8 ^1 P# j2 ?$ [& [4 r
  2. uint8_t SAI_Buffer_A[2 * 4] __attribute__((section(".ARM.__at_0x24000000")));9 m4 b. y0 L& q
  3. . B! Q4 Z' X# N' {/ D
  4. ...2 R# U7 c9 N+ I3 z
  5. 7 F' ~. y9 q2 H9 j* ]
  6. // 开始DMA传输. V) }! J( b$ i) H/ ^' l
  7. HAL_SAI_Receive_DMA(&hsai_BlockA1, SAI_Buffer_A, 2)6 E. k( J! e. K' d0 R8 ~
  8. ) ]- ^0 j1 S: o' y0 J! C( r4 X2 H
  9. ...
    1 |- M* E* O* c* W- g

  10. / v+ `3 e* N- L
  11. // SAI接收完成回调# K) u* e0 k: y9 Q( `
  12. void HAL_SAI_RxCpltCallback(SAI_HandleTypeDef *hsai)3 }; U7 v0 v9 G
  13. {) P" w/ D- n5 P3 Y
  14.   ...7 G/ C. M: C! P/ H) O, L
  15. }
复制代码
; `  W! B  i' d. Y$ P3 w
通过以上两种方案,就可以解决STM32H7芯片使用DMA无效的问题。
+ y. j  |5 I  p
  q! Z, ^- c3 ]- L9 B6 h( X) J! }5 w; }" |

* V5 y6 D' p3 m8 B9 p
收藏 评论0 发布时间:2021-12-23 15:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版