设我们要使用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++;
}
}