«

TIM定时中断

Sweetiey 发布于 阅读:205 课程笔记


原理
TIM定时中断
TIM定时中断

void Timer_Init(void)
{

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//TIM2是APB1的外设,开启时钟

    TIM_InternalClockConfig(TIM2);//选择时基单元的时钟为内部时钟

    TIM_TimeBaseInitTypeDef A;
    A.TIM_ClockDivision = TIM_CKD_DIV1;
    A.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
    A.TIM_Period = 10000-1;//0~65535 周期  ARR(AutoReloadResistor)自动重装器
    A.TIM_Prescaler = 7200-1;//TIM_Prescaler PSC预分频器的值
    /*
    定时1s,频率1HZ,计数器溢出频率  ARR(AutoReloadResistor)自动重装器
    CK_CNT_OV = CK_PSC/(PSC-1)/(ARR-1)
    CK_CNT_OV=1HZ         CK_PSC=72M 
    对72M进行7200分频,得到10K的计数频率,在10K的频率下计10000个数,需要1秒
    */
    A.TIM_RepetitionCounter =0 ;//不用
    TIM_TimeBaseInit(TIM2,&A);//配置时基单元初始化

    TIM_ClearFlag(TIM2,TIM_IT_Update);//手动清除TIM_TimeBaseInit产生的中断位
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//开启使能中断到NVIC

    /*NVIC*/
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC优先级分组
    NVIC_InitTypeDef B;
    B.NVIC_IRQChannel  = TIM2_IRQn;
    B.NVIC_IRQChannelCmd = ENABLE;
    B.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
    B.NVIC_IRQChannelSubPriority = 1;//响应优先级
    NVIC_Init(&B);

    //启动定时器
    TIM_Cmd(TIM2,ENABLE);
}

//然后到startup里面找TIM2的中断函数
/*
void TIM2_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)//获取中断标志位

    {
    TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除标志位
    }

}
*/

如果使用外部时钟则需要
1初始化外部时钟引脚
2通过ETR引脚的外部时钟2配置
代码如下:


    void Timer_Init(void)
    {

      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//TIM2是APB1的外设,开启时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//引脚初始化
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

      //TIM_InternalClockConfig(TIM2);//选择时基单元的时钟为内部时钟

TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0F);//通过ETR引脚的外部时钟2配置

    TIM_TimeBaseInitTypeDef A;
    A.TIM_ClockDivision = TIM_CKD_DIV1;
    A.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
    A.TIM_Period = 10-1;//0~65535 周期  ARR(AutoReloadResistor)自动重装器
    A.TIM_Prescaler = 2-1;//TIM_Prescaler PSC预分频器的值
    /*
    定时1s,频率1HZ,计数器溢出频率  ARR(AutoReloadResistor)自动重装器
    CK_CNT_OV = CK_PSC/(PSC-1)/(ARR-1)
    CK_CNT_OV=1HZ         CK_PSC=72M 
    对72M进行7200分频,得到10K的计数频率,在10K的频率下计10000个数,需要1秒
    */
    A.TIM_RepetitionCounter =0 ;//不用
    TIM_TimeBaseInit(TIM2,&A);//配置时基单元初始化

    TIM_ClearFlag(TIM2,TIM_IT_Update);//手动清除TIM_TimeBaseInit产生的中断位
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//开启使能中断到NVIC

    /*NVIC*/
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC优先级分组
    NVIC_InitTypeDef B;
    B.NVIC_IRQChannel  = TIM2_IRQn;
    B.NVIC_IRQChannelCmd = ENABLE;
    B.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
    B.NVIC_IRQChannelSubPriority = 1;//响应优先级
    NVIC_Init(&B);

    //启动定时器
    TIM_Cmd(TIM2,ENABLE);
}

//然后到startup里面找TIM2的中断函数
/*
void TIM2_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)//获取中断标志位

    {
    TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除标志位
    }

}
*/

STM32


扫描二维码,在手机上阅读