以下是我想用定时器实现1ms延时,使用了内部高速晶振,程序如下
static void TIM1_Config(void)
{
TIM1_SetCounter(0);
//128分频 向上计数模式 使用HSI-16MHz
TIM1_TimeBaseInit(128,TIM1_CounterMode_Up,124,0);
TIM1_ARRPreloadConfig(DISABLE);
/* Clear TIM1 update flag */
TIM1_ClearFlag(TIM1_FLAG_Update);
/* Enable update interrupt */
TIM1_ITConfig(TIM1_IT_Update, ENABLE);
/* enable interrupts */
enableInterrupts();
/* Enable TIM1 */
TIM1_Cmd(ENABLE);
}
将主时钟HSI-16MHz进行128分频,向上计数到124,即125次,得到触发中断时间128/16*125=1000us即一毫秒,这个经测试准确无误,同理我想得到10us进中断,于是将初始化程序改动如下
static void TIM1_Config(void)
{
TIM1_SetCounter(0);
//16分频 向上计数
TIM1_TimeBaseInit(16,TIM1_CounterMode_Up,9,0);
TIM1_ARRPreloadConfig(DISABLE);
/* Clear TIM1 update flag */
TIM1_ClearFlag(TIM1_FLAG_Update);
/* Enable update interrupt */
TIM1_ITConfig(TIM1_IT_Update, ENABLE);
/* enable interrupts */
enableInterrupts();
/* Enable TIM1 */
TIM1_Cmd(ENABLE);
}
理论上讲16分频后得到1MHz,向上计数到9为十次,应有10us进一次中断 可是经实际测量进中断的时间为20us左右
我又改动如下
TIM1_TimeBaseInit(16,TIM1_CounterMode_Up,4,0); 发现触发一次中断仍为20us
进一步改动,发现无论分频系数和重载值怎么改动 进中断的时间最小约为20us,不能再小了
有没有人碰见过这个问题?如何解决?与使用的内部晶振有关吗? |