搜索
查看: 1941|回复: 5

[实战经验] STM32定时器触发SPI逐字收发之应用示例

[复制链接]

该用户从未签到

450

主题

498

帖子

3

蝴蝶豆

社区小助手

最后登录
2020-7-30
发表于 2019-11-15 12:55:39 | 显示全部楼层 |阅读模式
        我们在做SPI应用时,有时希望通过定时器定时地触发SPI的收发,并利用DMA完成数据的传输。这里,我基于STM32L476芯片来做个演示,以供参考【为什么选用32L476,其实没啥特别原因,只是顺手找了块Nucleo板】。
        
本示例的大致过程是这样的:
        
        
        
片内SPI1做Master,SPI2做Slave,均工作在全双工模式。
1.png
        
        
这里使用片内定时器TIM3,借助它的更新事件触发DMA请求,通过DMA将数据给到SPI1的数据寄存器并发送出去,同时也开启SPI1接收事件的DMA传输。SPI2的收、发事件都启用DMA传输来实现数据收发操作。

        
        
TIM3的更新时间控制两个SPI的收发节奏,即定时器每产生一次更新事件,SPI1/SPI2这两个主从通信模块就进行一个数据的收发。我们可以通过调整定时器的计时周期来调整数据收发的快慢节奏。

        
        
好,先基于STM32CubeMx进行初始化配置。
        
1、对TIM3做基本配置。选择时钟源,先大致估算个定时器计时周期,调试时我们可以自行灵活调整。
2.png
        
        
开启基于TIM3更新事件的DMA配置。传输方向是从Memory到外设SPI1,即将内存数据传输到SPI1的数据寄存器进行数据发送,这里选用循环模式。
3.png
        
2、对SPI1/SPI2进行基本配置。细节请参看下面三幅截图。
4.png
5.png
6.png
        
3、DMA的配置情况。
        
        
在TIM3和SPI1/SPI2外设配置中,开启了相关事件的DMA请求,汇总如下图。
7.png
        
4、准备用户代码。
        
        
当完成基于STM32CubeMx的初始化配置并生产初始化代码后,我们准备相应的用户代码。
        
        
这里准备了4个内存数组,分别存放SPI1/SPI2的收发数据。
        
        
在定时器的触发下,主SPI1逐字的向从SPI2发送“Hello! I AM STM32!”,从SPI2也逐字的向主SPI1回应“HI,MASTER,ME TOO!”,就这样循环操作。
        
        
下面两幅图是本示例中使用到的用户代码截图,是基于STM32Cube固件库而编写的。应该说简单明了,无须多做解释。
8.png
9.png


5、结果验证。
        
        
下面的截图是两个不同时刻SPI通信时的信号时序波形图。其中,紫色的是时钟信号,绿色、黄色是数据信号。两个数据信号间的间隔由定时器的更新周期决定。
10.png

        
        
下面的截图是在调试状态下的通过观察窗口得到的SPI1/SPI2分别从对方收到的内容。
11.png

        
        
最后小结下。整体上讲上述应用的实现不难,稍微有点综合性。

        
        
要实现上述应用,首先要求我们对DMA传输的原理有清晰的了解,触发事件,传输源、传输目标几个概念及关系要弄清楚。另外,即使我们基于STM32固件库开发,不一定能找到完完整整的现存代码,我们可能需要基于现有驱动代码自行组织用户程序。还有,在上面示例代码中,我没有开启DMA的中断事件,我们在具体应用中可以根据情况来决定是否启用DMA中断,比方开启传输完成中断等。顺便提醒下,这里我们基于定时器事件自行指定DMA的源端和目的端,一定要保证是该触发事件所请求的DMA可以到达的地方,编程设计前最好查看下相关芯片数据手册里的芯片模块及总线框架图。


回复

使用道具 举报

该用户从未签到

37

主题

2167

帖子

32

蝴蝶豆

论坛元老

最后登录
2023-2-9
发表于 2019-11-15 13:20:18 | 显示全部楼层
赞一个  
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

613

帖子

138

蝴蝶豆

金牌会员

最后登录
2022-5-19
发表于 2019-11-15 13:48:47 | 显示全部楼层
对数据通讯要求不高:不限时,不限量的就可以
回复 支持 反对

使用道具 举报

该用户从未签到

20

主题

621

帖子

152

蝴蝶豆

论坛元老

最后登录
2023-11-13
发表于 2019-11-15 14:32:21 | 显示全部楼层
楼主,有一个问题,L476的主频是80MHz,TIM3的驱动频率是多少?

问题:
1. TIM3可配置的最高定时频率是多少?
2. TIM3驱动SPI,可用的最高SPI时钟频率是多少?
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

1029

帖子

133

蝴蝶豆

金牌会员

最后登录
2021-4-24
发表于 2019-11-18 14:17:50 | 显示全部楼层
赞一个  
回复 支持 反对

使用道具 举报

该用户从未签到

450

主题

498

帖子

3

蝴蝶豆

社区小助手

最后登录
2020-7-30
 楼主| 发表于 2019-11-19 17:30:11 | 显示全部楼层
radio2radio 发表于 2019-11-15 14:32
楼主,有一个问题,L476的主频是80MHz,TIM3的驱动频率是多少?

问题:

这个可以看看数据手册哈
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-26 06:02 , Processed in 0.163864 second(s), 37 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表