江协STM32:定时器定时中断和定时器定时闹钟

news2025/1/15 19:33:10

定时器中断

9bc44de11ff049278e1e9181d61db866.png

a33df75fdf6641d59e81e48d30c6ca93.png新建文件

761a9c2ab2fd476381fcf85ad10abc74.png

按这个图来编写程序

第一步:RCC开启时钟,定时器到基准时钟和整个外设到工作时钟就会同时打开

第二步:选择时基单元的时钟源,对于定时中断选择内部时钟源

第三步:配置时基单元,ARR,PSC,CNT,这些参数用一个结构体就能配置好

第四步:配置输出中断控制,允许更新中断输出到NVIC

第五步:打开NVIC,在NVIC中打开定时器中断到通道,并分配一个优先级

第六步:运行控制,整个模块配置完成后,我们还需要使能一下计数器,不然计数器不运行,当定时器使能后,计数器开始计数,当计数器更新时,触发中断

最后在写一个定时器中断函数,这样这个中断函数每隔一段时间就能自动执行一次了

 

定时器库函数

1e54b0ab569a4bd1a449267a7842b2ca.png

说到的函数都是这节课用到的

1.TIM_Delint:恢复缺省配置

2.TIM_TimeBaseInit:时基单元初始化,很重要,它是用来配置时基单元的,第一个参数TIMx选择某个定时器,第二个结构体,里面包含了配置时基单元的一些参数

3.TIM_TimeBaseStructInit:这个函数可以把结构体变量赋一个默认值

4.TIM_Cmd:这个是用来使能计数器的

b78f5cbda36b480a9db35dab3f6224fc.png

对应的就是图上的运行控制,第一个参数TIMx选择某个定时器,第二个NewState新到状态,也就是使能还是失能,使能,计数器就能运行,失能,计数器就不运行

5.TIM_ITConfig:这个是用来使能中断输出信号的,也就是使能外设到中断输出

.cd5ba34a2fdc4a459aebd4b1f1eb8994.png

对应的就是这个位置,第一个参数TIMx选择某个定时器,第二个参数TIM_IT,选择要配置哪个中断输出,第三个参数选择新的状态,使能还是使能

 

af9b8c30692645778070ede303623279.png

这个六个函数对应下图,这里,时基单元的选择部分

e82e645ff5df4c57bef1895bc7288e49.png

可以选择下图这些

d959e7ad65114a2aab0d7c441e40889c.png

然后回到刚才到6个函数

3ac6db06bc924c7386a491e94dabdb02.png

1.TIM_InternalClockConfig:选择内部时钟,只有一个参数,选要配置的定时器,调用到话,就是下图

2a69aa8dcf2c49dba24653b1643e6a42.png

 

 

954cecd681164e459dbd5f21cd63a869.png

2.TIM_ITRxExternalClockConfig:选择ITRx其他定时器的时钟,第一个参数是TIMx,选择要配置的定时器,第二个参数,选择要接入哪个其他到定时器,调用一下就是下图

04319f661dd84a9ca8d6b30a9d360551.png

 

5d759357e7864c778385fe233677b93f.png

3.TIM_TIxExternalClockConfig:选择TIx捕获通道到时钟,第一个参数TIMx选择要配置的定时器,第二个参数选择TIx具体的个引脚,后面两个参数,是输入的极性和滤波器,对应外部引脚到波形,一般都会有极性选择和滤波器,这样更灵活一些,调用这个函数,就是下图

0368532492b94d97a8fc5a49a7e9e695.png

 

aa4680fb46a24b7797f82d2d84a8d5a6.png4.TIM_ETRClockModelConfig:选择ETR外部时钟模式1输入的时钟,第一个参数TIMx选择配置的定时器,第二个参数,外部触发预分频器,可以对ETR到外部时钟在提前做一个分频,后面两个参数极性和滤波器,调用到话,就是下图

