我通过以下程序设置循环读取当前计数值,比较差值来确定定时的时间。当时现在通过示波器观察设置1ms时,波形上面显示是1.48貌似。STM32系统是72MHz。相关程序如下:
void Time3_Drv_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period =0xFFFF; //自动重装载寄存器周期的值(定时时间) 1ms
TIM_TimeBaseStructure.TIM_Prescaler = (36000-1); //时钟预分频数,时钟频率=72/(时钟预分频+1) 72*1000-1产生1us周期时钟
TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 时间分割值
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //定时器模式 向上计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM3,TIM_FLAG_Update);
TIM_ARRPreloadConfig(TIM3,DISABLE);
TIM_ITConfig(TIM3, TIM_IT_Update , ENABLE);
TIM_Cmd(TIM3, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
}
void G1msTimerRes(G1msTimer *Timer)
{
Timer->StartTime=GetSysTime();
}
uint8_t G1msTimerOver(G1msTimer *Timer,uint16_t CmpTime)
{
CmpTime *= 0x02;
return ((uint16_t)(GetSysTime()-Timer->StartTime))>CmpTime?TRUE:FALSE;
}
void Delay_Ms(uint16_t nms)
{
G1msTimer TimerDelay;
G1msTimerRes(&TimerDelay); //复位,取当前计数值
while(1)
{
if(G1msTimerOver(&TimerDelay,nms))
{
break;
}
}
}
|