定时器,使用TIM3定时器,定时5s 重复3次,累计15s 但是仿真每次仅有4.5s 一共12s左右,定时器的误差这么大,还是我参数算错了呢??求解答
main函数
main ()
{
RCC_Configuration(); //配置系统时钟
NVIC_Configuration(); //系统中断管理
LED_Init(); //LED端口初始化
Timerx_Init(50000);//10Khz的计数频率,(计数到5000为500ms)已修改后,计数为nms 即500ms
while (1)
{
;
}
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
//static u8 count=0;//定时计数数
void Timerx_Init(u16 arr )
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
TIM_TimeBaseStructure.TIM_Period = (arr*10); //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =(7200-1); //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_ITConfig( //使能或者失能指定的TIM中断
TIM3, //TIM2
TIM_IT_Update | //TIM 中断源
TIM_IT_Trigger, //TIM 触发中断源
ENABLE //使能
);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
}
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
count++;
if(count==3)
{ count=0;
LED1=!LED1;
}
}
}
一开始,用每次定时一秒的时候,误差没有这样大的,是不是参数要自己设定调整的呢??要准确定时,还是用sys系统定时器会精确点呢??
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
原子哥,这个我会看,定时1s的时候Timerx_Init(10000);//10Khz的计数频率,计数为nms 即1000ms误差很小,但是,改为Timerx_Init(5000);//10Khz的计数频率,计数为nms 即5000ms 但是仿真才4.12S,这样算是误差吗?
一周热门 更多>