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

定时器中断

新建文件

按这个图来编写程序

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

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

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

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

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

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

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

定时器库函数

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

1.TIM_Delint:恢复缺省配置

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

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

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

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

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

.

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

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

可以选择下图这些

然后回到刚才到6个函数

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

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

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

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

5.TIM------ETRClockMode2Config:选择ETR通过外部时钟模式2输入的时钟

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

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

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

函数介绍完了

总结一下:

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

时基单元,用TimeBaseInit函数

中断输出控制,用ITConfig函数

NVIC,用NVIC_Init函数

运行控制,用TIM_Cmd函数

这样初始化基本ok

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

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

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

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

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

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

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

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

最后这四个函数

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

下面来配置定时器

上字,下图

初始化TIM2,通用定时器

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

这样时钟就开启了

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

第三步配置时基单元:

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

现在来看看结构体参数

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

然后Ctrl+f,搜索

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

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

我们选择1分频

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

还是Ctrl+f

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

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

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

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

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

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

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

下面第二个计算式子

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

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

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

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

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

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

第一个参数选择TIM2

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

第三个参数写ENABLE

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

第五步:配置NVIC

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

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

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

复制

第二个参数,直接ENABLE

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

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

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

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

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

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

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

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

中断函数

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

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

TIm_GetTStatus:获取中断标志位

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

SET为高电平

最后还要记得清除标志位

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

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

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

然后创建一个Num变量计数

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

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

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

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

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

定时器定时闹钟

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

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

第一个参数TIM2

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

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

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

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

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

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

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

写0x0f

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

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

开启GPIO时钟

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

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

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

这里把这两个改一下

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

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

然后记得声明一下

相关推荐
scilwb10 小时前
RoboCon考核题——scilwb
单片机
点灯小铭11 小时前
基于STM32单片机智能RFID刷卡汽车位锁桩设计
stm32·单片机·汽车·毕业设计·课程设计
bai54593612 小时前
STM32 软件I2C读写MPU6050
stm32·单片机·嵌入式硬件
逼子格14 小时前
AT89C52单片机介绍
单片机·嵌入式硬件·51单片机·硬件工程师·硬件工程师真题·at89c52·器件手册
生涯にわたる学び16 小时前
ARM 实操 流水灯 按键控制 day53
arm开发·嵌入式硬件
whaosoft-14316 小时前
w嵌入式分享合集68
嵌入式硬件
竹照煜_ysn19 小时前
STM32——软硬件I2C
stm32·嵌入式硬件·mongodb
Ronin-Lotus20 小时前
嵌入式硬件篇---电感串并联
嵌入式硬件
Wallace Zhang20 小时前
STM32 - Embedded IDE - GCC - 显著减少固件的体积
stm32·单片机·嵌入式硬件
fengfuyao9851 天前
STM32如何定位HardFault错误,一种实用方法
stm32·单片机·嵌入式硬件