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

基于STM32H7 DMA传输SPI的实例

[复制链接]
yumeii 发布时间:2019-12-25 14:36
这里使用stm32h743-Nucleo板做个基于DMA传输的SPI收发应用示例。选择SPI1,MOSI与MISO短接,通过DMA自发自收,分开启Cache和不开启Cache来配置演示,以供参考。
) `% \2 }" P/ e8 |; `" |% _
' ]6 ~% f3 U5 {& d5 Z7 q! Y: S

$ d$ m2 ~: J1 w* B2 R利用STM32CubeMx进行配置,生成基于ARM MDK环境和Cube库的初始化代码。
) Z6 `, T3 `  s$ V& @+ w8 b; d& N2 J" c3 o" p( g

3 q7 X6 H2 @9 r! s3 VSPI1配置在双工主角色,数据位设置为16位。开启SPI的TX/RX的DMA请求。6 I* D2 _! Q) Z6 _5 C! r. J
' e2 l* q0 t& C
! P' D+ r- A8 v7 \
1.png ; X& i. S5 W4 J/ `: o6 Y) j- X
( G2 A2 ], V( W- d

; T( M& R/ A7 P( p完成其它有关时钟、中断配置后,生成初始化代码并建立工程。
6 M9 q0 ^' l4 h/ Z6 g" }
  ^; N! \7 `9 R. G$ T
" h8 f. j) m) n0 w) O8 k) w
一、先不打开Cache。【屏蔽掉相关代码语句】' M* _% i" m( M

! m- I4 M6 z/ U  \( s0 h: U4 f
8 O: R; }, S, V; X9 M# ^' s" m
2.png
' |7 @% b  V6 H' V  K9 w. \/ Z
5 P) V: |$ b3 C/ z& a( v
: w* o& V$ q; P, l3 r
我在主程序里周期性地修改待发送的数据,并使能SPI及DMA传输进行数据收发。
9 _- X  t6 h1 i- k# X1 ~3 l+ ~, |* q( S; t9 ^/ A
- e7 a0 B( ^. g& V
这里定义了两个内存数组用于数据的收发缓冲,分别是:
* u  Y% b2 X* {' n+ g: I. A* a
/ \5 Y4 v% j# ~; X* C5 k

0 C. X. n% |) ^# ^ 3.png
# ?0 u+ q+ z2 C. O% s
4 [4 U/ k, c# B7 k

7 g% G! ~" \0 C实验中我只各用到6个数据,并事先初始化。【对于验证而言,初始值是多少不重要】。% Z# ?  r- g5 t) ^2 x, n

2 @4 j5 L" r) u3 v* c1 s" C

# m6 K7 [+ v  R7 I. L添加相关用户代码。这里我没有开启DMA传输相关中断,这点可以根据需要开启。' d4 B4 P- e" _! P

0 W8 h6 V- z6 e- ^* ^7 h- e' C/ ^

$ K  D+ s8 F# I" w4 y8 C1 L* Z 4.png
5 E% p( t# W5 b, C2 H7 P% d& n8 `* A3 s  i" b, u

+ r1 b9 g( J5 E/ I/ G; `/ V3 {代码整理、调试完毕,看看结果。下面是通过打断点,在两个时刻的两幅截图。【注:接收缓冲区的起始地址为0x24000020,属于AXIM RAM区】。/ G" ~' _0 E6 O! L4 |

+ q  R9 z5 W, X" \; c

) v1 A0 G+ u+ W. B( X! F 5.png
% J& w5 U# C# \1 Y! N$ [" [3 m( y2 ~6 P; q; s/ m! o0 n2 G

* H+ |# x5 @; v) x8 m7 f不难看出,收发数据很一致,那我们接下来看看使用Cache的情况。
1 m0 p% {9 h7 _7 B9 `* f+ N+ l6 D2 L3 d# @$ J

8 c; k4 C0 x7 U$ H% h& L  D二、开启Cache时的情况。. `; `+ d  _+ e& |" y8 b% `
' s/ a6 \: p! O- x# {
3 q' D, z% l3 [& P
6.png ( M" x! _5 a, L0 m8 S# I- b  U

8 {7 n# H; K- U1 w
* j0 K8 H* O  a" A$ p. E1 c8 a
整个工作流程跟上面一样,在主程序里循环地触发SPI的DMA传输。因为开启了Cache,我们要注意数据一致性问题的处理。在主循环的修改发送收据操作后做了Dcache的清除和失效操作。当然,我们也可以开启DMA传输中断,比方在传输完成中断里做Cache相关的数据更新与维护操作。整个用户代码跟上面不开启Cache时几乎一样,就最后多了一句跟Cache相关的代码。5 m4 Z3 f5 k! x& R  A! ~1 N

6 d! `7 p3 b% ?. @. j
! `$ Z. p) n( x6 P
7.png * K" r# y& {; x/ u1 O# v

* H+ k; h+ u& k, X6 ?+ j! K" R
& T( _- P' B% t2 Z
稍作整理、编译运行,看看结果。同样,下面是通过打断点,在两个时刻的两幅截图。【注:接收缓冲区起始地址是0x24000020,属于AXIM RAM区】。( b: H( S) [6 \( N" {

7 S( _6 P  Y8 j% `/ h* y$ o

0 L( O& N/ C3 v; }4 ^8 h. |9 P: m 8.png
4 e2 I# K% r8 c: W' k" |; z7 D3 T) M* T: q

! A$ \8 w! i1 O7 Q- `从验证结果可以看出,发送、接收的数据非常地一致。
; s3 m7 h8 m! ?9 B: D  T: F) i# ~$ w; a$ u! {
* \- K8 q- O( O) M6 W9 S1 l
这里提醒下,如果开启DCache,对于会被Cache的数据缓冲区,其地址以及缓冲区大小须遵循32字节对齐的原则。所以,关于收发缓冲区的定义及初始化,开启Cache时跟不开启Cache稍有点差异。【下面的6代表代码中用到的六个16位半字数据】
. `% r" i. d* T9 T( S1 q% N! r1 E) P

3 M1 r+ c3 \) M8 G6 R& u0 w 9.png
3 e/ F; a/ {) V1 G1 ~
' _! u- [/ q5 r5 c  G8 F; m) U
- C. t) s$ Y7 p# o
赞 收藏 评论0 发布时间:2019-12-25 14:36

举报

0个回答

所属标签

相似技术帖

官网相关资源

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