STM32
直播中

万物死

8年用户 1310经验值
擅长:MEMS/传感技术
私信 关注
[问答]

stm32是怎样去使用通用定时器中断的呢

STM32是怎样去使用通用定时器中断的呢?有哪些流程呢?
如何计算装入ARR与PSC的值呢?

回帖(1)

王平

2021-11-23 11:13:27
  1.TIMx的外设时钟使能
  RCC-》APB1ENR |= 1 《《 n;
  2.设定ARR寄存器(计时器自动重装值)
  TIMx-》ARR = arr;
  3.设定预分频器的值
  在设定预分频器的值之前,先理解这里的预分频器与时钟系统里的APB1外设的PPRE1不同(由于原子的SYSTEM中时钟初始化函数将PPRE1设为非1,所以外设定时器的时钟就应该加倍了),也就是说进入下面这张图的内部时钟(CK_INT)为72MHZ,而PSC预分频器改变的是时基单元的那个,看到了吗?
  
  代码格式:
  TIMx-》PSC = psc;
  4.允许更新中断
  TIMx-》DIER |= 1《《 0;
  5.开定时器使能
  TIMx-》CR1 |= 1 《《 0;
  6.设置中断分组及优先级
  在这里就用原子提供的MY_NVIC_Init();函数
  (具体代码看《设置中断流程》)
  (注:其实还应该有一个设置定时器是向哪个方向计数:但默认的是边沿对齐向上计数模式;如果要改变计数方向看下图进行相关寄存器(CR1)的修改就可以了)
  
  写中断服务函数
  (注:每次进入中断的最后要清除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,看一段话:
  
  其实读者自行画一个图就好理解了,在这也就不赘述了)。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分