欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32 定时器中断周期计算

程序员文章站 2022-03-13 17:18:47
...
  • 编译工具:MDK5
  • 举例芯片:STM32F103RC
  • 问题疑点:计算中断发生周期是使用72MHz还是36MHz

1.先看看计算公式:

定时中断发生的时间T:
T = (arr+1)*(psc+1)/72M
当设置arr=  999,psc  = 71999,T=1s

参考定时器3的配置函数,如下:

void time3_Init(u16	arr,u16	psc)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;	 //声明一个结构体变量
    NVIC_InitTypeDef NVIC_InitStructure;

    /* 开启定时器3时钟 */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

    TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除TIMx的中断待处理位:TIM 中断源
    TIM_TimeBaseInitStructure.TIM_Period = arr;//设置自动重装载寄存器周期的值
    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;//设置用来作为TIMx时钟频率预分频值
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分频系数
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
    TIM_Cmd(TIM3,ENABLE); //使能TIMx外设
    /* 设置中断参数,并打开中断 */
    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE );	//使能或者失能指定的TIM中断

    /* 设置NVIC参数中断 */
    NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //打开TIM3_IRQn的全局中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;	//抢占优先级为0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;  //响应优先级为1
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;	//使能
    NVIC_Init(&NVIC_InitStructure);
}

可能有朋友存在疑问,为什么计算的时候使用的是72M,TIM3定时器挂载在APB1上,而APB1的时钟是系统时钟HCLK的二分频,系统时钟是72MHz,也就是说APB1的时钟就是36MHz,先看看下图吧
STM32 定时器中断周期计算

虽然二分频之后APB1外设时钟是36MHz,但是定时器的时钟在二分频之后再次进行二倍频,同时,我们在配置TIM3时,设置的TIM分频系数为1TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; 所以我们在使用上面公式的时候就得使用72MHz进行计算了

另附上定时中断函数:

void TIM3_IRQHandler(void)			//TIM3 1s
{
    if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TM3更新中断与否
    {
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清楚中断标志
        
		..................用户书写需要执行的相关代码区域.........................

    }
}

本人菜鸟一枚,以上是个人见解,如有不足望留言!

相关标签: STM32