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

【经验分享】STM32H7系列使用DMA不能传输数据的问题

[复制链接]
STMCU小助手 发布时间:2022-1-1 20:00
我使用DMA进行SPI传输时发现无数据,还好有个逻辑分析仪,不然有没有信号都不知道
9 m9 J- ]  d7 x! d1 Y5 u* p% X
. J: R9 a/ s% n3 v( v这是总线访问权限的图。- Z$ {9 ?) K# {1 w

2 d( O; L: e( }, d! H. u- c% D“-”表示不能访问。“D”表示直接访问。其它的都是间接访问。
8 \& o- `! D6 e# l+ R" ?& c) I! V, T* r' t
20190830132727103.png
. N! U- C! L( u0 f

; {1 r, X2 I% T2 m& r( _) k: ^
20190830133103551.png
8 a3 w+ L! g5 X+ I# e9 x) e  H0 O$ P- T

3 F, p4 f9 p, w% r; s2 T; b5 T  t发现DMA1只有ITCM和DTCM不能访问,问题就出在这。/ `9 z: n! @6 t+ ?) ~# p! T. c5 i1 k
" `/ D8 d* G" y0 ?2 Q- k8 ~
有句“TCM 接口上的 DTCM-RAM 映射到地址 0x2000 0000,可供 Cortex®-M7 访问......”。(M7是处理器核)
4 N! {0 P# c. n' E3 R' Q; }  N* {4 \4 Y
内存分布:
' G  H7 v+ T* `' A9 }
. y1 [7 o2 Z# C4 X: i/ u5 c               DTCM-RAM(数据TCM RAM):起始地址:0x2000 0000,大小:0x20000(128KB)。
/ Q+ }5 c" u* d1 H5 ~; y4 R
2 A; ]1 O6 {7 V- c3 a               AXI SRAM(D1域):起始地址:0x24000000! c7 l$ j0 J' s7 V
! C; V1 B2 ~: g2 F' N
DTCM虽然和其它的MCU的RAM起始地址一样,但是无法被DMA访问。
' |8 V6 W6 K3 ?# q4 Q- I+ ]6 ~3 I0 r8 c) w6 R, S; T$ `/ i/ D
也就是通用RAM的地址变了,但是编译器还是会把DTCM的地址作为通用RAM的起始地址。0 G! S( q( \5 h9 ]& Q1 V) L
$ k& U) [" F3 z9 }5 ?; n: D
20190830134309979.png
( H; t( ^0 N3 d. G! T

) n- q1 ~2 S4 P6 N使用DMA传输时把内存起始地址修改为D1域。也就是把勾打在RAM2上。这是最简单的解决方法。0 F4 t# X) k5 k5 O
4 I$ s) a) A' r. C) V. E9 I
Makefile工程:% p+ ]: U) V* \# L

  Y$ ^6 v; o$ C6 l1 y9 b1 ~' P在指定位置创建内存:7 ]0 @) y7 i3 W. X
                                在ld文件中添加:8 N9 K' O4 `5 ]# t  ]9 @
                                    .DisplayBuffer : //DisplayBuffer是名字
7 H1 t0 {; F6 O$ B3 K                                    {undefined# D6 G* i& ?( v* f
                                        *(.DisplayBuffer)
) W% {8 K2 w, p% m' @, P                                    } >RAM_D2 //RAM_D2是所在地
( U0 i. q2 M3 c5 B/ `8 B; k) C                                使用该内存:__attribute__((section(".DisplayBuffer"))) uint16_t DisplayBuffer[ScreenH][ScreenW];。
  ~' t( I0 A+ y/ G* O6 U0 m; O; |                                也可以直接指定地址:uint16_t DisplayBuffer[100][100] __attribute__((section(".ARM.__at_0x20000000")));。只能在bss段里,bss段所在的内存区域在ld文件里看,看最后指向哪个RAM区域。
" l# Q0 A4 I. i/ z0 q
+ w( W( S' I* |7 a8 x% X* o. n! G只要变量不在DTCM里就行。
5 @, \: @% D' E6 H4 p
4 I" }: |7 y+ ]; \
6 ?7 g+ W* r  u$ b8 C' e+ ~
收藏 评论0 发布时间:2022-1-1 20:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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