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

2024-04-04 20:44

本文主要是介绍江协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

 

 

这篇关于江协STM32:定时器定时中断和定时器定时闹钟的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/876805

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

ActiveMQ—消息特性(延迟和定时消息投递)

ActiveMQ消息特性:延迟和定时消息投递(Delay and Schedule Message Delivery) 转自:http://blog.csdn.net/kimmking/article/details/8443872 有时候我们不希望消息马上被broker投递出去,而是想要消息60秒以后发给消费者,或者我们想让消息没隔一定时间投递一次,一共投递指定的次数。。。 类似

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类