设我们要使用TIM3作为计数器使用, 首先配置时钟;
void TIM3_cfg(void)
{ //首先要使能TIM3; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//TIM3时基单元配置;
{ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* TIM3的主频源自APB1, 即72MHz, 故 TIM3频率= Perscaler / TIM3主频 = 7200/72000000 = 1/10000 = 10KHz 即每秒10K次计数; Period为10000, 表示时钟计数器累加到(10000-1)后, 再加1时, 产生溢出中断; 所以, 如此设置后的时钟的中断频率为1Hz, 即1s一次中断; 注意, Period与Prescaler均为16bite寄存器, 即最大值为0xFFFF; */ TIM_DeInit(TIM3); TIM_TimeBaseStructure.TIM_Period = 10000-1; //预装载 TIM_TimeBaseStructure.TIM_Prescaler = 7200-1; //预分频 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //0 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //时钟计数向上溢出 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //使能预装载值 TIM_ARRPreloadConfig(TIM3,ENABLE); //使能更新中断 TIM_ClearFlag(TIM3,TIM_FLAG_Update); //清除溢出中断标志 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //开启TIM3中断 //开启时钟 TIM_Cmd(TIM3, ENABLE); } //中断向量配置 { NVIC_InitTypeDef NVIC_InitStructure; /* 中断执行次序判定原则: 两个中断, 先看抢占等级, 高等级的可以在低等级的中断处理过程中被响应,即中断嵌套; 若抢占等级相同, 则无嵌套调用关系, 比较各自的响应等级, 高等级的先执行; 若响应等级也相同, 则根据中断在向量表中的先后次序执行; 优先级Group2, 2bit表示抢占式中断的等级, 2bit表示响应式中断的等级; */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //此名称为STM32预先定义好的; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占等级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应等级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } }//自定义中断函数, 函数名也是标准的;
volatile unsigned short __tms = 0; void TIM3_IRQHandler(void) { if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM3,TIM_IT_Update); __tms++; } }