定时器中断

新建文件

按这个图来编写程序
第一步: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计数器到值

然后记得声明一下
