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

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

[复制链接]
STMCU小助手 发布时间:2021-12-23 15:00
在STM32H743芯片上使用DMA传输数据时,如果出现收不到数据,并且不进入回调函数,基本上是RAM地址映射错误,DMA无法访问目标地址导致的。
2 l: v) g1 _1 W( w' e+ j5 C: A! y/ P$ b
问题分析:  m4 D/ a7 U7 \( a1 v. a4 W
通常使用STM32CubeMX生成项目时,程序默认执行地址是从RAM1: 0x20000000处开始执行,而0x20000000是DTCM段,DMA无法进行访问,这就导致使用DMA传输时无法读写数据,也无法进入回调。
7 s6 h/ V9 w; z4 X: Q- D2 n, W5 d
+ c; N3 I2 @6 W  v8 @3 Z. l$ a
6ee0fb6a96bfe3e52f466416d62921b4.png
4 {, U( y3 p" E! P

3 {2 N- |8 A1 N, u7 vSTM32H7总线
, t, z  e- V. |/ R( p/ y从上图可以看出,ITCM和 DTCM 是不支持 DMA1、DMA2 和 BDMA访问的,而AXI SRAM支持,所以把数据读写地址指定到AXI SRAM(0x24000000)区域内即可。
) r5 v- r$ ^& l7 [% l2 e5 |& h& H4 a+ B# F2 b1 X- l
解决办法:
8 z* O7 E- M. {( U/ N! }方法一:修改项目配置,选择支持DMA访问的AXI SRAM区域作为通用RAM起始地址。. c1 u+ \$ Y" i; L
方法二:使用__attribute__((section(".ARM.__at_address")))指定DMA访问的目标地址为AXI SRAM区域。; T% T2 J  y$ f
6 B0 L% t' r" w* F

9 e9 m- [. w4 Y/ Y- ~% }& E- N下面分别介绍两种解决办法:
9 p4 z1 m! }5 {
7 M, d5 j7 h% `* ?# K修改项目配置。更改通用RAM起始地址为AXI SRAM(0x24000000),修改后如下图所示:4 F- s" j7 L$ x- ^  U
$ I" n$ B/ y* @5 E& L
d1cdb30a33e72d77e163b5f705912b9d.png
: |8 \! N4 l5 T- F; e

" T+ l3 q9 e/ ]  N修改通用RAM地址' x2 M+ w5 W8 W. d; z# S" v
使用__attribute__((section( )))指定DMA访问的目标地址。
" j" f; |9 E: V0 \+ ~* k在定义数组时,通过__attribute__((section(".ARM.__at_address")))指令把数组地址分配到AXI SRAM区域内即可(此时不需要修改项目配置)。6 U1 X6 }6 b" Y8 o; j# `9 Q) t
下面以SAI外设为例:* H# N. k, p* t6 s8 Z
  1. // 指定数组地址
    ; _) P$ p; K" n7 Y* U+ a! O, h
  2. uint8_t SAI_Buffer_A[2 * 4] __attribute__((section(".ARM.__at_0x24000000")));& O8 J# h" o0 L& l/ L

  3. / J0 M- D, r' a
  4. .../ g' P. V8 m2 P8 a7 i+ J6 g
  5. $ A( i" ^( a3 I! M. c" [; F" B: g: x
  6. // 开始DMA传输
    6 O1 X0 W! j* j& y" R& z7 X' Z
  7. HAL_SAI_Receive_DMA(&hsai_BlockA1, SAI_Buffer_A, 2)7 F: @; o. {0 c) P. _" L

  8. ' w4 t) o, K2 p
  9. ...
    3 F2 P+ R% l3 p+ |" \- r
  10. # d0 t4 p8 J! w* S
  11. // SAI接收完成回调
    7 S. G. N4 W! G! @1 T9 V
  12. void HAL_SAI_RxCpltCallback(SAI_HandleTypeDef *hsai)
    2 x  d( K8 [0 N5 p) E
  13. {  `3 x' q& b! R& U/ @  x# k
  14.   ...
    % \  |3 |$ n0 @* Y5 o, N+ G( W, j" g* H
  15. }
复制代码
* |7 A% [$ a- ~0 H3 _8 C$ g
通过以上两种方案,就可以解决STM32H7芯片使用DMA无效的问题。
4 ]; x& q- a7 J' u( |
. J  W! F0 M. C/ E0 n; }1 ?& z+ N0 x/ {2 b  G; I) Y6 K

5 j0 g$ A+ l3 f( I' u0 C
收藏 评论0 发布时间:2021-12-23 15:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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