定时中断
定时框图
首先选择定时器的时钟 我们选择默认的内部时钟, 产生CK_PSC,然后配置时基电路,时基电路有预分频系数配置,计数器,重装载值的配置然后比如说,我们采用向上计数,那么定时器会从0计数到 自动装载值,这个时候如果开启了中断那么他们产生一个中断。去执行中断服务函数,然后又从0开始往上计数,这就是向上计数。
通常情况下都是选择内部时钟 这个寄存器在中文参考手册14.4.3 TIMX_SMCR 的最低位默认为000,是以内部时钟来驱动。
上图为内部时钟的来源示意图 它是由 AHB 经过APB1 的预分频然后给定时器和通用定时器来用。
APB1的时钟是由 AHB经过预分频得到的,定时器的 CK_INT时钟是由APB1分频后得到的,如果APB1的分频系数是1,则APB1=CK_INT,否则CK_INT=APB1时钟*APB1的分频系数。
因为我们使用的是内部时钟所以,F(CK_PSC)=CK_INT,然后经过一个分频 /n(这个值实际上是由CK_PSC这个寄存器决定的),得到CK_CNT,我们利用 Systeminit函数进行初始化,由上图可以知道AHB=72M APB1=32M 所以我们可以知道 APB1是2分频,所以通用定时器时钟 CK_INT=2*36M=72M。
然后介绍一下计数器的模式,他有向上向下 和中央对齐模式。计数到溢出值,如果开启中断就会产生中断。
这里利用 向上计数模式模式讲解一下这个过程,这
1.里的话我们的 时钟分频因子为1 ,也就是说APB1的分频系数为1,
2定时器要使能,
3计数器寄存器 储存我们的定时器重装载值,也就是说当我们计数到36以后就会有一个溢出,溢出就会有一个更新事件.如果我们会有一个更新中断标志,使能了中断就执行 中断服务函数。
上图是一个定时器中断相关的寄存器 是一个16位的寄存器,是计数器的当前值
上图是预分频寄存器,也是一个16位的寄存器
CK_CNT=Fck_psc / (PSC[15:0]+1) PSC[15:0]+1=N (这里的N,就是上图中的那个N)
上面就是一个自动重装载寄存器。他也是一个16位的寄存器
控制寄存器,我们主要用到了她的位4和位0
位4 确定我们的计数方向
位0 使能计数器
还要用到中断,所以我们要使能相应的中断,这里我们使能更新中断。
定时器参数配置函数 它用来配置
预分频系数
计数模式
自动装载值
ClockDivision 在输入捕获里面用到
RepetitionCounter 高级定时器用。
上面这些设置在 TIM_TimeBaseInit()函数当中。
然后就有定时器使能函数,他操作的就是的位0
然后就是定时器 中断使能函数 配置的就是这使能更新中断位0
然后就是一些状态位的获取
上图为定时器中断配置的一般步骤。
我们向上计数,他从0计数到自动装载值,所以这个时间的长短是由两个 参数决定的,一个是自动重装载值,时另个一是定时器的钟频率(Tclk)它是由APB1进行倍频得到的 ,预分频系数(PSC+1)与 Tclk相除的倒数 就是定时器的周期。那么ARR+1就是 定时器走过的周期的个数。
因为我们这里用的是系统时钟72M, 也就说定时器的时钟频率就是72M(Tlck=72),PSC+1(相当于Fck_psc)。
那么要计时500ms的话,要将 ARR设置成 (4999+1)X(7199+1)M/72。
下面开始进行代码编写 在编写中断优先级函数时先进中断优先级分组才行。
这样下面的代码功能就是让 LED每500ms翻转一次。
通用与高级定时器既可以向上计数也可以向下计数,基本定时器的时钟来自PCLK1 为72M,,但是这里PCLK1的时钟为36M.
这里是如何得到72M的时钟呢? 我们这里要看系统那个框架,如下图这里说 如果APB1的预分频系数=1,则时钟频率不变,但是这里AHB由72M变成了 APB1的36M进行了2分频,所以定时器的时钟应该X2,也就是36X2=72M
高级定时器 1和8的时钟是72M,
上图为定时器的功能框图
与分频器 psc 计数器cnt 自动重装载寄存器 ARR
计数器要计数必须有时钟,这个时钟由CK_CNT提供,每一个脉冲计数器加一,CK_CNT是由CK_PSC经过这个预分频器得到的,CK_PSC 是内部时钟是72M,公式为:
计数器的时钟= 72M/(psc+1) ,计数器是16位的,最大能记到65535,满了之后他会产生中断,ARR表示计数器能够计数到的最大数值,如果说我们配置ARR=1000,那么就表示计数器从0开始计数到1000的时候他就产生中断,中断之后计数器会清零,然后从新从0开始计数, 如果我们要计算 计数0-1000所用时间,也就是中断溢出时间的话就用
计数器周期=(psc+1)/72000000 ,然后再用 计数器周期* (ARR+1)=计数器计数到ARR所用时间。
这里计数器计数10000次/s 也就是 10次/ms 0.01 次/us 1次=0.1ms