757c62812a5a4976b7cc53c0dd78f3ac.png

 

 

5520d8d7b7db496a95c4960665695e87.png5.TIM——ETRClockMode2Config:选择ETR通过外部时钟模式2输入的时钟

,参数和第四个一样,如果调用就是下图f58ac3ed59fa4e45b72066ef91b6a562.png

对于ETR输入的外部时钟而言,第四个跟第五个两个函数是等效的,如果不需要触发输入到功能,两个函数可以互换

9240dca15796448ebb7aa99f7564983d.png

6.TIM——ETRConfig:这个不是用来选择时钟的,就是单独来配置ETR引脚到预分频器,极性,滤波器这些参数的

 

函数介绍完了

总结一下:

时钟源选择,用下图六个函数

8fce4134cac54041868bc180526683d1.png

时基单元,用TimeBaseInit函数

中断输出控制,用ITConfig函数

NVIC,用NVIC_Init函数

运行控制,用TIM_Cmd函数

这样初始化基本ok

 

下面继续看几个函数,因为在初始化结构体里有很多关键的参数,比如自动重装值和预分频值等等,这些参数可能会在初始化之后还需要更改,如果为了该某个参数还需要在调用一次初始化函数,比较麻烦,所以就有一些单独到函数,可方便的更改这些关键参数

ab481c5b1a8446a19d20487051acf752.png

1.TIM_PerscalerConfig:就是用来单独写预分频值的,第一个参数选择你配置到定时器,第二个参数选择你要写入的预分频值,第三个参数写入的模式

 

1591045fc043494697be9ff3e9288f08.png

2.TIM_CounterModeconfig:用来改变计数器的计数模式,第一个参数选择要配置的定时器,第二个参数选择新的计数器模式

 

5650abfb5b1548dabc83787e921165ee.png3.TIM_ARRPerloadConfig:自动重装器预装功能配置,第一个参数选择要配置的定时器,第二个参数选择使能还是失能

76ea1c5b4c2a4d578e909d4652270a8d.png4.TIM_SetCounter:给计数器写入一个值,如果你想手动给一个计数值,就可以用这个函数,

2ba0d4b0a8304e2a984519675120485e.png

5.TIM_SetAutoreload:给自动重装器写入一个值,如果你想手动给一个自动重装值,就可以用这个函数

c6b1536e0f9446a2940bdffa58307d4c.png6.TIM_GetCounter:获取当前计数器的值,如果你想看当前计数器计到哪里了,就可以调用一下这个函数,返回值就是当前计数器的值

 

54983c7ce29347f2913f276ebe01a656.png

7.TIM_GetPrescaler:获取当前到预分频器的值,如果想看预分频值,就调用一下这个函数

最后这四个函数

b2bb06d2b36843cebac2f5cc58584e5d.png

这些就是用来获取标志位和清除标志位的

 

 

下面来配置定时器

 

上字,下图

初始化TIM2,通用定时器

第一步:开启时钟,这里注意,要使用APB1到开启时钟函数,因为TIM2是APB1总线的外设

395ae63fce8e41b49b0f0f0bf1414c21.png

这样时钟就开启了

第二步:选择时基单元的时钟,我们要选择内部时钟,参数些TIM2,这样TIM2到时基单元就由内部时钟来控制了,这个代码可写可以不写,因为定时器上电后默认就是使用内部时钟,如果不调用这个函数,那也是使用的内部时钟

31ea03573db64cd9918ec350640929f9.png

第三步配置时基单元:

第一个参数是选择定时器,第二个参数是结构体,然后把结构体成员引出来,然后点结构体成员去一个一个看他们要怎么配置

98c02653b84b4da9ba2f33e4c621be53.png

现在来看看结构体参数

第一个参数指定时钟分频,看这个地方的

2e2355a5ee5d4b34b5f83b6e2f4cc3d8.png

然后Ctrl+f,搜索

