正点原子战舰第32讲 定时器中断实验

定时中断

定时框图

  首先选择定时器的时钟 我们选择默认的内部时钟, 产生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   

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值