HAL_Delay

__IO uint32_t uwTick;
#define HAL_MAX_DELAY      0xFFFFFFFFU
uint32_t uwTickFreq = HAL_TICK_FREQ_DEFAULT;  /* 1KHz */ /*1U*/



__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;

  /* Add a period to guaranty minimum wait */
  if (wait < HAL_MAX_DELAY)//0xFFFFFFFFU
  {
    wait += (uint32_t)(uwTickFreq);
  }

  while((HAL_GetTick() - tickstart) < wait)
  {
  }
}

__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}


思路:比如HAL_Delay(20)你需要延时20MS系统会怎么操作?
它会先标识一个数tickstart就是当前的计数值比如uwTick是40那就是40
然后跑一个函数把20+1变成21
后面开始死循环浪费时间 一直到uwTick-ickstart不在小于20就出去

那么uwTick是一直在++的 它在哪里++的呢?
__weak void HAL_IncTick(void)
{
  uwTick += uwTickFreq;
}

void SysTick_Handler(void)
{
  HAL_IncTick();
}
现在就明白了 每次中断它就++
那么问题还有一个 如何控制1MS++一次的??


HAL_RCC_GetSysClockFreq关注它!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值