百为STM32开发板教程之十四——TIM通用定时器
使用通用定时器步骤:
1、打开定时器时钟
/* TIM2 时钟使能 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
2、使能定时器NVIC中断
/*使能定时器2中断*/
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
3、配置定时器参数
/* 定时器基本配置 */
TIM_TimeBaseStructure.TIM_Prescaler = 2; //定时器计数频率12Mhz
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 12000; //1ms溢出中断
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
4、打开定时器,开启中断
/* 使能TIM2向上计数中断 */
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
/* TIM2计数使能 */
TIM_Cmd(TIM2, ENABLE);
其中
TIM2的时钟 = PCLK1/(TIM_Prescaler+1)=36Mhz/(TIM_Prescaler+1)= 12Mhz
TIM_CounterMode_Up表示向上计数模式
TIM_Period:
在向上计数模式中,计数器从0计数到自动加载值TIM_Period(TIMx_ARR计数器的内容),然后重新从0开始计数并且产生一个计数器溢出事件。
5、中断服务程序处理
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //是否有溢出中断
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除溢出中断
cnt++;
if(cnt>=1000)
{
cnt = 0;
GPIO_WriteBit(GPIOF, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_6))); //1秒取反一次LED状态
}
}
}
|