hal库如何成功进入sleep模式?

2019-07-20 10:50发布

sleep模式可以被任何中断唤醒,包括systick中断。
虽然在原子哥的程序中,并没有打开systick中断
#if SYSTEM_SUPPORT_OS       //如果需要支持OS.
reload=SYSCLK;             //每秒钟的计数次数 单位为K   
reload*=1000000/delay_ostickspersec; //根据delay_ostickspersec设定溢出时间
           //reload为24位寄存器,最大值:16777216,在216M下,约合77.7ms左右
fac_ms=1000/delay_ostickspersec;  //代表OS可以延时的最少单位   
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;//开启SYSTICK中断
SysTick->LOAD=reload;      //每1/OS_TICKS_PER_SEC秒中断一次
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
#endif

但是hal库初始化函数HAL_StatusTypeDef HAL_Init(void)
{
  /* Configure Flash prefetch and Instruction cache through ART accelerator */
#if (ART_ACCLERATOR_ENABLE != 0)
   __HAL_FLASH_ART_ENABLE();
#endif /* ART_ACCLERATOR_ENABLE */
  /* Set Interrupt Group Priority */
  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
  /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */
  HAL_InitTick(TICK_INT_PRIORITY);
  
  /* Init the low level hardware */
  HAL_MspInit();
  
  /* Return function status */
  return HAL_OK;
}
却打开了中断。而且在hal库中,很多库的内部文件调用了HAL_Delay函数和HAL_GetTick函数,
尝试将__weak void HAL_Delay(__IO uint32_t Delay)
{
  delay_ms(Delay);   //使用原子文件delay.c中的延迟函数。
}
但是很多库文件还调用了HAL_GetTick函数,而如果不进中断uwtick变量就不会改变,HAL_GetTick函数也失去了意义,那么这时hal库还能正常使用么?
__weak void HAL_IncTick(void)
{
  uwTick++;
}

__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。