江协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

 

 

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

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

相关文章

Golang Channel底层实现原理

1、本文讨论Channel的底层实现原理 首先,我们看Channel的结构体 简要介绍管道结构体中,几个关键字段 在Golang中,管道是分为有缓冲区的管道和无缓冲区的管道。 这里简单提一下,缓冲区大小为1的管道和无缓冲区的管道的区别&…

维基百科推广方法及注意事项解析-华媒舍

1. 维基百科 维基百科是一个自由而开放的在线百科全书,由志愿者共同创建和编辑。它是全球最大的百科全书,包含了广泛的主题和知识。作为一个公共平台,维基百科是广告和宣传的禁区,但它可以是一个有效的推广工具,帮助您…

ENSP华为防火墙WEB登录操作指南

ENSP华为防火墙WEB登录操作指南 华为防火墙登录WEB 1、华为防火墙配置:(需要在互联接口下放通https和ping) int g0/0/0 service-manage https permit service-manage ping permit 2、电脑需要配置虚拟网卡 3、虚拟网卡与云和防火墙配置的IP地…

【学习心得】Numpy学习指南或复习手册

本文是自己在学习Numpy过后总是遗忘的很快,反思后发现主要是两个原因: numpy的知识点很多,很杂乱。练习不足,学习过后一段时间不敲代码就会忘记。 针对这两个问题,我写了这篇文章。希望将numpy的知识点织成一张网&…

PLC通过Modbus转Profine网关接温度传感器方案

Modbus转Profinet网关用于实现Modbus协议和Profinet协议之间的数据转换和传输。Modbus转Profinet网关接温度传感器的方案主要涉及将Modbus协议的温度传感器数据转换为Profinet协议,以便与工业自动化系统中的其他设备进行通信和数据交换。 以下是实现此方案的基本步骤…

[StartingPoint][Tier0]Mongod

Task 1 How many TCP ports are open on the machine? (机器上打开了多少个 TCP 端口?) Example: $ sudo nmap -sS -T4 10.129.222.112 -p 27017,22 2 Task 2 Which service is running on port 27017 of the remote host? (哪个服务正在远程主机的端口 270…

设计模式总结-面向对象设计原则

面向对象设计原则 面向对象设计原则简介单一职责原则单一职责原则定义单一职责原则分析单一职责原则实例 开闭原则开闭原则定义开闭原则分析开闭原则实例 里氏代换原则里氏代换原则定义里氏代换原则分析 依赖倒转原则依赖倒转原则定义依赖倒转原则分析依赖倒转原则实例 接口隔离…

向量旋转操作之分段递归交换

开篇 这是对于之前一维向量左旋操作问题的最后一个解法,也是关于这个问题的最后一篇文章。在之前的文章中,我们分别用求逆法、取模置换法对该问题进行了解答,今天,使用的是分段递归的方式。 问题概要 将一个n元一维向量向左旋转i个…

探索数据库-------MYSQL故障排除与优化

目录 mysql逻辑架构图 一、MySQL 数据库故障 1.1 MySQL 单实例故障排查 1.1.1故障现象 1 1.1.2故障现象 2 1.1.3故障现象 3 1.1.4故障现象 4 1.1.5故障现象 5 1.1.6故障现象 6 1.1.7故障现象 7 1.1.8故障现象 8 1.2MySQL 主从故障排查 1.2.1故障现象 1 1.2.2故障…

电感与磁珠的区别以及在EMC的作用

电感与磁珠的区别以及在EMC的作用 电感的定义和特性电感的频率特性噪声对策方法电感的直流叠加饱和绕组型电感的特性 电感的定义和特性 电感是能够把电能转化为磁能而存储起来的元器件。电感器具有一定的电感,它只阻碍电流的变化。电感器又称扼流器、自电抗器、动态…

NPW(监控片的)的要点精讲

半导体的生产过程已经历经数十年的发展,其中主要有两个大的发展趋势,第一,晶圆尺寸越做越大,到目前已有超过70%的产能是12寸晶圆,不过18寸晶圆产业链推进缓慢;第二,电子器件的关键尺寸越做越小&…

《QT实用小工具·五》串口助手

1、概述 源码放在文章末尾 该项目实现了串口助手的功能,可在界面上通过串口配置和网络配置进行串口调试。 基本功能 支持16进制数据发送与接收。支持windows下COM9以上的串口通信。实时显示收发数据字节大小以及串口状态。支持任意qt版本,亲测4.7.0 到…

【Canvas与艺术】绘制“Best Product Guaranteed”标志

【图示】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>用Canvas绘制“Best Product Guaranteed”标志</title><sty…

剖析C++中的继承

剖析C继承 文章目录 剖析C继承前言一、继承的概念1. 概念2. 定义方式3. 注意要点 二、基类与派生类对象赋值转换三、继承中的作用域四、基类与派生类默认成员函数调用关系五、继承与友元函数六、继承与静态成员七、菱形继承总结 前言 ​ 继承是C中非常重要的一大特性&#xff…

一分钟了解MOS管基础知识

场效应管&#xff08;Field-Effect Transistor&#xff0c;简称FET&#xff09;是电子技术中广泛使用的一种半导体器件&#xff0c;具有高输入阻抗、噪声低和低功耗等优点。 简介 场效应管是一种电压控制器件&#xff0c;其工作原理是通过改变栅极&#xff08;Gate&#xff09;…

python的pip如何升级

升级pip的方法如下&#xff1a; 打开命令行工具。在Windows系统中&#xff0c;可以通过按下WinR键&#xff0c;然后输入"cmd"来打开命令提示符&#xff1b;在Mac或Linux系统中&#xff0c;可以直接打开终端。检查当前pip版本。在终端或命令行中输入以下命令&#…

2024年03月CCF-GESP编程能力等级认证Scratch图形化编程四级真题解析

本文收录于专栏《Scratch等级认证CCF-GESP真题解析》,专栏总目录・点这里 一、单选题(共 10 题,每题 2 分,共 30 分) 第1题 小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是?( )。 A、小程序 B、计时器 C、操作系统 D、神话人物 答案:C…

银行数字化转型导师坚鹏:银行数字化转型给分行带来的8大价值

银行数字化转型给分行带来的8大价值 银行数字化转型对不仅对总行产生了深远影响、给总行带来了新质生产力&#xff0c;对分行也会产生重要价值&#xff0c;银行数字化转型导师坚鹏从以下8个方面进行详细分析&#xff0c;相信能够给您带来重要启发&#xff0c;从而加速银行分行…

[HackMyVM]靶场Economists

难度:Easy kali:192.168.56.104 靶机:192.168.56.145 端口扫描 ┌──(root㉿kali2)-[~] └─# nmap 192.168.56.145 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-04 18:58 CST Nmap scan report for 192.168.56.145 Host is up (0.000081s latency). Not show…

完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买!购买本专栏住如有什么源码需要,可向博主私信,第二天即可发布!博主有几万资源) 完美运营版商城/拼团/团购/秒杀/积分…