上代码
首先头文件timer.h
#ifndef __TIMER_H_
#define __TIMER_H_
#include "stm32f10x.h"
void TIM2_init(u16 arr,u16 psc);
__weak void Timer2_ISR(void);
u32 F420_TICK(void);
_Bool F420_CHECK_TIMEOUT(u32 start, u32 delay_ms);
#endif
然后c文件timer.c
#include "timer.h"
u32 nSysTicks = 0;
//==============================================================================
//==============================================================================
void TIM2_init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM2中断,允许更新中断
TIM_Cmd(TIM2, ENABLE); //使能TIMx
/* Enable the TIM2 global Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//todo
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//==============================================================================
//==============================================================================
void TIM2_IRQHandler(void) //TIM2中断
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查TIM2更新中断发生与否
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx更新中断标志
Timer2_ISR();
nSysTicks++;
}
}
__weak void Timer2_ISR(void){}
#define MAX_TICK_VALUE 0xFFFFFFFF
u32 F420_TICK(void)
{
return (u32)nSysTicks;
}
_Bool F420_CHECK_TIMEOUT(u32 start, u32 delay_ms)
{
u32 elapsed;
u32 tick = F420_TICK();
if (tick >= start)
{
elapsed = tick - start;
}
else
{
elapsed = MAX_TICK_VALUE - start + tick;
}
return ((u32)elapsed >= delay_ms);
}