int main(void)
{
#ifdef DEBUG
debug();
#endif
RCC_Configuration(); //系统时钟配置
NVIC_Configuration(); //NVIC配置
GPIO_Configuration(); //通用IO端口配置
/*-----------------------------------------------------------------------------*/
/***772M下定时值的计算((1+预分频TIM_Prescaler)/72*(1+定时周期TIM_Period))*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //配置RCC,使能TIMx
/* Time Base configuration */
TIM_TimeBaseStructure.TIM_Prescaler = 8; //时钟预分频数 例如:时钟频率=72/(时钟预分频+1)
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; ////定时器模式 向上计数
TIM_TimeBaseStructure.TIM_Period = 7;//自动重装载寄存器周期的值(定时时间)累计 0xFFFF个频率后产生个更新或者中断(也是说定时时间到)
TIM_TimeBaseStructure.TIM_ClockDivision = 0; ////时间分割值
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //初始化定时器2
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开中断 溢出中断
//打开定时器
// TIM_Cmd(TIM2, ENABLE);
/* Main Output Enable */
TIM_CtrlPWMOutputs(TIM2, ENABLE); //暂时没用
// GPIO_Write( GPIOB ,0xff);
while (1)
{
GPIO_Write( GPIOB ,0xfe00); //将Count数据送到GPIOB高八位
delay(1000000);
GPIO_Write( GPIOB ,0xfd00); //将Count数据送到GPIOB高八位
delay(1000000);
GPIO_Write( GPIOB ,0xfb00); //将Count数据送到GPIOB高八位
delay(1000000);
GPIO_Write( GPIOB ,0xf700); //将Count数据送到GPIOB高八位
delay(1000000);
GPIO_Write( GPIOB ,0xef00); //将Count数据送到GPIOB高八位
delay(1000000);
GPIO_Write( GPIOB ,0xdf00); //将Count数据送到GPIOB高八位
delay(1000000);
}
}
void delay(u32 ntimecount)
{ timecount=ntimecount;
TIM_Cmd(TIM2, ENABLE);
while(timecount);
TIM_Cmd(TIM2, DISABLE);
}
中断程序:
extern u32 timecount;
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) //检测制定的中断是否发生
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除中断处理位。
if(timecount)
timecount-- ;
}
}
问题:如上所示,定时器设置为每1us进入一次中断将timecount减1,但是,但我延时要为1秒:delay(1000000)时,根据流水灯的变化,感觉延时不止1秒,而是1点多秒,为什么会这样呢? 如果将定时器设置为每10us进入一次中断,那么延时1秒为 delay(100000),这时候延时就差不多为1秒了?请问大家这是什么问题 |