stm32使用通用定时器中断的一般流程

(注:文中的x为数字)

初始化

1.TIMx的外设时钟使能
RCC->APB1ENR |= 1 << n;

2.设定ARR寄存器(计时器自动重装值)
TIMx->ARR = arr;

3.设定预分频器的值
在设定预分频器的值之前,先理解这里的预分频器与时钟系统里的APB1外设的PPRE1不同(由于原子的SYSTEM中时钟初始化函数将PPRE1设为非1,所以外设定时器的时钟就应该加倍了),也就是说进入下面这张图的内部时钟(CK_INT)为72MHZ,而PSC预分频器改变的是时基单元的那个,看到了吗?
stm32使用通用定时器中断的一般流程_第1张图片

代码格式:
TIMx->PSC = psc;

4.允许更新中断
TIMx->DIER |= 1<< 0;

5.开定时器使能
TIMx->CR1 |= 1 << 0;

6.设置中断分组及优先级
在这里就用原子提供的MY_NVIC_Init();函数
(具体代码看《设置中断流程》)


(注:其实还应该有一个设置定时器是向哪个方向计数:但默认的是边沿对齐向上计数模式;如果要改变计数方向看下图进行相关寄存器(CR1)的修改就可以了)
stm32使用通用定时器中断的一般流程_第2张图片


写中断服务函数

(注:每次进入中断的最后要清除SR的0位
TIMx->SR &= ~(0x01 << 0))


如何计算装入ARR与PSC的值(在这里采用溯回法讲解)
PSC.:如果要将72MHZ分频7200,则为6199
ARR:这个寄存器中存放的是产生中断间隔的总计时点数,也就是说,当CNT寄存器中每次从0到arr将产生中断(默认向上计数模式),那么变化一次的时间就显得关键了。那么如何计算变化一次数的时间呢?这要配合PSC寄存器来说了。
我们知道,经过PSC分频的频率指的是变化一次所需时间周期的倒数。前面说过,经过原子的时钟初始化使得APB1定时器时钟为72MHZ,而PSC就是分频的72MHZ。举例来说,假如你想要一次产生0.5s的中断,那PSC就设置7200 - 1 = 6199 ARR设置5000 - 1 = 4999,前者设置分频为10kHZ,CNT改变一次0.0001s,后者设置计数总点为5000 中断时间为5000 * 0.0001 = 0.5s
(至于那个为什么-1 可以这样理解,每次溢出(在向上计数模式中),即归0,都要经过arr + 1个间隔,关于PSC,看一段话:
在这里插入图片描述
其实读者自行画一个图就好理解了,在这也就不赘述了)

你可能感兴趣的:(stm32使用通用定时器中断的一般流程)