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

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

[复制链接]
STMCU小助手 发布时间:2022-1-1 20:00
我使用DMA进行SPI传输时发现无数据,还好有个逻辑分析仪,不然有没有信号都不知道
, T/ t( E3 \5 x% r
1 \! p* m: }4 D& \: q* u+ b; w这是总线访问权限的图。
+ W: Q9 D; X2 G* q9 m' t4 T' f3 d! D" i/ B; _) i% r
“-”表示不能访问。“D”表示直接访问。其它的都是间接访问。
; ^9 G/ w6 {9 `% i% M( y5 X7 j; r  V8 v2 E" u
20190830132727103.png

0 n0 Y$ }* }: t$ n) x  V
+ j# M8 d8 m) Y2 ~; N" o
20190830133103551.png
4 b1 I+ Q8 }4 m2 \% U, \" ~+ _
% [2 k7 C& n; Q$ f1 J
发现DMA1只有ITCM和DTCM不能访问,问题就出在这。
! V8 M4 F# m* I$ f0 a0 n* a
; C; Q& T5 G6 k/ P& V0 i$ @有句“TCM 接口上的 DTCM-RAM 映射到地址 0x2000 0000,可供 Cortex®-M7 访问......”。(M7是处理器核)% Z( D# k% U# y5 x5 p+ `' R/ c
4 Y4 V9 F9 g' v7 M( j3 j  l
内存分布:- ]7 J! e4 w# ?# S' d3 G2 T
- U5 ~! E2 L  V. T! F0 D! ~3 R
               DTCM-RAM(数据TCM RAM):起始地址:0x2000 0000,大小:0x20000(128KB)。
  F; l2 S" y$ Z+ K  U. C, t4 {( U6 G/ \; _$ H, _3 Q& L4 B4 v3 t# H
               AXI SRAM(D1域):起始地址:0x24000000: }0 T1 X& S5 b

2 K) f/ R2 z, N7 s  ]5 |DTCM虽然和其它的MCU的RAM起始地址一样,但是无法被DMA访问。
2 n5 G! h1 i7 A: C5 L8 |3 l) D4 K
' K- S; T7 Q2 g也就是通用RAM的地址变了,但是编译器还是会把DTCM的地址作为通用RAM的起始地址。
; d- r6 g! X4 s; V: s# W
+ {* h) s% I: B" D* ~( G( L
20190830134309979.png
4 D% y' F: Y' g/ O
6 P; |+ o; L7 T! G
使用DMA传输时把内存起始地址修改为D1域。也就是把勾打在RAM2上。这是最简单的解决方法。8 V6 `* m1 @" ~! C2 Z' V2 E8 o
( C0 t0 J2 C& _. [- X% K; k" E7 ~; j
Makefile工程:4 }5 |& C: x) _( q3 E7 m# T% G  r
; X% h# n7 W) u) @3 ?" t# t. H
在指定位置创建内存:
. ]5 f. s1 d) I0 `1 Z5 o/ N: S+ }                                在ld文件中添加:1 l% l; X% y- f% i& L6 Q
                                    .DisplayBuffer : //DisplayBuffer是名字- D9 _8 e, s/ m  Q1 |' W
                                    {undefined, D/ H% H$ S- k2 {
                                        *(.DisplayBuffer)- _/ D" r5 i7 w+ ?+ k" B3 Q
                                    } >RAM_D2 //RAM_D2是所在地
, v2 {9 m, M7 l5 [& ~                                使用该内存:__attribute__((section(".DisplayBuffer"))) uint16_t DisplayBuffer[ScreenH][ScreenW];。6 e! V: a8 O0 w+ e8 S4 |
                                也可以直接指定地址:uint16_t DisplayBuffer[100][100] __attribute__((section(".ARM.__at_0x20000000")));。只能在bss段里,bss段所在的内存区域在ld文件里看,看最后指向哪个RAM区域。
/ j. M  x% Y/ G; W7 G0 _, \5 C4 e; H) H$ e. |: d
只要变量不在DTCM里就行。
4 v7 B6 ?  e9 |# n; [  i3 T+ g8 E# C7 E# u& R) u$ S  Q  {" ?, a
1 e7 T6 M. B' o* Z
收藏 评论0 发布时间:2022-1-1 20:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版