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

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

[复制链接]
STMCU小助手 发布时间:2021-12-28 22:00
近日调试一块H7的板子, 板上资源丰富,运行速度很快, 我移植了Lwip等应用,然后想简单打开一下串口, 使用DMA形式接收. 但是无论怎么设置都没有正常收发.
7 X, r4 J- W2 K4 }+ G
& R" j  m5 m8 b, E4 Z% l; j可以进入回调函数, 但是接收数组内容一直是0, 就像DMA没有搬运过来一样.' ^2 L: j: v, O$ }- W, f0 m

  a% \  |- V( K9 H5 n/ x. l调试良久,终于通畅可以跑满串口带宽:# p, ?% n/ q  r& J* C
20210531005624149.png

. x4 M' Y6 ^$ ~' Y3 `# J6 O
  W0 Y4 Y. Z9 z2 k下面说我是怎么搞的:
7 P' D8 o$ v1 S& r. l: l
" P. \. }6 H  a+ c1 ?配置UART, 再cubeMX中点选我想用得uart8 , 设置波特率.7 s! J8 A* W: b# u% q
+ g  k4 v9 R2 `  `8 z
20210531005807454.png

# C6 J8 Y6 k- T, F6 V+ X; U; [$ A: F: S
DMA选项开启. RX要启用循环模式, 这样收到一次就会再启动一次.
& j) v; f0 f9 i/ N, P, A! R. s0 W" d" Z9 `, Q/ \. v
20210531005941804.png

* P; y  y* P" F( s* I% J6 e
2 T- q0 u3 j6 a- A6 _# M' P7 {ok,到这里cubeMX的配置就完了, 网上都是这么写的. 点击在CubeMX IDE 点击保存,就生成代码了.6 K6 `. t7 S' d7 q1 U" P1 r# |
然后我在代码端再加写一些代码:9 J& V' G/ L( b

. ]( d' ?: z+ N# f在串口配置内, USER CODE 注释空间内添加 立刻启动接收. 接收1字节帮我DMA搬运去uart8_RXdata这个数组内.
/ \. F% s# _$ j1 I3 L/ X9 \. w9 \
, v  n; S) ]3 c1 u2 a! P7 N) B
20210531010450955.png

2 J& \7 ]  C4 [- t" u: L+ m1 f& ?3 s$ `9 e4 }
下面写一个函数叫: HAL_UART_RxCpltCallback, 这个函数库函数其实已经声明好了, 就等着用户自己写逻辑, 每次串口接收完我指定的数目后就会自动进入.
# I+ e1 y/ |4 R. a0 Y# L; u+ [) B: U( r: q6 Y% \
进入这个回调函数后, 我就把uart8_Rxdata数据拿出来. 放去我逻辑缓冲区, 我在Freerots里面有个任务就是慢慢去解析这些数据的. 到这里没毛病.' R' ]- {: f% d# a4 o' i& @3 ]

( }, d4 ?3 m1 {' K: t% r5 e5 \. e
20210531010702476.png

, B! j# ?* D  a( T3 Q
  E% u/ r0 O6 `8 k2 G3 N* F下面就是把Ringbuffer内的东西打印出来.
: M( N8 x3 q/ u3 B/ @; ]: ]
! g$ @' k5 O& W# ]! T: V$ p4 F( F
20210531011344871.png
! F2 O  [8 E1 h
6 a  I5 c- H  M! t9 A
到这整个过程就结束了. 可是结果很糟糕, 无论我发送什么字符, 都只收到0, 打印0.9 ]% L# z' B  v9 }7 z: `. B3 l

& H* W# `  y# [" M开始查资料:# v: E  N  U2 j0 \% E

4 z/ M( j4 m) zH7 DMA 访问空间有要求, 无法访问DTCM 0x2000000区域的RAM, 如果编程环境设置了,我的变量再这个区域, DMA就搬运不了.
! l5 V5 R8 |# T! c2 k# L- u
  d7 C% p' F2 [
20210531011732949.png

& d: P: ^, t2 k0 Y' F. S% T+ E# b8 X' C
好, 我是CubeMX IDE, 是GCC环境, 查看LD文件, 查看MAP文件
* V5 v3 E) Y! @# \* T$ cbss段 指定是在 0x24000000区域, map显示我的uart8_RXdata也是在这个区域内, 所以没问题. DMA可以访问.
6 @6 G! U) Z( Z# H
4 h4 g$ }' \8 R; s, S3 b( K
20210531011941346.png

; p& A! e7 V/ J4 F+ g' X9 r8 r, W+ L" K7 q, O/ L
又折腾半天, 想起来配置LWIP的时候, 就是要配置MPU才能正常进行以太网收发. 由于H7内核达到480Mhz, CPU访问RAM都需要透过cache才能发挥性能. 所以H7芯片做了MPU这个部分来配置内存的访问策略. CPU访问SRAM 中间有CACHE的作用. 而DMA是直接操作SRAM空间. 所以要进行Cache策略配置.3 E4 j. e5 e! Y% m: Y; C' \: H& k
在MPU设置中加入一个区块, 把整个0x2400000空间取消buffer.
( }) G! s$ }& a8 `! |" E
& D# {7 x. J( a& F$ U+ U1 Y( q
20210531012402136.png
0 [$ x1 @5 {6 y7 N# N$ O
/ y1 J/ |8 ^# ]5 i8 l/ i
生成代码, 串口收发正常了.9 Q& q! ^7 O9 r" K4 P. v3 ~

- b% S' V8 y- T$ M* Q* I之前考虑过这个方面,使用了volatlie关键字, 使用ST提供的函数: SCB_InvalidateDCache_by_Addr((uint32_t *)uart8_Rxdata,2);
% @" Y5 x% b9 K- n5 A# N; v5 T, e. h, E9 ]9 E, A& G* v" u

9 @! N6 V% i4 n6 W8 ^' _6 R/ g4 y1 L! O' w3 L$ }2 E. t
收藏 评论0 发布时间:2021-12-28 22:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版