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

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

[复制链接]
STMCU小助手 发布时间:2021-12-23 15:00
在STM32H743芯片上使用DMA传输数据时,如果出现收不到数据,并且不进入回调函数,基本上是RAM地址映射错误,DMA无法访问目标地址导致的。
7 S6 y# n7 |6 }0 ~$ ~; q4 w
0 g- _" G2 H, f6 e7 _& O' h问题分析:
: K8 y! B- ?/ `* w6 O8 o2 j通常使用STM32CubeMX生成项目时,程序默认执行地址是从RAM1: 0x20000000处开始执行,而0x20000000是DTCM段,DMA无法进行访问,这就导致使用DMA传输时无法读写数据,也无法进入回调。( S4 `4 |6 ^$ `

% j) j/ A- m6 P6 ^3 P" s" O" q
6ee0fb6a96bfe3e52f466416d62921b4.png
5 O% z2 [7 X) B, q: j8 u- s- y
2 o/ g* s: J- h0 r( T' P7 p
STM32H7总线% R) _$ `( Y. Z3 Q; W- A
从上图可以看出,ITCM和 DTCM 是不支持 DMA1、DMA2 和 BDMA访问的,而AXI SRAM支持,所以把数据读写地址指定到AXI SRAM(0x24000000)区域内即可。
6 Y0 q" x2 L2 e9 W0 p. G
* v: x6 i6 L' x2 _7 i, e, W5 @解决办法:
' G5 e% i7 m/ O2 ~- f& f方法一:修改项目配置,选择支持DMA访问的AXI SRAM区域作为通用RAM起始地址。" {7 O$ w7 C) _% ?
方法二:使用__attribute__((section(".ARM.__at_address")))指定DMA访问的目标地址为AXI SRAM区域。% t% y  u5 X  e, h7 q

  {/ k2 Q8 v! Q$ ?+ J; b9 _
" K. y0 M0 F* Z& b5 A! ^下面分别介绍两种解决办法:
/ I3 R: o/ m# U/ \! h: f' f
3 @  f* W# f3 D* n' `3 ^修改项目配置。更改通用RAM起始地址为AXI SRAM(0x24000000),修改后如下图所示:
# F8 \, [) v( p8 V+ o' g4 q+ b
% T2 D* c. p" G
d1cdb30a33e72d77e163b5f705912b9d.png
/ B* _& W# t/ n& S, A2 ^) r
" e5 z  Y* J/ ?! f7 c# c
修改通用RAM地址' q; i4 U# Y) V4 E: a
使用__attribute__((section( )))指定DMA访问的目标地址。9 ~3 b  c  d/ m( X  ]: p
在定义数组时,通过__attribute__((section(".ARM.__at_address")))指令把数组地址分配到AXI SRAM区域内即可(此时不需要修改项目配置)。* X) _% r, l* d2 O4 L
下面以SAI外设为例:
9 d8 L0 n8 J( R
  1. // 指定数组地址6 j3 q- }  m9 N" |6 v# s
  2. uint8_t SAI_Buffer_A[2 * 4] __attribute__((section(".ARM.__at_0x24000000")));
    % c+ l( \2 y+ m+ j
  3. & b3 ^# F0 |% F
  4. ...+ Z* j& ?4 Q3 j# v* i& a6 G1 k

  5. ! S. P- n+ P7 `4 C- }
  6. // 开始DMA传输
    # ]3 P1 Y  }  d* b* G1 u/ a# J
  7. HAL_SAI_Receive_DMA(&hsai_BlockA1, SAI_Buffer_A, 2). Q0 t5 c- i3 J) X0 q
  8. * T& F7 @2 e6 y& L9 i) ^6 [
  9. ...1 K' i5 G$ t" L/ a8 \; [
  10. " j  |! A* V( \3 `) f1 q
  11. // SAI接收完成回调
    9 ^4 @, I( U0 P4 Q" o9 {9 S) K/ \7 {
  12. void HAL_SAI_RxCpltCallback(SAI_HandleTypeDef *hsai)
    + h! f9 |0 }- U! }& f$ O9 l# X
  13. {; }2 U% U' v! d/ r; \" n( J
  14.   ...# }1 N+ ~' o4 v9 @
  15. }
复制代码
$ `$ e/ _9 s# k. p7 m' ]; ], w
通过以上两种方案,就可以解决STM32H7芯片使用DMA无效的问题。
  m/ a0 R, E7 O5 r1 S( U3 c% l$ Q# N& h
6 r- U8 F+ ?5 A1 ~  {- ]
5 E2 ?2 Y9 h3 s6 C
收藏 评论0 发布时间:2021-12-23 15:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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