jQuery 一次定时器_STM32定时器触发SPI逐字收发之应用示例

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

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

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

27c1daa20a11c560883349494b7f4719.png

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

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

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

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

8ec726318ffb1c070b5f52682afe5980.png

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

3effbefdbbf30bcba4cf6091105436d1.png

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

26d32ef4bce6bf130c03c5f70c88b397.png

7a8455d194b68f7661919ea5c9aacef5.png

ec88b90dc0097c6409c4ec0ff84080e2.png

3、DMA的配置情况。

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

85ab0e40c990c3c9b19262958541a2e1.png

4、准备用户代码。

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

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

4c4f3f779e85abc925fa26a659bc3594.png

f72240d36c638de6ac81000c60e3ccc3.png

5、结果验证。

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

1270bc74c71be56a026d5cfe2915e8af.png

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

bd8c4bde7b068fea90e6b33fb5be8b03.png

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

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

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

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

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

‧  END  

推荐阅读:

精选汇总 | 目录 | 搜索 2019全球半导体排行榜 嵌入式开发中那些常用的工具软件

关注微信公众号『strongerHuang』,后台回复“1024”,查看更多精彩内容。

06dbf667ff2137f47111943bd133a1af.png

长按识别图中二维码关注

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面简单介绍一下jQuery的一些特性和用法: 1、精准简单的选择对象(dom): 以下为引用的内容: $('#element');// 相当于document.getElementById("element") $('.element');//Class $('p');//html标签 $("form > input");//子对象 $("div,span,p.myClass");//同时选择多种对象 $("tr:odd").css("background-color", "#bbbbff");//表格的隔行背景 $(":input");//表单对象 $("input[name='newsletter']");//特定的表单对象 2、对象函数的应用简单和不限制: element.function(par); $(”p.surprise”).addClass(”ohmy”).show(”slow”)... 3、对已选择对象的操作(包括样式): 以下为引用的内容: $("#element").addClass("selected");//给对象添加样式 $('#element').css({ "background-color":"yellow", "font-weight":"bolder" });//改变对象样式 $("p").text("Some new text.");//改变对象文本 $("img").attr({ src: "test.jpg", alt: "Test Image" });//改变对象文本 $("p").add("span");//给对象增加标签 $("p").find("span");//查找对象内部的对应元素 $("p").parent();//对象的父级元素 $("p").append("Hello");//给对象添加内容 4、支持aJax,支持文件格式:xml/html/script/json/jsonp 以下为引用的内容: $("#feeds").load("feeds.html");//相应区域导入静态页内容 $("#feeds").load("feeds.php", {limit: 25}, function(){alert("The last 25 entries in the feed have been loaded");});//导入动态内容 4、对事件的支持: 以下为引用的内容: $("p").hover(function () { $(this).addClass("hilite");//鼠标放上去时 }, function () { $(this).removeClass("hilite");//移开鼠标 });//鼠标放上去和移开的不同效果(自动循环所有p对象) 5、动画: 以下为引用的内容: $("p").show("slow");//隐藏对象(慢速渐变) $("#go").click(function(){ $("#block").animate({ width: "90%", height: "100%", fontSize: "10em" }, 1000 ); });//鼠标点击后宽、高、字体的动态变化 6、扩展: 以下为引用的内容: $.fn.background = function(bg){ return this.css('background', bg); }; $(#element).background("red"); 如果要为每一个jQuery 对象添加一个函数,必须把该函数指派给 $.fn,同时这个函数必须要返回一个 this(jQuery 对象) jQuery相关 《Learning jQuery:Better Interaction Design and Web Development with Simple JavaScript Techniques》第一本由jQuery的开发人员写的关于如何学习jQuery的书已经于七月面世,同时还有三本相关的书在问世当中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值