1.开启定时器2的时钟
库函数 :
RCC_APB1PeriphClockCmd(RCC_APB1periph_TIM2,ENABLE);打开APB1下的指定外设的时钟。
2.配置定时器(计数方向,时钟分频系数,预分频,重装载值)
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct={0};
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//时钟不分频
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Down;//向下计数模式
TIM_TimeBaseInitStruct.TIM_Period=1000-1;//重装载值,记1000个数
TIM_TimeBaseInitStruct.TIM_Prescaler=72-1;//预分频 72Mhz/72=1Mhz
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
//3,开启定时器
TIM_Cmd(TIM2, ENABLE);
//4,开启定时器中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
//5,配置中断优先级 TIM2_IRQn
NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;//确定中断通道
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;//使能通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;//响应优先级
NVIC_Init(&NVIC_InitStruct);
//1,开启定时器2的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//2,配置定时器:计数方向,时钟分频系数,预分频,重装载值
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//时钟不分频
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Down;//向下计数模式
TIM_TimeBaseInitStruct.TIM_Period=4-1;//重装载值,记10000个数
TIM_TimeBaseInitStruct.TIM_Prescaler=18-1;//预分频 72Mhz/7200=100hz
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
//3,开启定时器
TIM_Cmd(TIM3, ENABLE);
//4,开启定时器中断
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
//5,配置中断优先级 TIM2_IRQn
NVIC_InitStruct.NVIC_IRQChannel=TIM3_IRQn;//确定中断通道
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;//使能通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;//响应优先级
NVIC_Init(&NVIC_InitStruct);
}
//1MS触发一次
uint32_t msTime=0;
uint32_t usTime=0;
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update)==SET)//判断更新中断是否发生
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
msTime++;
}
}
void TIM3_IRQHandler(void)
{
if((TIM3->SR & (1<<0))== 1)//判断更新中断是否发生
{
TIM3->SR &= ~(0X1<<0);
usTime++;
}
}