第一个是1分频,也就是不分频

第二个是2分频,第三个是4分频

我们选择1分频

dd22ac9e11894f46ac8010fabb7ebe4e.png

4d5f56d616d24428ae3b41db71178d12.png

第二个参数:计数器模式,在tim.h是最上面

6819f9c4f21e4def89d4de93d6cdd64b.png

还是Ctrl+f

第一个是向上计数,第二个是乡下计数,还有三种中央对齐的模式

我们选择向上计数,向上计数就是12345这样,而且最常用

27ef0aa6c0d148a28238d4df346b02bb.png

第三个参数:ARR自动重装的值

ffc7bf62f17646b1bd2463083a801d47.png

这三个参数就是时基单元里面每个关键寄存器到参数了

9c8b7b7e36354edc924eb8a444358acb.png

这个画出来到参数是重复计时器,高级定时器才有,我们通用定时器不需要,所以写0

c22fb3f58cae4d959237fdc035cb49d6.png

23b6b4d9e89e48e3b03938493ff21d8e.png

决定,定时时间到参数就是这两个

41ea48d360364396a3dc5ad61bce0860.png

如果想定1s的时间,就参照这个图

下面第二个计算式子

定时频率=72M/(PSC+1)/(ARR+1)

定时1S,也就是定时频率为1HZ

PSC给7200-1,ARR给10000-1,因为是从0开始所以-1,不像人那样从1开始数

在这里我们预分频是对72M进行7200分频,得到到就是10K到计数频率,在10k到频率下,计10000个数,就是1s的时间

38cb477ca6764a3e97b2d5788f19af99.png

7f09804d433f479887300eb88865e0c9.png

 

这样我们的时基单元就配置好了c3ce5fb3e180440ba86eac343f7b5bf7.png

第四步:使能更新中断,也就是中断输出控制

第一个参数选择TIM2

第二个参数可以是下图到任意组合,我们用IT_UPdate,更新中断

0279bf8c2d194fe3ba722babc443928e.png第三个参数写ENABLE

这样就开起了更新中断到NVIC到通路

33e2d982874a4cfda957e66cc60b8e67.png

第五步:配置NVIC

首先NVIC优先级分组,选择分组2

5dc998008d85460bad3056f3c457cf61.png

然后初始化NVIC,把结构体成员引出来,然后写参数

ff5cf7b1c1d941cebbf3f7a1724c0ec9.pngNVIC结构体第一个参数,中断通道然后跳转搜索,找到这个参数

94adcd6dcfdc4750b135b12ebef6ab78.png

复制

1448bd20e2724bfd9c3b0d66d0ec7724.png

第二个参数,直接ENABLE

f7bab5410b0241708fe8ee3c268891c1.png

剩下两个参数是抢占优先级和响应优先级,给个2,1

463cfb48ea7e407caca4db639febc6c2.png

,NVIC配置完了,这样中断通道就打通了

c7f5e2c4b2ce4cf584f8eb1e07a477ea.png

 

然后还有最后一步,启动定时器,在tim.h里面找下图的参数

46149036398a42fda2e36500d8e7d819.png

第一个参数给TIM2,第二个参数ENABLE

396abef80dec4ad8862b78dce6fb842f.png

这样定时器就可以开始工作了,当产生更新时就触发中断

到这里,整个定时器中断到初始化代码就完成了

,然后就开始写中断函数了

 

在STM32中,中断函数到名字都是固定的,每个中断通道对应一个中断函数,所以你用什么,就找什么,在启动文件里面找

18502179f6d54d738fd72bc260783958.png

中断函数

a77ce2b676624fcb901e6a9a0c4b02dc.png

当定时器产生更新中断时,这个函数就会自动被执行

b934e2a162ea4fff8fcd77597656fb29.png

在进入函数之后,我们还是按照规矩,检查一下中断标志位,这个标志位是看你用什么,就设置什么

