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

定时器中断

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

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux第2课Windows下的环境配置-虚拟机安装

文章目录 Linux第2课Windows下的环境配置-虚拟机安装一、VMware虚拟机的安装(一)安装VMware(二)启动电脑本地的VMware相关服务 二、VirtualBox安装 Linux第2课Windows下的环境配置-虚拟机安装 本节课程提供了两种虚拟机的安装方法…

【Django开发】0到1美多商城项目md教程第5篇:短信验证码,1. 避免频繁发送短信验证码逻辑分析【附代码文档】

美多商城完整教程(附代码资料)主要内容讲述:欢迎来到美多商城!,项目准备。展示用户注册页面,创建用户模块子应用。用户注册业务实现,用户注册前端逻辑。图形验证码,图形验证码接口设…

Java笔试题总结

HashSet子类依靠()方法区分重复元素。 A toString(),equals() B clone(),equals() C hashCode(),equals() D getClass(),clone() 答案:C 解析: 先调用对象的hashcode方法将对象映射为数组下标,再通过equals来判断元素内容是否相同 以下程序执行的结果是: class X{…

NKCTF2024 re VM?VM!WP

逻辑似乎很简单(个鬼啊) 这个函数是把输入的字符转化为二进制并倒序存储 sub_1570太大了加载不出来,应该是加密的主逻辑,目的是需要输出1 可以通过删除栈的方法强行转化伪代码 首先删掉这部分 9A0改小点 这个也是 栈这里U一下再…

通讯录(顺序表的应用)

文章目录 顺序表思想实现通讯录头文件接口函数主函数 顺序表思想实现通讯录 实现通讯录前,我们考虑一下,通讯录需要包含什么内容? 联系人,联系人需要包含姓名年龄电话性别这3种基本信息。 我们知道顺序表实质是个数组&#xff…

【C++】C++中的list

一、介绍 官方给的 list的文档介绍 简单来说就是: list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中…

浅谈TCP(2):流量控制与拥塞控制

上文浅谈TCP(1):状态机与重传机制介绍了TCP的状态机与重传机制。本文介绍流量控制(Flow Control,简称流控)与拥塞控制(Congestion Control)。TCP依此保障网络的QOS(Quali…

【Leetcode每日一题】 递归 - 求根节点到叶节点数字之和(难度⭐⭐)(50)

1. 题目解析 题目链接:814. 二叉树剪枝 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 想象一下,你有一堆层层叠叠的积木,你想从底部开始,把那些标记为0的积木拿走。如…

【QT+QGIS跨平台编译】056:【PDAL+Qt跨平台编译】(pdalcpp错误处理)

点击查看专栏目录 文章目录 一、报错信息:二、原因分析三、解决思路四、原版FileUtils.cpp五、修改后的FileUtils.cpp一、报错信息: ① exists is unavaiable: introduced in macOS 10.15 ② create_directory is unavaiable: introduced in macOS 10.15 ③ create_director…

BCLinux-for-Euler配置本地yum源

稍微吐槽一句…… 在这片土地上,国产化软件的大潮正在滚滚而来,虽然都不是真正意义上的国产化,但是至少壳是国产的~~~ 之前使用的Centos7的系统,现在都要求统一换成BCLinux-for-Euler。说实话换了之后不太适应,好多用习…

练习实践-TLS02-会话恢复的两种形式-Session ID/SessionTicket

参考来源: 书籍:深入浅出https-从原理到实战(作者:虞卫东) 抓包分析文件可下载,来自github上的作者上传资源 会话恢复机制的背景 当客户端和服务器端握手成功,建立了一个完整的 TLS 连接&…

刷题之Leetcode35题(超级详细)

35.搜索插入位置 力扣题目链接(opens new window)https://leetcode.cn/problems/search-insert-position/ 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 你可…

ChatGPT 与 OpenAI 的现代生成式 AI(下)

原文:Modern Generative AI with ChatGPT and OpenAI Models 译者:飞龙 协议:CC BY-NC-SA 4.0 七、通过 ChatGPT 掌握营销技巧 在本章中,我们将重点介绍营销人员如何利用 ChatGPT,在这一领域中查看 ChatGPT 的主要用例…

jvisualvm 使用教程

之前看过 jvisualvm,但是那个时候对 JVM 并不是很熟悉,后面看了下八股文,看了下 JVM 的相关知识之后,发现多了解点 JVM 的东西,对我们 CRUD 其实是有指导意义的,就比如我们通常会 new 一堆的没有用到的对象…

读所罗门的密码笔记10_寒武纪国家与城堡国家

1. DARPA 1.1. DARPA仍然是世界领先的尖端高科技研究推动者之一,资助研发人员开展各个领域的前沿研究,从自动驾驶汽车到植入式神经芯片,从复杂的系统分析(比如分析气候变化)到网络安全,无一…

31. 下一个排列 —— LeetCode (python) [PS: LeetCode 运行环境疑似出错]

# encoding utf-8 # 开发者:xxx # 开发时间: 20:26 # "Stay hungry,stay foolish."class Solution(object):def nextPermutation(self, nums):import itertoolsl len(nums)a tuple(nums)nums.sort()permutations_lst list(ite…

DDD 的四层领域模型是怎样的?包含哪些基础概念?

DDD的四层领域模型如下所示: 展现层:这一层负责向用户显示信息和解释用户命令,完成前端界面逻辑。并将用户请求传递给应用层。应用层:这一层是很薄的一层,负责协调领域层中的领域对象,组成具体应用场景。应…

JAVA JVM内存模型和GC分配和回收

Java 的JVM简介 JVM是(Java Virtual Machine)Java虚拟机的缩写。 JVM是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 ​ 在Java程序运行时,所有的.class类需要加载到JVM中才能执行代码逻辑。不…

Python环境下基于离散小波变换的信号降噪方法

Mallat创造了小波分析中的经典理论之一,即多分辨率分析的概念。后来,在Mallat与Meyer的共同努力之下,他们又在这一理论的基础上发明了离散小波变换的快速算法,这就是Mallat塔式算法,这种算法可以大量减少计算时间。在之…

解锁未来:大模型GPT的应用架构与创新实践

在人工智能的黄金时代,大模型如GPT(Generative Pre-trained Transformer)已成为技术创新和应用发展的前沿。它不仅重新定义了人机交互的方式,还在多个领域内展现出了巨大的应用潜力。本文将深入探讨大模型GPT的应用架构&#xff0…