思以智胜 发表于 2018-1-9 19:06:35

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:44

想精确就别用中断,用查询就可以了

思以智胜 发表于 2018-1-9 20:12:00

yklstudent-1794 发表于 2018-1-9 19:12
想精确就别用中断,用查询就可以了

查询是什么意思?

xmshao 发表于 2018-1-9 20:18:36

这里让你查询就是 直接在程序死等一会儿做为延时。

用中断的话,也是可以的,429很快了。不过,你要考虑进出栈的时间开销,甚至还得考虑中断嵌套的问题。

思以智胜 发表于 2018-1-9 20:29:53

xmshao 发表于 2018-1-9 20:18
这里让你查询就是 直接在程序死等一会儿做为延时。

用中断的话,也是可以的,429很快了。不过,你要考虑进 ...

好的,可能就是你说的程序开销问题,1us对中断,CPU还没反映过来,感觉不太可能,谢谢你

努力的人 发表于 2018-1-25 21:39:04

你可以使用滴答定时器来做,看原子哥的延时都是用这个的

toofree 发表于 2018-1-26 00:21:49

思以智胜 发表于 2018-1-9 20:29
好的,可能就是你说的程序开销问题,1us对中断,CPU还没反映过来,感觉不太可能,谢谢你 ...

要精确延时,必须用滴答时钟。滴答时钟当定时到了以后,会给出中断,同时时钟重新计时,是硬件重置的,不用用户去处理,不会受中断处理的影响。

反正原则只有一个,就是时钟一直在周而复始的转着,“开始——>计时增——>时间到,给出中断,自动重置,并重新开始”,不用受软件处理的影响。每当定时到了后,给出中断,中断服务程序爱处理不处理,时钟接着走。

一般的要求不高的话,用软件延时也可以了。我在STM32F103上,GD103,NXP的LPC上,都用过软件延时,精度还算可以。

聪神聪 发表于 2018-1-26 09:31:26

大哥,你是用F429 180M的主频列,你为啥72分频 你是不是搞错了以为还是F1.另外一个你别用TIM中断回调函数,浪费时间。你直接1分频 重装载值180再试试:lol

nyszx 发表于 2018-1-26 14:18:28

对呀,楼主都1u定时,干嘛还要分频,细分岂不是更精确。其次不要中断判断,while死等,还有就是使用滴答定时器

无薪税绵 发表于 2018-1-26 15:56:47

像1us这样的短延时,
我建议用多个NOP作硬延时,
或者定义自减函数,
不建议使用中断。
页: [1]
查看完整版本: TIM定时器延时精确的问题