1、打开RCC时钟
2、选择时基单元的时钟(选择内部时钟的话可以忽略,原因:上电后默认内部时钟)
3、配置时基单元
4、使能更新中断
5、NVIC优先级分组
6、NVIC初始化
7、启动定时器
#include "stm32f10x.h" // Device header
extern uint16_t NUM;
void Timer_Init(void)
{
//打开RCC时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//选择内部时钟源
TIM_InternalClockConfig(TIM2);
//配置时基单元
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//1分频
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
TIM_TimeBaseInitStructure.TIM_Period=10000-1; //自动重装器的值
TIM_TimeBaseInitStructure.TIM_Prescaler=7200-1; //预分频器的值
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器的值,只有高级定时器能用上
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
/*预分频器是有一个缓冲寄存器的,写的值只有在更新事件时才会起作用,为了立刻生成一个值
TIM_TimeBaseInit的库函数里手动生成了一个更新事件,这样预分频器的值就有效了
但副作用就是,更新事件和更新中断时同时发生的,更新中断会更新中断标志位,一旦初始化完
更新中断就会立刻进入,这就是刚上电立刻进中断的原因*/
TIM_ClearFlag(TIM2,TIM_FLAG_Update);
//使能中断
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
//NVIC优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//初始化
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);
//启动定时器
TIM_Cmd(TIM2,ENABLE);
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
{
NUM++;
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
}