使用103C8T6,使用8M无源晶振,系统时钟为72M
使用定时器2(TIMER2)
/*中断周期为10us*/
uint32_t time_dly;
void TIM2_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
TIM_DeInit(TIM2);
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
NVIC_Init(&NVIC_InitStructure);
//1us产生一个中断周期
TIM_TimeBaseStructure.TIM_Period=10; //自动重装载寄存器周期的值(计数值)
/* 累计 TIM_Period个频率后产生一个更新或者中断 */
TIM_TimeBaseStructure.TIM_Prescaler= (72 - 1); //时钟预分频数 72M/720
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM2, TIM_FLAG_Update); // 清除溢出中断标志
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM2, ENABLE); // 开启时钟
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
{
TIM_ClearITPendingBit(TIM1,TIM_IT_Update); //清除中断标志位
if(time_dly>0)
{
time_dly--;
}
}
}
//毫秒的延时函数,以1ms为最小单位
void delay_ms_tim(uint32_t nTimer)
{
time_dly=nTimer*100;
while(time_dly);
}
//微秒的延时函数,实际以10us为最小单位
void delay_us_tim(uint32_t nTimer)
{
time_dly=nTimer/10;
while(time_dly);
}