TIm_GetTStatus:获取中断标志位

e0b42f07f97646bf970ea2dbe5854377.png

第一个参数是TIM2,第二个参数是想看哪个中断的标志位,这里选择下图更新中断

SET为高电平

100a801b317941d8b361275b60084b1c.png

39ca1949c6514ec6934b28708dceeee3.png

最后还要记得清除标志位

94c7db9528c249ecaf6391a66371cbd1.png

这样中断函数到模板就写完了,记得把.c的文件,到.h里面声明一下,中断函数就不用声明了

然后在主程序写,包含一下头文件

ffece5cd31ab468aa1bcd31dde4b3fe0.png

然后主函数调用,初始化定时器,这样定时器就能工作了

1513be7a856742d9bc372ecf39a1d52b.png

然后创建一个Num变量计数

0aaceaecbf8e4d668909bd8e6e066ece.png

然后在主函数里面写中断函数,把定时器里面到中断函数注释掉,因为这个Num需要在main.c和mian.c中断函数一块实现,如果Num一个在main.c,一个在Timer.c中断函数,那这样就会报错,所以把中断函数直接放在main.c里面

或者就是在Timer.c文件里面到Num变量前面加一个extern

c350e0effe3f45678f5c7f323f72de9d.png

 

这里我们选择第一个方法,对于定时中断而言,中断函数就是位别的文件服务的,所以哪里需要用到就放哪里,这样更方便

2145b57f8e8641d4803572388beb10fc.png

在main.c里面,Num自动++,然后我们在主循环里显示一下

6730ed7bcae14667ac819fb079143f3c.png

39b0681f7e0440b8a85fbc6a38251ce1.png

然后就行了,不过还有个问题,每次复位都是从1开始,说明中断每次都是自己先中断了一次,我们要从0开始,改一下这里,手动把更新中断标志位清除一下,就可以了

98ee221cddd447d9a273911728b68581.png

 

 

 

 

 

定时器定时闹钟

a7d2cf60214c4d88a96e10ed4dfb828e.png

这个就不使用内部时钟了,去tim.h里面找选择时钟到函数

然后我们选择这个时钟,通过ETR引脚到外部时钟模式2配置

90f4d594e98a407d99e023477bac1f52.png

第一个参数TIM2

第二个参数外部触发预分频器,可以是下面这些值

b0f1821dbabe4777b94d1cd16a3a7537.png

然后这个不需要分频,所以选择第一个TIM_ExtTRGPSC_OFF

 

第三个参数是外部触发的极性

第一个是反向,就是低电平或下降沿有效,第二个是不反向,就是高电平或上升沿有效

这个根据自己需求,这里选不反向

5244ffd4e8fc4708b1673984d2db08f3.png

 

第四个参数是外部触发滤波器,这个值必须是0x00到0x0f之间到一个值,这个值是决定N和f的,这里暂时不用滤波器,

滤波器就是以一个采样频率f采样N个点,如果N个点都一样,才会有效输出

写0x0f

26cf8b1a9cc34d99a74e506242f69996.png

这样通过ETR外部时钟模式2就配置好了

 

引脚要用到GPIO,所以,还要配置GPIO

开启GPIO时钟

6e5a3b3c6c10443cad12917b628e5c56.png

然后初始化GPIO,把结构体成员都引出来,然后看个个参数怎么配置

9d7a9c49eae542c8852845cbfff1f5db.png

推荐用浮空,但是这里用上拉输入,因为一旦悬空,电平就会跳个没完

什么时候用浮空输入:当你外部到输入信号功率很小,内部到上拉电阻可能会影响到这个输入信号,这时候就可以用浮空输入,防止影响外部输入到电平

d20c34e6fae344379935e7b16420b66b.png

这里把这两个改一下

1d8c5d03a6c24c3987dc36bb310aca45.png

因为不需要分频所以把这个给1,自动重装值给10

