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,先看看下图吧
虽然二分频之后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 ); //清楚中断标志
..................用户书写需要执行的相关代码区域.........................
}
}
本人菜鸟一枚,以上是个人见解,如有不足望留言!