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

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

[复制链接]
STMCU小助手 发布时间:2021-12-28 22:00
近日调试一块H7的板子, 板上资源丰富,运行速度很快, 我移植了Lwip等应用,然后想简单打开一下串口, 使用DMA形式接收. 但是无论怎么设置都没有正常收发.
- b) g& `8 [2 X$ n
& Y  i) L+ A% Z7 E可以进入回调函数, 但是接收数组内容一直是0, 就像DMA没有搬运过来一样.: ?3 c3 ^4 `- J" F; A

+ d8 \) c& X1 r$ Z调试良久,终于通畅可以跑满串口带宽:
4 y# K3 K# y' Z3 |' _
20210531005624149.png
# z; F" q4 ?9 l/ ]3 f. Z& ?  g

4 Y0 N0 y) B, V; Q" [下面说我是怎么搞的:; k6 H0 k/ y) b/ \9 U
  z+ A/ l" F3 u  X8 v
配置UART, 再cubeMX中点选我想用得uart8 , 设置波特率.  o1 Y4 [- y5 j9 f+ g
7 p5 m+ q% f# Q; l/ ^$ ?9 r& R: l
20210531005807454.png
6 s4 L" h7 M% @$ ^8 q* |
, X* D% |3 [, q! A, N7 m. J
DMA选项开启. RX要启用循环模式, 这样收到一次就会再启动一次.- N* i6 t4 W& G6 m+ s& ]9 p. K
( e2 \8 b" n) C' _3 p
20210531005941804.png

& M; }2 N* ~( H  w- c1 I
4 e. g# _5 |1 U2 t  eok,到这里cubeMX的配置就完了, 网上都是这么写的. 点击在CubeMX IDE 点击保存,就生成代码了.
* \( Y- d  |3 }" V然后我在代码端再加写一些代码:1 [$ T5 ?9 ?2 u) M7 L) W/ |4 {
" r$ [* {# X+ \( T: W$ h
在串口配置内, USER CODE 注释空间内添加 立刻启动接收. 接收1字节帮我DMA搬运去uart8_RXdata这个数组内.
9 `8 @3 x$ b# }
$ N0 _; {: i0 {2 N4 E; F
20210531010450955.png

& y1 N: I) M, z, k5 Z5 n% u  x7 i' Z. Y1 H3 j9 E
下面写一个函数叫: HAL_UART_RxCpltCallback, 这个函数库函数其实已经声明好了, 就等着用户自己写逻辑, 每次串口接收完我指定的数目后就会自动进入./ _3 q6 e* J. ^$ \. ?# K

6 M% u1 C& f  W" |进入这个回调函数后, 我就把uart8_Rxdata数据拿出来. 放去我逻辑缓冲区, 我在Freerots里面有个任务就是慢慢去解析这些数据的. 到这里没毛病.
2 _" }7 L( d' [! h! B
  v5 ~2 r5 I' |) ~5 V/ l3 J
20210531010702476.png

" }6 R6 _  y8 ~6 D
% q6 [+ V  s8 H下面就是把Ringbuffer内的东西打印出来.. j- D1 X# U* E( [( a2 i

* T( T, Y, Q" {5 ^: m
20210531011344871.png

( a8 a( O) X% D! r9 V
. Q( F! _. U* U  ]0 b$ Y: C. k& L到这整个过程就结束了. 可是结果很糟糕, 无论我发送什么字符, 都只收到0, 打印0.3 Y+ e7 a7 f$ G, L9 a$ g
" p8 a! L! ]6 \0 \; }+ x/ w8 ^  Y
开始查资料:
7 o1 g9 t  i5 B0 [  f
. ?7 y' d( g$ O( F/ @- RH7 DMA 访问空间有要求, 无法访问DTCM 0x2000000区域的RAM, 如果编程环境设置了,我的变量再这个区域, DMA就搬运不了.
. B  ~' A  n# p* i4 Q" r5 V) T; _9 k5 e
20210531011732949.png

& C* I5 `, w8 _: W9 a
0 ~) O, v9 z4 @/ i7 a好, 我是CubeMX IDE, 是GCC环境, 查看LD文件, 查看MAP文件1 g! f) R  F$ h$ @; V0 l: H- t
bss段 指定是在 0x24000000区域, map显示我的uart8_RXdata也是在这个区域内, 所以没问题. DMA可以访问.% G& Q/ ^8 c  R' ]: T

  D; [5 U' w3 N: R  n) v4 z: m
20210531011941346.png

% s3 e! I4 m" h7 c- c- B6 R7 C
8 `, H9 p8 s5 G% X- R又折腾半天, 想起来配置LWIP的时候, 就是要配置MPU才能正常进行以太网收发. 由于H7内核达到480Mhz, CPU访问RAM都需要透过cache才能发挥性能. 所以H7芯片做了MPU这个部分来配置内存的访问策略. CPU访问SRAM 中间有CACHE的作用. 而DMA是直接操作SRAM空间. 所以要进行Cache策略配置.
6 t$ V( h3 O9 {7 m) u在MPU设置中加入一个区块, 把整个0x2400000空间取消buffer.
. ]) t$ ~& ]' U2 N3 Z, k* e: H
; n# J' x7 b: m7 ^6 {
20210531012402136.png
; Y7 Q% I  w. {: z- L

! G+ D2 k: _% k0 v- W/ _2 B' |, r4 F, @生成代码, 串口收发正常了.  W" i9 ~# C0 ?

& V# [6 `3 ~5 U* k之前考虑过这个方面,使用了volatlie关键字, 使用ST提供的函数: SCB_InvalidateDCache_by_Addr((uint32_t *)uart8_Rxdata,2);
7 Y0 g3 n; @  _) h( H6 }7 y# \0 W, K0 [$ t+ J9 {3 m! h: u9 P
) t" p# h7 p8 k- f1 u9 c
6 C2 e0 A1 r4 g* O: Z6 {/ k
赞 收藏 评论0 发布时间:2021-12-28 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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