412ecf4c5e4a45c88cbf6095a60499e6.png

最后还想看看CNT计数器到值

4e29188bdb0444f1a82473deb65e8e6e.png

然后记得声明一下aa55876d5b4c4179b4a8ecbfa074b23f.png

ef7b8095fc56497d860006b96991ce1b.png

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1569700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS设置网页背景

目录 概述: 1.background-color: 2.background-image: 3.background-repeat: 4.background-position: 5.background-attachment: 6.background-size: 7.background-origin: 8.background-…

【Linux】Ubuntu 磁盘管理

准备一个U盘或者SD卡(含读卡器),并将其格式化成 FAT32 格式,不要使用NTFS格式(这是微软的专利,大部分Linux系统不支持)和exFAT格式(有的Linux系统也不支持)。 如果Ubun…

Linux云计算之Linux基础2——Linux发行版本的安装

目录 一、彻底删除VMware 二、VMware-17虚拟机安装 三、MobaXterm 安装 四、Centos 发行版 7.9的安装 五、rockys 9.1的安装 六、ubuntu2204的安装 一、彻底删除VMware 在卸载VMware虚拟机之前,要先把与VMware相关的服务和进程终止 1. 在windows中按下【Windo…

【算法练习】28:选择排序学习笔记

一、选择排序的算法思想 弄懂选择排序算法,先得知道两个概念:未排序序列,已排序序列。 原理:以升序为例,选择排序算法的思想是,先将整个序列当做未排序的序列,以序列的第一个元素开始。然后从左…

Python快速入门系列-7(Python Web开发与框架介绍)

第七章:Python Web开发与框架介绍 7.1 Flask与Django简介7.1.1 Flask框架Flask的特点Flask的安装一个简单的Flask应用示例7.1.2 Django框架Django的特点Django的安装一个简单的Django应用示例7.2 前后端交互与数据传输7.2.1 前后端交互7.2.2 数据传输格式7.2.3 示例:使用Flas…

蓝桥杯23年第十四届省赛-异或和之和|拆位、贡献法

题目链接: 蓝桥杯2023年第十四届省赛真题-异或和之和 - C语言网 (dotcpp.com) 1.异或和之和 - 蓝桥云课 (lanqiao.cn) 参考题解: 蓝桥杯真题讲解:异或和之和 (拆位、贡献法)-CSDN博客 洛谷P9236 [蓝桥杯 2023 省 A]…

2024 年最新使用 Wechaty 开源框架搭建部署微信机器人(微信群智能客服案例)

