|
stm32h743-Nucleo板做个基于DMA传输的SPI收发应用示例。选择SPI1,MOSI与MISO短接,通过DMA自发自收,分开启Cache和不开启Cache来配置演示,以供参考。 利用STM32CubeMx进行配置,生成基于ARM MDK环境和Cube库的初始化代码。 SPI1配置在双工主角色,数据位设置为16位。开启SPI的TX/RX的DMA请求。) _8 [% [5 U1 n9 R7 `8 ~6 d 1 ?' S/ U) d; n- W& |* V- |
+ \+ s5 q3 X2 D* Y) Z- D# ? 完成其它有关时钟、中断配置后,生成初始化代码并建立工程。) \5 A1 C& x# y: \: l/ F4 J2 Y, q ( e7 `. R6 i$ }& \5 e 一、先不打开Cache。屏蔽掉相关代码语句。 ' I1 M1 ]7 _0 S8 u3 L" o
! n! i$ `: G6 R- K; E, Z 我在主程序里周期性地修改待发送的数据,并使能SPI及DMA传输进行数据收发。; p- I% ]/ @) n% M , ]; g% n: U" S4 }, O1 S' u2 [2 u 这里定义了两个内存数组用于数据的收发缓冲,分别是: ' H) U, }8 J- ^# i0 ^ + N+ t: T& O: `: R7 @! z+ W
: H: |9 L+ ?9 h. X$ C 实验中我只各用到6个数据,并事先初始化。对于验证而言,初始值是多少不重要。 / `' p- p" f V 添加相关用户代码。这里我没有开启DMA传输相关中断,这点可以根据需要开启。 # @4 i6 F9 d- i4 `8 _( p
代码整理、调试完毕,看看结果。下面是通过打断点,在两个时刻的两幅截图。 0 [3 {4 m! U; n' W# [& \ 8 j! y. v+ p. ?( ^8 t 注:接收缓冲区的起始地址为0x24000020,属于AXIM RAM区。' K9 a2 t8 V1 M& B& {& Q/ E
8 `, l; d+ E& H- D % p; a. j* Y- Z6 t {) e 不难看出,收发数据很一致,那我们接下来看看使用Cache的情况。- G, P, l2 t- V4 s " g4 U4 y- `9 W' U) j 二、开启Cache时的情况。, ~' E' a* }/ A3 D , L% j, @/ X; W. ^
' R' F$ Y- D, ~" J/ \ H. J3 ?$ l8 f" i4 r 整个工作流程跟上面一样,在主程序里循环地触发SPI的DMA传输。因为开启了Cache,我们要注意数据一致性问题的处理。在主循环的修改发送收据操作后做了Dcache的清除和失效操作。当然,我们也可以开启DMA传输中断,比方在传输完成中断里做Cache相关的数据更新与维护操作。整个用户代码跟上面不开启Cache时几乎一样,就最后多了一句跟Cache相关的代码。 , ~$ ]& n3 \4 y1 u
2 G. d7 ~) `( g( S& v, s# ? 稍作整理、编译运行,看看结果。同样,下面是通过打断点,在两个时刻的两幅截图。. p: x* l9 {# k9 d9 j& ^3 @% ] 注:接收缓冲区起始地址是0x24000020,属于AXIM RAM区。 . B4 Q8 G0 i' I3 x7 |. ?4 ^' ^
; 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位半字数据。
好,整个示例就分享到这里,需要用到的代码都贴出来了。另外,当开启Cache之后,关于数据更新与维护我们也可以通过配置MPU来实现。 |
【 逢7发帖赢大礼】1、利用CubeMX生成正点原子H7R7开发板的STM32CubeIDE工程
【STM32H735G-DK测评】ADC3+TIMER1+DMA 采样模拟信号
【STM32H735DK测评】Ethernet+lwip DHCP获取IP地址
STM32H743基于CubeMx5.0配置手册
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
【福利三:逢7发帖赢大礼】使用MPU6050模块、img_dsc、img_btn机制实现一些简单有趣的动画效果
【福利三:逢7发帖赢大礼】使用arc弧形拉条控件控制PWM舵机及使用SPI3接口操作NRF24L01模块进行无线通信
【福利三:逢7发帖赢大礼】调试nucleo-WBA65RI工程测试样板的一些心得
【福利三:逢7发帖赢大礼】lv_timer和BME680实现温度、湿度、气压数据读取
微信公众号
手机版