0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于STM32定时器触发SPI逐字收发之应用示例

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 作者:黄工的嵌入式技术 2020-01-14 16:35 次阅读

我们在做SPI应用时,有时希望通过定时器来定时地触发SPI的收发,并利用DMA完成数据的传输。这里,以STM32L476芯片为例来做个演示,以供参考。

本示例的大致过程是这样的:

片内SPI1做Master,SPI2做Slave,均工作在全双工模式。

这里使用片内定时器TIM3,通过它的更新事件触发DMA请求,通过DMA将数据给到SPI1的数据寄存器并发送出去,同时也开启SPI1接收事件的DMA传输。总之,SPI2的收、发事件都启用DMA完成。

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

好,先基于STM32CubeMx进行初始化配置。

1. 对TIM3做基本配置。选择时钟源,先大致估算个定时器计时周期,调试时我们可以自行灵活调整。

开启基于TIM3更新事件的DMA配置。传输方向是从Memory 到 外设SPI1,即将内存数据传输到SPI1的数据寄存器进行数据发送,这里选用循环模式,以便测试。

2. 对SPI1/SPI2进行基本配置。细节请参看下面三幅截图。

3、DMA的配置情况。

在TIM3和SPI1/SPI2外设配置中,开启了相关事件的DMA请求,汇总如下图。

4、准备用户代码。

当完成基于STM32CubeMx的初始化配置并生产初始化代码后,我们准备相应的用户代码。这里准备了4个内存数组,分别用于存放SPI1/SPI2的收发数据。

在定时器的触发下,Master SPI1逐字的向Slave SPI2发送“Hello! I AM STM32!”,Slave SPI2也逐字的向Master回应“HI,MASTER,ME TOO!”,这样循环操作。下面两幅截图是本示例中使用到的用户代码,是基于STM32Cube固件库而编写的。应该说简单明了,无须过多解释。

5、结果验证。

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

下面的截图是在调试状态下的通过观察窗口得到的SPI1/SPI2分别从对方收到的数据,即SPI2收到的数据是“HELLO,I AM STM32!”,SPI1收到的数据则是“HI,MASTER,ME TOO!”

整体上讲,上述应用的实现不难,可能稍微有点综合性。

要实现上述应用,首先要求我们对DMA传输的原理有清晰的了解,触发事件,传输源、传输目标几个概念及关系要弄清楚。

另外,即使我们基于STM32固件库开发,不一定能找到完整的现存例程,我们可能需要基于现有驱动代码自行组织用户程序。

还有,在上面示例代码中,我没有开启DMA的中断事件,我们在具体应用中可以根据情况来决定是否启用DMA中断,比方开启传输完成中断等。

最后顺便提醒下,这里我们基于定时器事件的DMA请求而自行指定DMA的源端和目的端,‍一定要保证是该触发事件所请求的DMA可以到达的地方。建议编程设计前最好查看下相关芯片数据手册里的芯片模块及总线框架图,不然的话,有时你可能遇到你指定的DMA根本就不正常运作的情况。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2270

    文章

    10900

    浏览量

    355892
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1706

    浏览量

    91556
  • 定时器
    +关注

    关注

    23

    文章

    3247

    浏览量

    114769
