wambob 发表于 2015-5-30 15:27:15

HAL库中的延时函数

函数原型
__weak void HAL_Delay(__IO uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick();
while((HAL_GetTick() - tickstart) < Delay)
{
}
}
注释中延时是ms。怎么算出来的。另外下面的系统滴答中断多长时间进入一次
void SysTick_Handler(void)
{
   HAL_IncTick();
HAL_SYSTICK_IRQHandler();
}

你好我好大家好! 发表于 2015-5-30 16:19:25

时钟/x,写入参数,x就是想要定时的时间

moyanming2013 发表于 2015-5-30 16:20:54

HAL_GetTick()每次可以获取一个ms(注意看注释或其源代码),然后与刚进HAL_Delay时的基准做对比,到达Delay后,退出,即完成延时。
SysTick_Handler的调用周期要在中断中才能查询到吧,这里只是一个向量处理函数,看不出时间频率。

寂寞如她 发表于 2015-5-30 16:37:06

:lol:lol:lol:lol:lol:lol:lol:lol:lol

anobodykey 发表于 2015-5-30 17:08:55

看代码就晓得了,systick是1ms的Stm32xx_hal.c中HAL_InitTick中有写的

Paderboy 发表于 2015-5-30 17:10:47

__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)

{
/*Configure the SysTick to have interrupt in 1ms time basis*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

/*Configure the SysTick IRQ priority */
HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority ,0);

   /* Return function status */
return HAL_OK;
}
static __IO uint32_t uwTick;
__weak void HAL_IncTick(void)
{
uwTick++;
}

__weak uint32_t HAL_GetTick(void)
{
return uwTick;
}

__weak void HAL_Delay(__IO uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick();
while((HAL_GetTick() - tickstart) < Delay)
{
}
}


wambob 发表于 2015-5-30 17:13:27

Paderboy 发表于 2015-5-30 17:10
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)

{


谢谢,明白了

为什么是EEFOCUS小白 发表于 2015-5-31 10:00:31

1ms的延时

星辰一方 发表于 2015-10-25 14:32:25

HAL库里怎么实现微秒级的延时?

Ljmp 发表于 2016-10-27 10:52:26

1ms 一次中断,每一次中断uwTick++;
页: [1]
查看完整版本: HAL库中的延时函数