读取联系人信息 获取当前机器人账号全部联系人信息 bot.on(ready, async () > {console.log("机器人准备完毕&#xff01;&#xff01;&#xff01;")let contactList await bot.Contact.findAll()for (let index 0; index < contactList.length; index) {…

STC89C51学习笔记(二)

STC89C51学习笔记&#xff08;二&#xff09; 综述&#xff1a;本文简要介绍了51单片机以及示例了如何成功运行一个程序&#xff08;点亮一个LED&#xff09;。 一、单片机介绍 单片机简称MCU&#xff0c;MCUCPURAMROM定时器中断系统通讯协议等单片机任务是信息采集、处理、…

Go 源码之互斥锁 Mutex

文章目录 一、总结二、源码&#xff08;一&#xff09;Mutex&#xff08;二&#xff09; Lock&#xff08;三&#xff09;Unlock 三、常见问题有劳各位看官 点赞、关注➕收藏 &#xff0c;你们的支持是我最大的动力&#xff01;&#xff01;&#xff01;接下来会不断更新 golan…

2.Swift基础控件:图标文字按钮

Swift图标标题按钮 一、自定义IconTitleButton类 import Foundation/* 枚举 设置 图片的位置 */ enum ButtonImagePosition : Int {case imageTop 0case imageLeftcase imageBottomcase imageRight } extension UIButton {/**type &#xff1a;image 的位置Space &#xff1…

代码审计-PHP原生开发篇SQL注入数据库监控正则搜索文件定位静态分析

文章目录 前言1、Bluecms-CNVD-1Day-常规注入审计分析2、emlog-CNVD-1Day-常规注入审计分析3、emlog-CNVD-1Day-2次注入审计分析 前言 挖掘技巧&#xff1a; -语句监控-数据库SQL监控排查可利用语句定向分析 -功能追踪-功能点文件SQL执行代码函数调用链追踪 -正则搜索-(update…

时序预测 | Matlab实现SOM-BP自组织映射结合BP神经网络时间序列预测

时序预测 | Matlab实现SOM-BP自组织映射结合BP神经网络时间序列预测 目录 时序预测 | Matlab实现SOM-BP自组织映射结合BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SOM-BP自组织映射结合BP神经网络时间序列预测&#xff08;完整源码…

Flutter-发布插件到pub上传不上问题

问题1&#xff1a; 尝试指令&#xff1a; flutter packages pub publish --serverhttps://pub.dartlang.org问题2&#xff1a; 问题1解决后&#xff0c;进入验证身份&#xff0c;点击终端显示的链接&#xff0c;跳转到google验证&#xff0c;记得这里要科*学上网&#xff0c;点…

Collection与数据结构 链表与LinkedList(三):链表精选OJ例题(下)

1. 分割链表 OJ链接 class Solution {public ListNode partition(ListNode head, int x) {if(head null){return null;//空链表的情况}ListNode cur head;ListNode formerhead null;ListNode formerend null;ListNode latterhead null;ListNode latterend null;//定义…

阿里云服务器配置CPU内存带宽ECS规格如何选择?8000元预算

8000元预算如何选择阿里云服务器配置&#xff1f;八千预算可选的阿里云服务器配置相当高了&#xff0c;这个预算可以购买阿里云企业级独享型云服务器&#xff0c;至少8核以上的配置&#xff0c;这个预算可以支持复杂、高负载或大规模的业务需求。阿里云服务器网整理8000元/月预…

pycharm和Spyder多行注释快捷键

1.选取注释内容 2.pycharm&#xff1a;使用Ctrl/ 3.Spyder&#xff1a;使用Ctrl1 效果图

数字乡村创新实践探索:科技赋能农业现代化与乡村治理体系现代化同步推进

随着信息技术的飞速发展&#xff0c;数字乡村作为乡村振兴的重要战略方向&#xff0c;正日益成为推动农业现代化和乡村治理体系现代化的关键力量。科技赋能下的数字乡村&#xff0c;不仅提高了农业生产的效率和品质&#xff0c;也为乡村治理带来了新的机遇和挑战。本文旨在探讨…

接口调用成功后端却一直返回404

vuespringboot 我在vue.config.js中配置了向后端的反向代理 然后使用了axios向后端发送post请求 可以看到可以接收到前端传来的值 但是前端控制台却报了 “xhr.js:245POST http://localhost:7777/api/login 404 (Not Found)” 最后询问我那智慧的堂哥... ... 解决办法是把C…

DFS:深搜+回溯+剪枝解决矩阵搜索问题

创作不易&#xff0c;感谢三连&#xff01;&#xff01; 一、N皇后 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<vector<string>> ret;vector<string> path;bool checkcol[9];bool checkdig1[18];bool checkdig2[18];int n…

Chat-REC: Towards Interactive and Explainable LLMs-Augmented Recommender System

1、动机 推荐系统被应用于推荐服务&#xff0c;提高人们的生活质量&#xff0c;但仍存在一些问题。缺少交互性、可解释性&#xff0c;缺乏反馈机制&#xff0c;以及冷启动和跨域推荐。 Chat-Rec 将用户画像和历史交互转换为 Prompt&#xff0c;有效地学习用户的偏好&#xff…