TIM定时器延时精确的问题
我的用的是STM32F429 开发板,采用HAL库开发,最近用到us延时,就用定时器写了一个延时函数void MX_TIM2_Init(void) {
htim2.Instance = TIM2;
htim2.Init.Prescaler = 71;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 1;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&htim2);
HAL_TIM_Base_Start_IT(&htim2);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if(htim == (&htim2)) {
Timer--;
}
}
void Timer_Delay_us(uint32_t time) {
Timer = time;
while(Timer);
}按道理说,这是延时1us的,可实际测得结果是3-4us,请问这是什么问题啊
想精确就别用中断,用查询就可以了 yklstudent-1794 发表于 2018-1-9 19:12
想精确就别用中断,用查询就可以了
查询是什么意思? 这里让你查询就是 直接在程序死等一会儿做为延时。
用中断的话,也是可以的,429很快了。不过,你要考虑进出栈的时间开销,甚至还得考虑中断嵌套的问题。 xmshao 发表于 2018-1-9 20:18
这里让你查询就是 直接在程序死等一会儿做为延时。
用中断的话,也是可以的,429很快了。不过,你要考虑进 ...
好的,可能就是你说的程序开销问题,1us对中断,CPU还没反映过来,感觉不太可能,谢谢你 你可以使用滴答定时器来做,看原子哥的延时都是用这个的 思以智胜 发表于 2018-1-9 20:29
好的,可能就是你说的程序开销问题,1us对中断,CPU还没反映过来,感觉不太可能,谢谢你 ...
要精确延时,必须用滴答时钟。滴答时钟当定时到了以后,会给出中断,同时时钟重新计时,是硬件重置的,不用用户去处理,不会受中断处理的影响。
反正原则只有一个,就是时钟一直在周而复始的转着,“开始——>计时增——>时间到,给出中断,自动重置,并重新开始”,不用受软件处理的影响。每当定时到了后,给出中断,中断服务程序爱处理不处理,时钟接着走。
一般的要求不高的话,用软件延时也可以了。我在STM32F103上,GD103,NXP的LPC上,都用过软件延时,精度还算可以。 大哥,你是用F429 180M的主频列,你为啥72分频 你是不是搞错了以为还是F1.另外一个你别用TIM中断回调函数,浪费时间。你直接1分频 重装载值180再试试:lol 对呀,楼主都1u定时,干嘛还要分频,细分岂不是更精确。其次不要中断判断,while死等,还有就是使用滴答定时器 像1us这样的短延时,
我建议用多个NOP作硬延时,
或者定义自减函数,
不建议使用中断。
页:
[1]