本篇文章主要讲解用通用定时器TIM2产生1ms定时的中断:
首先是定时器配置,代码如下:
void Tim2_Configration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_DeInit(TIM2);//重新将Timer设置为缺省值 TIM_InternalClockConfig(TIM2); //采用内部时钟给TIM2提供时钟源,内部时钟(CK_INT)、外部时钟模式1:外部输入脚(TIx)、外部时钟模式2:外部触发输入(ETR) TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; //计数器时钟为72MHz/72 = 1MHz TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置时钟分割 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;//设置计数器模式为向上计数模式 TIM_TimeBaseStructure.TIM_Period = 1000 - 1;//设置计数溢出大小,每计1000个数就产生一个更新事件 TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//将配置应用到TIM2中 TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除溢出中断标志 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//开启TIM2的中断 TIM_Cmd(TIM2, ENABLE); //计数器使能,开始工作 }
TIM_Period设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。它的取值必须在0x0000和0xFFFF之间。
TIM_Prescaler设置了用来作为TIMx时钟频率除数的预分频值。它的取值必须在0x0000和0xFFFF之间。
TIM_ClockDivision的作用是做一段延时,一般在特殊场合的时候会用到,可不关心。
TIM_CounterMode选择了计数器模式。
TIM_CounterMode_Up
TIM向上计数模式
TIM_CounterMode_Down
TIM向下计数模式
TIM_CounterMode_CenterAligned1 TIM中央对齐模式1计数模式
TIM_CounterMode_CenterAligned2 TIM中央对齐模式2计数模式
TIM_CounterMode_CenterAligned3 TIM中央对齐模式3计数模式
注意:单片机时钟频率72MHz,APB1 二分频36MHz,故TIM2自动2倍频至72MHz
NVIC的配置:
void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//1 bits for pre-emption priority 3 bits for subpriority /* Enable the TIM2 gloabal Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
中断服务函数:
void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } }