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

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

[复制链接]
STMCU小助手 发布时间:2021-12-23 15:00
在STM32H743芯片上使用DMA传输数据时,如果出现收不到数据,并且不进入回调函数,基本上是RAM地址映射错误,DMA无法访问目标地址导致的。
" t: z0 x) _9 w/ t2 R5 n: T( \# q7 |" t
问题分析:
' `$ O- A% X9 L0 Q5 Q) V通常使用STM32CubeMX生成项目时,程序默认执行地址是从RAM1: 0x20000000处开始执行,而0x20000000是DTCM段,DMA无法进行访问,这就导致使用DMA传输时无法读写数据,也无法进入回调。
8 A6 n! f/ _; Y) Y- y5 t2 ?+ {1 |5 p, X# e; @2 m7 o/ o' u
6ee0fb6a96bfe3e52f466416d62921b4.png

0 s* M/ W' f4 ~
, ^5 G0 Y* I) F% M* K3 gSTM32H7总线
0 R  ?7 k( Z8 Q5 W从上图可以看出,ITCM和 DTCM 是不支持 DMA1、DMA2 和 BDMA访问的,而AXI SRAM支持,所以把数据读写地址指定到AXI SRAM(0x24000000)区域内即可。
. N2 B; u- F2 ]# D+ L$ h9 o' L4 r$ h( M3 X6 q; @: l8 |
解决办法:1 u3 S$ Q1 n6 v( ~' b) W0 ?
方法一:修改项目配置,选择支持DMA访问的AXI SRAM区域作为通用RAM起始地址。/ e% R) ^. f# u  E7 t: k
方法二:使用__attribute__((section(".ARM.__at_address")))指定DMA访问的目标地址为AXI SRAM区域。
! _) Z6 ]* d2 A% L! c. O& G; _4 t: j' b" |
, ?2 F9 w3 B( h& S4 X
下面分别介绍两种解决办法:
/ Q3 V7 O" P" D% R
0 F: O& r) Z1 ^% \0 X7 b: K修改项目配置。更改通用RAM起始地址为AXI SRAM(0x24000000),修改后如下图所示:
' y; l6 S) O0 A" G
& T/ j0 Z5 O5 h: Q1 N
d1cdb30a33e72d77e163b5f705912b9d.png
/ U5 u" M9 d3 }( p  l  Z5 q
5 s  f9 H2 Y. N9 I# n: K  P5 K0 d
修改通用RAM地址
, m) H) t% K6 ]( n' N' s使用__attribute__((section( )))指定DMA访问的目标地址。' n$ Q/ J3 |; J) b9 _
在定义数组时,通过__attribute__((section(".ARM.__at_address")))指令把数组地址分配到AXI SRAM区域内即可(此时不需要修改项目配置)。
2 z* P- F6 z$ V- B7 U' c下面以SAI外设为例:
  ~) A$ e3 O+ M8 S$ Q2 P
  1. // 指定数组地址
    6 c) }, [( @' d" w
  2. uint8_t SAI_Buffer_A[2 * 4] __attribute__((section(".ARM.__at_0x24000000")));- t/ J8 |. o: A4 N+ A  ]( R

  3. - U, {+ ~& n. x# _$ Q6 s
  4. ...
    / ?0 n" p' `+ B- E4 S1 H

  5. 6 P* l5 r5 O+ ^( E8 t0 r
  6. // 开始DMA传输3 j" x) F3 J% [' Q& v
  7. HAL_SAI_Receive_DMA(&hsai_BlockA1, SAI_Buffer_A, 2)8 ~, Z* G! y7 G* x/ p+ T, v, B

  8. $ N9 }) {1 k7 a% f4 a
  9. ...
    & O- n: S: W, G" J( @7 `

  10. 3 |9 ^* w  ?& e. s+ A9 e( P
  11. // SAI接收完成回调
    ; z, l: L" @5 H: R0 t7 C; ~
  12. void HAL_SAI_RxCpltCallback(SAI_HandleTypeDef *hsai)
    $ G+ G4 ~7 \4 k# [
  13. {. }4 J* a# l. E$ Q# X
  14.   ...
    3 P, t* e! e. n5 N6 |
  15. }
复制代码
1 t8 e: R9 b; m1 b
通过以上两种方案,就可以解决STM32H7芯片使用DMA无效的问题。
* v$ P7 M! a3 S7 ]: X4 M1 S( S6 I
# S6 F* Z! v- i; P! z
5 b. W% D9 d; U. e8 p
2 k" T& F0 f4 r) l' m+ a. n) O- K
收藏 评论0 发布时间:2021-12-23 15:00

举报

0个回答

所属标签

相似分享

官网相关资源

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