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

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

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

  J  N0 l( {" f9 n% C. L; v可以进入回调函数, 但是接收数组内容一直是0, 就像DMA没有搬运过来一样.
" X5 y8 y  c6 ^' ^' j' N7 \3 Z" g
2 b. k. O" u6 ~4 R8 Z! m8 p* U! [" s: j调试良久,终于通畅可以跑满串口带宽:
2 _# ]) r( T; P
20210531005624149.png
& I# k! F' Q& k  C4 ^
4 X8 A6 O1 |% o: o) A
下面说我是怎么搞的:
2 z3 {! I: v8 \+ r3 C
$ ~3 I0 o3 C! u配置UART, 再cubeMX中点选我想用得uart8 , 设置波特率.
2 u+ @( G6 G7 H2 {. m3 O+ y/ q
4 u# ]6 g% o# H4 D, c( E
20210531005807454.png
' p/ x& O2 w+ U+ g* U# F) T2 \- @5 u
+ f9 E  E* r8 g, ]
DMA选项开启. RX要启用循环模式, 这样收到一次就会再启动一次.
+ E/ }/ I7 q$ l+ _7 {8 X0 r  n- V: _
20210531005941804.png
' F! u) h5 a7 Z- v, N

0 u' U! @  [2 q- J4 i, S: Bok,到这里cubeMX的配置就完了, 网上都是这么写的. 点击在CubeMX IDE 点击保存,就生成代码了.5 \( g' m& e- \: c6 {
然后我在代码端再加写一些代码:
+ i4 W3 y, }% L
- c2 k; e- m1 Q2 ~在串口配置内, USER CODE 注释空间内添加 立刻启动接收. 接收1字节帮我DMA搬运去uart8_RXdata这个数组内.
3 s6 F* z# {0 D. S) E+ C  c7 [) s1 u
20210531010450955.png

5 X/ j- j! z8 R3 u, z
0 M$ V+ O' I! x下面写一个函数叫: HAL_UART_RxCpltCallback, 这个函数库函数其实已经声明好了, 就等着用户自己写逻辑, 每次串口接收完我指定的数目后就会自动进入.
6 L( ]+ V: h4 d* `* F& v, g' Y2 F7 q0 ]- b
进入这个回调函数后, 我就把uart8_Rxdata数据拿出来. 放去我逻辑缓冲区, 我在Freerots里面有个任务就是慢慢去解析这些数据的. 到这里没毛病.; |% x" S- ^" A1 L
% u3 p* K" l' T) P0 t* g) J- l
20210531010702476.png

: K8 Z( [) `( x3 a; y5 q1 g! X( r9 q: J; K7 J- M
下面就是把Ringbuffer内的东西打印出来.
$ T! o9 r2 n6 z7 p( g! m& n# m
4 i) g1 L0 P6 F" t8 b* T3 P2 C( ^
20210531011344871.png
/ I, F6 l4 n! P1 K: p

( f& W9 Z) W4 ~) w/ Q到这整个过程就结束了. 可是结果很糟糕, 无论我发送什么字符, 都只收到0, 打印0.' U0 k5 o4 b. _3 ^$ R! h& N
6 u& J# s# ^. T" E; y2 ~
开始查资料:
: e, J8 g& s  R; A& d  \, g3 m! ~: s/ E1 d+ O
H7 DMA 访问空间有要求, 无法访问DTCM 0x2000000区域的RAM, 如果编程环境设置了,我的变量再这个区域, DMA就搬运不了.
7 S- D6 o/ Y% S" S; j, c8 `' S" u2 W4 e2 N& {
20210531011732949.png
% F" L; Y$ ^* R6 ~& w- X

) o; o8 M5 z! g2 s# E好, 我是CubeMX IDE, 是GCC环境, 查看LD文件, 查看MAP文件
* N, r5 Y; z% Y- rbss段 指定是在 0x24000000区域, map显示我的uart8_RXdata也是在这个区域内, 所以没问题. DMA可以访问.0 H6 M/ S9 l5 D' [- K) g$ k0 D
' l$ u! g( B! G' I. u% B$ ^6 k2 }
20210531011941346.png
1 O7 O# G. c! R/ E

, o, d3 `8 W* a/ s  j又折腾半天, 想起来配置LWIP的时候, 就是要配置MPU才能正常进行以太网收发. 由于H7内核达到480Mhz, CPU访问RAM都需要透过cache才能发挥性能. 所以H7芯片做了MPU这个部分来配置内存的访问策略. CPU访问SRAM 中间有CACHE的作用. 而DMA是直接操作SRAM空间. 所以要进行Cache策略配置.2 m( _( Z4 U* H" V% N- A: W$ F
在MPU设置中加入一个区块, 把整个0x2400000空间取消buffer.% R# A9 D8 r8 h! M* e$ g3 }) C4 n
/ L/ A6 O) w( l& [" T3 A9 y) ~
20210531012402136.png

2 r* N' D, a# r9 [
0 r" h6 k: a  l- q' `; ?' ]生成代码, 串口收发正常了.
* j' r& v  J0 }9 c- I5 y: K7 ]6 V" c+ w* ]  i
之前考虑过这个方面,使用了volatlie关键字, 使用ST提供的函数: SCB_InvalidateDCache_by_Addr((uint32_t *)uart8_Rxdata,2);0 d3 y/ h5 S) {% F4 X& J

; W2 B3 H8 O6 o% d. l. s
9 t/ {0 E* f- D- ~& d5 x- b) E$ ~+ T) j: B3 }1 }% b9 r
收藏 评论0 发布时间:2021-12-28 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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