STM32
直播中

李娜

7年用户 1617经验值
私信 关注
[问答]

Stm32定时器中断的原理是什么?

STM32定时器中断的原理是什么?

回帖(1)

胡小娟

2021-11-24 10:18:27
1;原理;
和外部中断差不多,不同的是外部中断的产生是由外部硬件产生变化的,而定时器中断就是通过定时器的溢出实现中断(可以想象成闹钟);
2;操作步骤;
这里我用的是通用定时器TIM3;
1)TIM3 时钟使能。
这里我们通过 APB1ENR 的第 1 位来设置 TIM3 的时钟,因为 Stm32_Clock_Init 函数里面
把APB1的分频设置为2了,所以我们的TIM3时钟就是APB1时钟的2倍,等于系统时钟(72M)。
2)设置 TIM3_ARR 和 TIM3_PSC 的值。
通过这两个寄存器,我们来设置自动重装的值,以及分频系数。这两个参数加上时钟频率
就决定了定时器的溢出时间。
Tout= ((arr+1)*(psc+1))/Tclk;
Tclk:TIM3 的输入时钟频率(单位为 Mhz)。
Tout:TIM3 溢出时间(单位为 us)
3)设置 TIM3_DIER 允许更新中断。
因为我们要使用 TIM3 的更新中断,所以设置 DIER 的 UIE 位为 1,使能更新中断。
4)允许 TIM3 工作。
光配置好定时器还不行,没有开启定时器,照样不能用。我们在配置完后要开启定时器,
通过 TIM3_CR1 的 CEN 位来设置。
5)TIM3 中断分组设置。
在定时器配置完了之后,因为要产生中断,必不可少的要设置 NVIC 相关寄存器,以使能
TIM3 中断。
6)编写中断服务函数。
在最后,还是要编写定时器中断服务函数,通过该函数来处理定时器产生的相关中断。在
中断产生后,通过状态寄存器的值来判断此次产生的中断属于什么类型。然后执行相关的操作,
我们这里使用的是更新(溢出)中断,所以在状态寄存器 SR 的最低位。在处理完中断之后应
该向 TIM3_SR 的最低位写 0,来清除该中断标志。
通过以上几个步骤,我们就可以达到我们的目的了,使用通用定时器的更新中断,来控制
DS1 的亮灭;

3;代码timer.c;


在这里插入代码片
#include "timer.h"
#include "led.h"
#include "sys.h"
void TIM3_IRQHandler(void)//中断服务函数
{
if(TIM3->SR&0X0001)//判断是否溢出
{
  LED1=!LED1;
}
TIM3->SR&=~(1<<0);//清除中断标志位
}


void TIM3_Init1(u16 arr,u16 psc)
{
RCC->APB1ENR |=1<<1;//TIM3时钟使能
TIM3->ARR=arr;//自动重装载值
TIM3->PSC=psc;//预分频系数
TIM3->DIER |=1<<0;//中断使能
TIM3->CR1 |=0X01;//使能定时器3

MY_NVIC_Init(1,3,TIM3_IRQn,2);//中断优先级设置,分组,以及中断服务函数
}


time.h


在这里插入代码片
#ifndef _TIMER_H_
#define _TIMER_H_
#include "sys.h"
void TIM3_Init1(u16 arr,u16 psc);
#endif


main.c


在这里插入代码片
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "timer.h"
int main()
{
Stm32_Clock_Init (9);
delay_init(72);
LED_Init ();
TIM3_Init1(4999,7199);//
LED1=0;
while(1)
{
  LED0=0;//指示程序正在运行,常亮红灯
  delay_ms(200);     
}
}
举报

更多回帖

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