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

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

[复制链接]
STMCU小助手 发布时间:2021-12-28 22:00
近日调试一块H7的板子, 板上资源丰富,运行速度很快, 我移植了Lwip等应用,然后想简单打开一下串口, 使用DMA形式接收. 但是无论怎么设置都没有正常收发.1 w1 v3 U$ m% x3 K: ?

6 h" A" d- f2 T! p% s$ Y可以进入回调函数, 但是接收数组内容一直是0, 就像DMA没有搬运过来一样.
% k) R/ d8 L" r& q5 j/ ?
8 @7 r, U! f  @, c调试良久,终于通畅可以跑满串口带宽:
1 f5 x' g# E' `& U
20210531005624149.png
2 h2 W: I3 {' q+ q* c# ^3 i" x

" t* l5 q+ J7 w" t下面说我是怎么搞的:
0 S* g! _5 }' C1 g6 C) X/ g
- `( k7 }2 P+ q# z' b配置UART, 再cubeMX中点选我想用得uart8 , 设置波特率.
- @4 N* [# |- a5 D6 E) |5 r
2 v, s: W+ ~4 F
20210531005807454.png

$ I' ~. @7 y. w" o! A+ {. j
' n; B" x- V$ s# ~DMA选项开启. RX要启用循环模式, 这样收到一次就会再启动一次.1 `/ V0 U  C& _) ]6 ?" K. t

+ G$ Y, Z% t6 M$ _& V5 o- [( h
20210531005941804.png
* @" ?: q8 U' b- i

, h6 N% g* h2 _: w: p4 Wok,到这里cubeMX的配置就完了, 网上都是这么写的. 点击在CubeMX IDE 点击保存,就生成代码了.
9 E0 q. z4 j: p' T/ `& r然后我在代码端再加写一些代码:
$ O0 g  f$ E# w  I" Q  J% ]
, `" d6 c& Z* n# i在串口配置内, USER CODE 注释空间内添加 立刻启动接收. 接收1字节帮我DMA搬运去uart8_RXdata这个数组内. 1 y0 q0 u+ E" Q2 Y% y% z7 _: B

/ m0 Y" u7 @/ H3 @) m
20210531010450955.png

/ i: z% A) U: _( v: x/ T  m& h2 E- y; s# p2 D: P
下面写一个函数叫: HAL_UART_RxCpltCallback, 这个函数库函数其实已经声明好了, 就等着用户自己写逻辑, 每次串口接收完我指定的数目后就会自动进入.# \7 H% Q6 |% e/ |) Z( B

) G0 S5 R. |% e# x进入这个回调函数后, 我就把uart8_Rxdata数据拿出来. 放去我逻辑缓冲区, 我在Freerots里面有个任务就是慢慢去解析这些数据的. 到这里没毛病.
$ K4 n: @! @5 d* Z
9 _, s9 P7 R* I
20210531010702476.png

$ D4 ^$ b& x2 _( {7 b# P& M$ A+ f; K* \6 i4 |) z
下面就是把Ringbuffer内的东西打印出来.9 K- h9 C! [$ D3 ?

7 \1 }: T8 j5 u' G2 ?4 B
20210531011344871.png
( r! b, _6 {! z4 S
( {# B6 G& A! p) S
到这整个过程就结束了. 可是结果很糟糕, 无论我发送什么字符, 都只收到0, 打印0.
$ [4 l1 _' L/ s% W4 m
/ \# G  E) x* {$ g# N开始查资料:
! T  y8 O7 F% O5 n' x6 ^+ `5 d) Y5 k! R; A, j* _, X$ ?
H7 DMA 访问空间有要求, 无法访问DTCM 0x2000000区域的RAM, 如果编程环境设置了,我的变量再这个区域, DMA就搬运不了.
4 F' K: e7 A' s; q  l+ @! J" X* r, L) p8 M( q% z+ l
20210531011732949.png

6 K: S2 U- b6 ]8 t- f8 X6 X& K3 Z( c1 M0 i
好, 我是CubeMX IDE, 是GCC环境, 查看LD文件, 查看MAP文件
. y1 {9 {) c4 vbss段 指定是在 0x24000000区域, map显示我的uart8_RXdata也是在这个区域内, 所以没问题. DMA可以访问.9 f3 a  o* Y, S) G! P1 _0 N

4 H* T5 \* `1 n& a& t5 @
20210531011941346.png

0 w& T* O: q8 j( b8 {( `- P$ M: V" V$ d) ]: ?6 S7 k
又折腾半天, 想起来配置LWIP的时候, 就是要配置MPU才能正常进行以太网收发. 由于H7内核达到480Mhz, CPU访问RAM都需要透过cache才能发挥性能. 所以H7芯片做了MPU这个部分来配置内存的访问策略. CPU访问SRAM 中间有CACHE的作用. 而DMA是直接操作SRAM空间. 所以要进行Cache策略配置.6 G2 M$ }: W+ K- O5 i5 \
在MPU设置中加入一个区块, 把整个0x2400000空间取消buffer.
8 P6 c5 [- t  O4 B$ I& L' o+ ~
8 L+ U( ]# t; L. }! k5 b! K! w! J
20210531012402136.png

; O8 T1 i* M3 ?4 {* D- W0 o% ?7 U; v. {) G9 W; v8 E7 F
生成代码, 串口收发正常了.% \1 d5 S$ r" h) O
6 [# p3 w# N! G/ x  z. u" X
之前考虑过这个方面,使用了volatlie关键字, 使用ST提供的函数: SCB_InvalidateDCache_by_Addr((uint32_t *)uart8_Rxdata,2);
  r: R% a% W% \- y5 {2 m, U
# v. U7 `4 {/ p4 j; j7 h7 l' Y3 N8 A+ i+ A' }" A9 V

/ t( u1 Q% @6 |/ U
收藏 评论0 发布时间:2021-12-28 22:00

举报

0个回答

所属标签

相似分享

官网相关资源

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