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

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

3天内不再提示

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

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

我们在做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
    +关注

    关注

    2283

    文章

    10986

    浏览量

    361274
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1749

    浏览量

    94069
  • 定时器
    +关注

    关注

    23

    文章

    3272

    浏览量

    116699
收藏 人收藏

    相关推荐

    MCU定时器/计数

    RISC-V核低功耗MCU通过灵活的定时器架构、低功耗模式适配及硬件级中断优化,在工业控制、智能家居等场景中实现高精度计时与能耗控制的协同设计,满足复杂任务调度与实时响应的双重需求‌。 一、‌硬件
    的头像 发表于 04-27 13:54 82次阅读

    STM32定时器基本原理及常见问题培训资料

    STM32 定时器基本原理及常见问题培训资料v3.10 时基单元、捕捉比较功能、主从触发与级联、案例分享 培训内容:
    发表于 04-08 16:26

    定时器已安排!开发小白看过来~

    或周期性地执行代码段,为物联网设备的运行提供了精确的时间控制。在多种应用场景中都发挥着重要作用,例如:定时发送数据、周期性检查传感状态等。 Air201最新资料下载: www.air201.cn 本文将通过demo示例,带你了
    的头像 发表于 12-31 14:30 336次阅读
    <b class='flag-5'>定时器</b>已安排!开发小白看过来~

    定时器的工作方式介绍

    定时器是计算机和嵌入式系统中常见的一种硬件模块,用于实现定时和计数功能。定时器的工作方式通常由一组寄存来控制,这些寄存定义了
    的头像 发表于 07-12 10:29 1529次阅读

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

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

    tc397如何使用定时器的更新事件来触发dma搬运数据?

    请问有没有人使用过定时器的更新事件来触发dma搬运数据,或者哪里有相关的示例代码,我不知道应该使用gtm模块的哪个子模块来做这件事情,有经验的大佬可否指教下。
    发表于 07-05 06:36

    STM32G4系列芯片定时器的延时输出问题

    有人使用STM32G4系列芯片内部的多个定时器做PWM输出,输出频率一样,占空比也一样,均为50%。可是,当他中途调整各个定时器以相同的工作参数,即改变ARR的值和CCR值后,会发现TIM2和TIM5两个
    的头像 发表于 07-01 09:45 2356次阅读
    <b class='flag-5'>STM32</b>G4系列芯片<b class='flag-5'>定时器</b>的延时输出问题

    鸿蒙开发系统基础能力:Timer定时器

    设置一个定时器,该定时器定时器到期后执行一个函数。
    的头像 发表于 06-28 11:33 1302次阅读
    鸿蒙开发系统基础能力:Timer<b class='flag-5'>定时器</b>

    使用Arduino的可变定时器继电器设计

    定时器继电器,也被称为时间继电器,是一种在设定的时间间隔后触发特定操作的电子元件。它在工业自动化、家庭生活、交通管理等领域具有广泛的应用。定时器继电器的主要功能是通过设定特定的时间间隔,来控制电路的通断,实现设备的自动化操作。
    的头像 发表于 06-24 16:52 1430次阅读
    使用Arduino的可变<b class='flag-5'>定时器</b>继电器设计

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

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

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

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

    STM32L151定时器上升沿触发ADC采样,为什么每个PWM周期内会触发第二次采样?

    使用定时器触发ADC采样PWM正脉冲时刻的负载电压电流,触发ADC的定时器用的就是产生PWM的定时器,设置为上升沿
    发表于 05-24 07:37

    求助,关于ADC和触发器的基本问题求解

    我有一些关于 ADC 触发器的问题。 我知道我们可以使用同一个 gtm-adc-trigger 从一个原子定时器触发多个 ADC 组转换。 我想知道下面的配置是否合理。 1、一个原子
    发表于 05-20 06:54

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

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

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

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