定时器中断实现步骤:
1.使能定时器时钟。
RCC_APB1PeriphClockCmd();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器时钟
- 初始化定时器,配置ARR,PSC。
TIM_TimeBaseInit();
TIM_TimeBaseInitStruct.TIM_Prescaler = psc;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period = arr;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);// 初始化定时器,配置ARR,PSC
3.开启定时器中断,配置NVIC。
void TIM_ITConfig();
NVIC_Init();
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//启定时器中断,配置NVIC。
NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
- 使能定时器。
TIM_Cmd();
TIM_Cmd(TIM3,ENABLE);//使能定时器
- 编写中断服务函数。
TIMx_IRQHandler();
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update) == SET)
{
LED1 = !LED1;
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
}
main
TIM3 的时钟为 72M,再根据我们设计的 arr 和 psc 的值,
就可以计算中断时间了。计算公式如下:
Tout= ((arr+1)(psc+1))/Tclk;
其中:
Tclk:TIM3 的输入时钟频率(单位为 Mhz)。
Tout:TIM3 溢出时间(单位为 us)。
中断溢出时间为 500ms,即 Tout= ((4999+1)( 7199+1))/72M=500000us=500ms。
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
TIMER3_int_Init(4999,7199);
while(1)
{
LED0 = !LED0;
delay_ms(200);
}
}