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

基于STM32H7的传输

[复制链接]
yumeii 发布时间:2019-12-18 17:36
stm32h743-Nucleo板做个基于DMA传输的SPI收发应用示例。选择SPI1,MOSI与MISO短接,通过DMA自发自收,分开启Cache和不开启Cache来配置演示,以供参考。
$ K" A' `- n( a  i- D7 q
. Y, `( q* D7 S( @* h

0 t5 \; H0 ]% X) O利用STM32CubeMx进行配置,生成基于ARM MDK环境和Cube库的初始化代码。
- K* R% @/ K, H5 ~+ }6 S4 Y
8 g; T, R- j5 J  S

8 k" |  d0 y6 [0 T6 r( Q" B- L6 `SPI1配置在双工主角色,数据位设置为16位。开启SPI的TX/RX的DMA请求。) _8 [% [5 U1 n9 R7 `8 ~6 d

$ z) [+ ^  u4 |; v, m  c* r
1 ?' S/ U) d; n- W& |* V- |
1.png : P8 ~: L$ n1 P2 F, }

5 c8 T1 ^% D! r! x% e' E
+ \+ s5 q3 X2 D* Y) Z- D# ?
完成其它有关时钟、中断配置后,生成初始化代码并建立工程。) \5 A1 C& x# y: \: l/ F4 J2 Y, q
( e7 `. R6 i$ }& \5 e

: R. f* }: h; T1 f一、先不打开Cache。屏蔽掉相关代码语句。
# z) L0 i* M9 q; n
. w% J- q. {- e( `* X; }
' I1 M1 ]7 _0 S8 u3 L" o
2.png
! w( ?, a8 f: d: f! n! i$ `: G6 R- K; E, Z

4 M7 Z" @( G6 X7 O7 x我在主程序里周期性地修改待发送的数据,并使能SPI及DMA传输进行数据收发。; p- I% ]/ @) n% M

5 r9 H. J6 ^# V/ b7 M0 c4 ~
, ]; g% n: U" S4 }, O1 S' u2 [2 u
这里定义了两个内存数组用于数据的收发缓冲,分别是:
: P2 ^9 \3 E  s/ u% h+ m: K, r8 ]' H) U, }8 J- ^# i0 ^
+ N+ t: T& O: `: R7 @! z+ W
3.png , u) j" M. q. t  b' ^/ W) ~! g

6 t0 e2 j4 z+ ~8 y+ @- j
: H: |9 L+ ?9 h. X$ C
实验中我只各用到6个数据,并事先初始化。对于验证而言,初始值是多少不重要。
& J; v% M; S8 V0 E8 Q3 d
% \- R- |+ y8 _1 F7 Q& w
/ `' p- p" f  V
添加相关用户代码。这里我没有开启DMA传输相关中断,这点可以根据需要开启。
! L' C& Z6 _; m% {% E  `# @4 i6 F9 d- i4 `8 _( p

. r; z3 P% _, {% X 4.png
/ {6 L) J, I" D, s5 K; h
; I4 @' c/ j& b4 k% v- f

( E- c  U/ b7 L+ c5 j0 ^. m代码整理、调试完毕,看看结果。下面是通过打断点,在两个时刻的两幅截图。
+ ?' }7 Z, D( u2 u5 M1 ]: c0 [3 {4 m! U; n' W# [& \
8 j! y. v+ p. ?( ^8 t
注:接收缓冲区的起始地址为0x24000020,属于AXIM RAM区。' K9 a2 t8 V1 M& B& {& Q/ E

+ b  v5 b6 N. \( [5 ]

0 X! \1 B* ^( A 5.png 7 ~/ f" R0 c- |/ {4 m1 W3 W
8 `, l; d+ E& H- D
% p; a. j* Y- Z6 t  {) e
不难看出,收发数据很一致,那我们接下来看看使用Cache的情况。- G, P, l2 t- V4 s

6 l$ b( r; f% h- _" B( W; ^
" g4 U4 y- `9 W' U) j
二、开启Cache时的情况。, ~' E' a* }/ A3 D

- ?. W6 C- z+ `. M( \8 s! u
, L% j, @/ X; W. ^
6.png
+ A0 b' I3 p0 f4 T! N' R' F$ Y- D, ~" J/ \
  H. J3 ?$ l8 f" i4 r
整个工作流程跟上面一样,在主程序里循环地触发SPI的DMA传输。因为开启了Cache,我们要注意数据一致性问题的处理。在主循环的修改发送收据操作后做了Dcache的清除和失效操作。当然,我们也可以开启DMA传输中断,比方在传输完成中断里做Cache相关的数据更新与维护操作。整个用户代码跟上面不开启Cache时几乎一样,就最后多了一句跟Cache相关的代码。
: X7 e# {8 e2 H* R' C, ~$ ]& n3 \4 y1 u

( i1 O8 f3 ^3 E% j" q9 B. h7 A 7.png
, i& y2 Z( L' U: \" q/ P
, u: {2 F% S% X9 X' v
2 G. d7 ~) `( g( S& v, s# ?
稍作整理、编译运行,看看结果。同样,下面是通过打断点,在两个时刻的两幅截图。. p: x* l9 {# k9 d9 j& ^3 @% ]

" R" S  h" G* a' Z: a; ]' r; i/ R. |

  \: b- [! O* N注:接收缓冲区起始地址是0x24000020,属于AXIM RAM区。
- t3 q( F: t  F4 x  ]) |
+ f% K3 G1 f3 A+ z. h% a! w; O
. B4 Q8 G0 i' I3 x7 |. ?4 ^' ^
8.png # i. ~4 P! t9 U7 G6 N

1 i+ ]' q! w, o. Q$ j3 t6 ?1 a, u
; b' B0 [$ Y9 {) n3 Z
从验证结果可以看出,发送、接收的数据非常地一致。3 T% G" \# L* {! u, g# F0 c: z
' R7 C/ o+ K+ Z0 P, N
  j& A, q" J3 E$ ^" O, a) B/ T
这里提醒下,如果开启DCache,对于会被Cache的数据缓冲区,其地址以及缓冲区大小须遵循32字节对齐的原则。所以,关于收发缓冲区的定义及初始化,开启Cache时跟不开启Cache稍有点差异。下面的6代表代码中用到的六个16位半字数据。
: R" M! J- O* J" E
  d- D/ T9 d9 n

+ v' R) S: {- E 9.png
$ j( x8 e' A0 @* s- T: H
. o" M7 R# s6 V2 a4 m0 c' Z

! q. y+ N7 Y9 E" `: c好,整个示例就分享到这里,需要用到的代码都贴出来了。另外,当开启Cache之后,关于数据更新与维护我们也可以通过配置MPU来实现。
4 S. J& w1 A& o3 C3 p! A

/ K/ t6 G+ H# x- S; F
赞 收藏 评论0 发布时间:2019-12-18 17:36

举报

0个回答

所属标签

相似技术帖

官网相关资源

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