系统初始化的时候在默认的系统初始化函数 SystemInit 函数里面已经初始化 APB1 的时钟为 2 分频,
TIM_GetITStatus 函数中会先判断这种中断是否使能,使能了才去判断中断标志位,而TIM_GetFlagStatus 直接用来判断状态标志位。
所以 APB1 的时钟为 36M。当 APB1 的时钟分频数为 1 的时候,TIM2~7 的时钟为 APB1 的时钟,而如果 APB1 的时钟分频数不为 1,那么 TIM2~7 的时钟频率将为 APB1 时钟的两倍。因此, TIM3 的时钟为 72M。
Tout= ((arr+1)*(psc+1))/Tclk;
其中:
Tclk:TIM3 的输入时钟频率(单位为 Mhz)。
Tout:TIM3 溢出时间(单位为 us)。
TIM1 & TIM8为高级定时器,挂载在APB2上。
下面以TIM3为例讲诉库函数下定时器中断的配置。
void TIM3_Init(u16 arr,u16 psc) //arr重载计数周期 psc分频系数
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
IM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数模式向上计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能TIM3外设
//中断优先级配置
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3, ENABLE); //使能中断
}
void TIM3_IRQHandler(void) //中断服务函数
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //判断中断使能和标志位
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除标志位
LED1=!LED1;
}
}
在main函数中调用TIM3_Init(4999,7199);
Tout= ((4999+1)*( 7199+1))/72=500000us=500ms。
所以TIM3溢出时间周期为500ms。
本文详细介绍了STM32中TIM3定时器的配置过程及计算方法。通过设置TIM3的预分频器和自动重装载寄存器,实现500ms的定时周期,并展示了中断服务函数的具体实现。
4607

被折叠的 条评论
为什么被折叠?