收藏 人收藏

    评论

    相关推荐

    定时器相关的寄存有哪些类型

    在微控制编程中,定时器是一种非常常见的功能模块,用于实现各种定时和计数功能。定时器的工作原理是通过内部的计数来跟踪时间的流逝,当计数
    的头像 发表于 07-12 10:25 930次阅读

    关于定时器触发ADC连续采样dma传输的疑问求解?

    。 我想问两个问题: 第一:我上述的采样思路是否存在错误,因为我这几天写该程序的时候,从会有各种bug导致ESP32-S2重启(多数为开门狗超时) 第二:stm32具有定时器触发连续采样的功能,我更想
    发表于 06-14 07:25

    CW32使用DMA单通道、定时器触发ADC实现了多路AD采集

    本测试样例基于CW32F030C8T6MCU,使用DMA单通道、定时器触发ADC实现了12路AD采集。
    的头像 发表于 05-24 09:29 845次阅读
    CW32使用DMA单通道、<b class='flag-5'>定时器</b><b class='flag-5'>触发</b>ADC实现了多路AD采集

    stm32定时器的如何外部启动?

    我想利用stm32定时器精确定时一个信号从发生到结束的时间,想让定时器通过外部触发开启,一般有什么方法。
    发表于 05-10 06:40

    求助,关于STM32定时器级联做计数的问题求解

    最近在做一个设计,使用STM32L1的定时器做一个大的计数,每当外部PPS信号进来后,利用捕获功能来计算捕获值。这个计数是采用定时器级联
    发表于 05-10 06:15

    请问如何使用定时器的更新事件触发DMA读取6字节SPI数据?

    想用定时器的更新事件触发DMA读取SPI数据,现在有个问题是一次更新事件只能触发一次DMA传输,我想要定时器
    发表于 03-29 06:16

    如果STM32定时器外接了正交编码,该剩余通道是否能做PWM输出呢?

    其实,对于STM32芯片,编码输入信号就是定时器的计数时钟源之一。定时器外接了编码输入,若还有剩余通道的话,剩余通道依然可以实现输入捕获或输出比较功能。
    的头像 发表于 03-21 09:06 1652次阅读
    如果<b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>外接了正交编码<b class='flag-5'>器</b>,该剩余通道是否能做PWM输出呢?

    STM32L0使用定时器上升沿触发ADC采样时,采样频率如何确定?

    我想问一下,在使用定时器上升沿触发ADC采样时,采样频率如何确定,是定时器频率就等于ADC采样频率吗?用的是STM32L0
    发表于 03-20 06:37

    STM32U575定时器PWM触发DMA搬运内存时,为什么程序在DMA中断里出不来?

    STM32U575 定时器PWM触发DMA搬运内存,为什么程序在DMA中断里出不来?
    发表于 03-12 08:33

    使用555定时器的可调双定时器电路

    定时器 IC 555 是最通用和最常用的 IC 之一,因为它的应用范围更广,如 PWM放大器、延迟定时器、开关电路、占空比选择、时钟脉冲发生等。这也可用于各种应用,如精确
    的头像 发表于 02-25 15:16 2214次阅读
    使用555<b class='flag-5'>定时器</b>的可调双<b class='flag-5'>定时器</b>电路

    使用555定时器的报警电路图

    555定时器是一种集成电路芯片,常被用于定时器、脉冲产生和振荡电路。555可被作为电路中的延时器件、触发器或起振元件。
    的头像 发表于 02-02 11:14 5560次阅读
    使用555<b class='flag-5'>定时器</b>的报警<b class='flag-5'>器</b>电路图

    如何使用定时器触发器进行SPI DMA传输?

    我正在做一个项目,在这个项目中,我必须在 DMA 模式下通过 SPI 定期传输数据。 为了避免 CPU 干预,我想使用计时触发器触发 SPI
    发表于 01-30 08:08

    定时器原理能控制马达吗为什么

    定时控制。 定时器的工作原理是基于内部的振荡电路,通过稳定的时钟信号来触发或计时特定的事件。常见的定时器电路有555定时器和微控制
    的头像 发表于 01-23 15:21 667次阅读

    555定时器的基本功能 555定时器的工作原理及其应用

    定时器有三种基本工作模式,分别是单稳态、自由运放和双稳态。它可以在多种电子电路中实现功能的实现。下面将详细介绍它们的功能特点。 单稳态模式:在单稳态模式下,555定时器可以实现一个稳态触发器。当外部
    的头像 发表于 01-18 11:12 1.5w次阅读

    AWTK 开源串口屏开发(6) - 定时器的用法

    中,可以给每个控件(包括窗口)创建一个定时器定时器到点后触发v-on:timer事件。在AWTK串口屏中,提供了6个定时器相关函数:start_timer启动定
    的头像 发表于 01-13 08:24 574次阅读
    AWTK 开源串口屏开发(6) - <b class='flag-5'>定时器</b>的用法