跳转至

04.定时器中断

实验说明

本系列实验都是基于STM32F1的单片机进行的编程实验。

实验简介

这里使用单片机的定时器3来实现单片机的定时器中断。

定时器中断简介

就和前面的外部中断一样,定时器中断,就是提前给的条件为一个固定的时间,每当这个时间一到,他就会进入一次定时器中断。

我们常在代码中,让他来完成一些需要周期执行的任务。

代码实现

然后就是定时器的初始化,流程也是先开时钟,然后初始化定时器,然后初始化优先级,然后打开定时器和使能他的中断。

void bsp_timer_init(uint16_t arr,uint16_t psc)
{
    //时钟初始化
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
    //定时器初始化
    {
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

        TIM_TimeBaseStructure.TIM_Period    =   arr-1;                    //设置自动重装载值    
        TIM_TimeBaseStructure.TIM_Prescaler =   psc-1;                    //设置预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;           //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;       //TIM向上计数模式

        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
    }
    //NVIC初始化
    {
        NVIC_InitTypeDef NVIC_InitStructure;

        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;              //TIM3中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;    //先占优先级0级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;           //从优先级3级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;              //IRQ通道被使能

        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
    }
    //定时器使能以及开启中断
    {
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
        TIM_Cmd(TIM3, ENABLE);                    //使能TIMx    
    }
}

定时器初始化中,重要的参数是arr和psc,另外两个可以先不管,然后这两个参数一个是计数一个是分频,分频的话,比如我现在的单片机的工作频率是72Mhz,然后假如我的分频值psc是72的话,那定时器的计数频率就是1Mhz,那么定时器记一个数就是1/1M s,就是1us,那么我前面的计数值arr这个时候要是赋值5000的话,那就代表计数5000次就会进入定时器中断,记一次数是1us,那么记5000次数就是5ms,所以这样配置,定时器就每5ms进入一次定时器中断。

所以定时器中断间隔时间的计算就是 (arr x psc) /72000000 = 5000 x 72/72000000 s = 5ms

NVIC的初始化就不说了,和外部中断一样。

然后就是定时器中断服务函数

void TIM3_IRQHandler(void)   
{
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
    {

        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );   //清除TIMx更新中断标志 
    }
}

记得出定时器服务函数的时候要清除中断标志位。

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请附上原文出处链接及本声明。

原文链接: https://snqx-lqh.gitee.io/wiki/