我的用的是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,请问这是什么问题啊
评分
查看全部评分
查询是什么意思?
用中断的话,也是可以的,429很快了。不过,你要考虑进出栈的时间开销,甚至还得考虑中断嵌套的问题。
评分
查看全部评分
好的,可能就是你说的程序开销问题,1us对中断,CPU还没反映过来,感觉不太可能,谢谢你
评分
查看全部评分
要精确延时,必须用滴答时钟。滴答时钟当定时到了以后,会给出中断,同时时钟重新计时,是硬件重置的,不用用户去处理,不会受中断处理的影响。
反正原则只有一个,就是时钟一直在周而复始的转着,“开始——>计时增——>时间到,给出中断,自动重置,并重新开始”,不用受软件处理的影响。每当定时到了后,给出中断,中断服务程序爱处理不处理,时钟接着走。
一般的要求不高的话,用软件延时也可以了。我在STM32F103上,GD103,NXP的LPC上,都用过软件延时,精度还算可以。
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分
我建议用多个NOP作硬延时,
或者定义自减函数,
不建议使用中断。
评分
查看全部评分