RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟
void TIM_TimeBaseInit(TIM_TypeDef * TIMx, TIM_TimeBaseInitTypeDef * TIM_TimeBaseInitStruct);
typedef struct
{
uint16_t TIM_Prescaler; //定时器预分频器;[1~65535]
uint16_t TIM_CounterMode;//计数模式,3种
uint32_t TIM_Period; //定时器周期
uint16_t TIM_ClockDivison;//时钟分频;
uint8_t TIM_RepetitionCounter;//重复计数器;
} TIM_TimeBaseInitTypeDef;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStruct);
void TIM_ITConfig(TIM_Type* TIMx, uint16_t TIM_IT, FunctionalState NewState);
NVIC初始化库函数NVIC_Init();
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewStae);
TIM4_IRQHander
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
if(TIM_GetITStatus(TIM4,TIM_IT_Update))
{…//执行TIM4更新中断 }
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_Period=1000;//自动装载值
TIM_TimeBaseInitStructure.Prescaler;=35999;//分频系数
TIM_TimeBaseInitStructure.TIM_ClockDivison=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上模式
定时器定时时间计算公式如下:
Tout=((per)(pac+1))/Tclk=100036000/72000000=0.5s=500ms
通过TIM4的更新中断控制器D2指示灯间隔500ms秒状态取反,主函数控制D1指示灯不断闪烁。程序框架如下:
1、初始化TIM4,并使能更新中断等;
2、编写TIM4中断函数;
3、编写主函数;
定时器的初始化配置函数:
void TIM4_Init(u16 pre, u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
TIM_TimeBaseInitStruct.TIM_Period=pre;
TIM_TimeBaseInitStruct.TIM_Prescaler=psc;
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStruct);
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
TIM_ClearITPendingBit(TIM4, TIM_IT_Update );
NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM4,ENABLE);
}
定时器4的中断服务函数:
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4, TIM_IT_Update))
{
LED2=!LED2;
}
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
}