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

【经验分享】STM32H7上使用CubeMX,HAL配置UART串口DMA的坑

[复制链接]
STMCU小助手 发布时间:2021-12-28 22:00
近日调试一块H7的板子, 板上资源丰富,运行速度很快, 我移植了Lwip等应用,然后想简单打开一下串口, 使用DMA形式接收. 但是无论怎么设置都没有正常收发.
" L; T; o) j6 J2 S$ B+ G# j
& i3 v" H/ k, @6 W: L可以进入回调函数, 但是接收数组内容一直是0, 就像DMA没有搬运过来一样.7 s* b; }1 T0 h/ i7 K

; m! D0 e7 K3 ?( B调试良久,终于通畅可以跑满串口带宽:( |8 x8 i, W* t4 N; K* G3 N5 N9 F
20210531005624149.png
& F' e$ s$ Y8 F* l! {8 E: B

) V. Y: u! _3 e5 j下面说我是怎么搞的:8 C6 q0 Y% O" s7 l% k4 j4 x+ Q" R9 A

/ m0 P, O! }' a配置UART, 再cubeMX中点选我想用得uart8 , 设置波特率.$ m+ R0 U; I' d
) J3 ~8 V' ]/ f: A) Y  ]. c) T
20210531005807454.png

" `# S. Z6 R  o" i
. [2 L) Y0 l6 v- t) mDMA选项开启. RX要启用循环模式, 这样收到一次就会再启动一次.. o' ]; R' p& p2 }5 Y2 r! R4 [

/ }# R% S* p% W  V6 C2 A4 m
20210531005941804.png

3 Z% f: K( f. f: q4 x9 l) _$ ]  D9 L+ U7 d8 ~) f! W' O
ok,到这里cubeMX的配置就完了, 网上都是这么写的. 点击在CubeMX IDE 点击保存,就生成代码了.
8 h, o0 H6 k+ t! i然后我在代码端再加写一些代码:! J  s8 B0 d( O  v
. }7 a4 R  U9 z* {' P4 ]/ B
在串口配置内, USER CODE 注释空间内添加 立刻启动接收. 接收1字节帮我DMA搬运去uart8_RXdata这个数组内.
) O' e, c9 D# r5 @8 F: E
1 u$ Z# ]2 V; ]) O: d
20210531010450955.png
9 q$ C. {: s1 s/ ]; b4 Y

, u/ G! b- }; ]  A! Z下面写一个函数叫: HAL_UART_RxCpltCallback, 这个函数库函数其实已经声明好了, 就等着用户自己写逻辑, 每次串口接收完我指定的数目后就会自动进入.
2 w6 y! q0 O4 z
5 `& q4 k5 P4 r- `! W; A进入这个回调函数后, 我就把uart8_Rxdata数据拿出来. 放去我逻辑缓冲区, 我在Freerots里面有个任务就是慢慢去解析这些数据的. 到这里没毛病.' `! h7 i( B/ b" i7 `
. p: F% M+ s! ~1 L
20210531010702476.png
8 ]; U3 Q* c( P! z0 C0 @" E% {0 ^
6 `/ l9 i, w$ v6 Q; j- o
下面就是把Ringbuffer内的东西打印出来.
# m7 ^/ q) j/ }5 Z0 Q, }' o* r9 c% c( ^/ I' M5 o4 m
20210531011344871.png

; t3 R# l0 K' [% Y, _3 }1 r/ Q2 x6 _, C' S" \0 n+ x+ b
到这整个过程就结束了. 可是结果很糟糕, 无论我发送什么字符, 都只收到0, 打印0.
+ U' n" q' S3 _( u, z3 D
- W; T% e% C! m$ ]. s开始查资料:
# M3 `, Z, @6 I1 _6 i( y2 L: h8 z* |4 D) A
H7 DMA 访问空间有要求, 无法访问DTCM 0x2000000区域的RAM, 如果编程环境设置了,我的变量再这个区域, DMA就搬运不了.( v% Q, P; S( q; j& _: }3 F( n2 J5 k
3 q9 s* M  a" {1 l4 Q
20210531011732949.png
" c9 S3 n* [% l+ e" m
3 d. `, _; f8 L) w* _% |2 D  M) p
好, 我是CubeMX IDE, 是GCC环境, 查看LD文件, 查看MAP文件
# {* d5 I3 r, @6 ]bss段 指定是在 0x24000000区域, map显示我的uart8_RXdata也是在这个区域内, 所以没问题. DMA可以访问.$ a$ n" u5 M) D5 _  ]

  D. K' l6 n% [. k. y% R
20210531011941346.png

5 |  ?: d0 k" X9 y: M0 `. o% X% p
又折腾半天, 想起来配置LWIP的时候, 就是要配置MPU才能正常进行以太网收发. 由于H7内核达到480Mhz, CPU访问RAM都需要透过cache才能发挥性能. 所以H7芯片做了MPU这个部分来配置内存的访问策略. CPU访问SRAM 中间有CACHE的作用. 而DMA是直接操作SRAM空间. 所以要进行Cache策略配置.
% i( M3 C. g8 }1 E" r# t在MPU设置中加入一个区块, 把整个0x2400000空间取消buffer.
6 C3 e6 B0 a5 B) i6 ?8 P1 Y! P* ^. O: P* I
20210531012402136.png

. W4 S, V0 f  N& s8 s4 y
' \1 C" A, K9 k3 s生成代码, 串口收发正常了.4 B4 g) {6 N4 g' Y$ m% V
9 ~/ p: l! e+ ?1 |( D* a6 w$ o9 x
之前考虑过这个方面,使用了volatlie关键字, 使用ST提供的函数: SCB_InvalidateDCache_by_Addr((uint32_t *)uart8_Rxdata,2);
+ F5 u9 [7 C: W4 {/ A
6 b4 t( [9 l8 L/ z' g
$ Q0 z2 {  t2 O4 I8 P5 P6 X
, n3 @# j6 U( v  V  m+ [3 C" S- `
赞 收藏 评论0 发布时间:2021-12-28 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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