0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SysTick与HAL_Delay的关系与注意事项

CHANBAEK 来源:头条号秋天滴风 作者:头条号秋天滴风 2023-04-21 11:32 次阅读

SysTick与HAL_Delay的关系与注意事项

本文将介绍SysTick与HAL_Delay()函数之间的关系,以及使用HAL_Delay()函数的注意事项;

一.HAL_Delay()函数实现的原理、与SysTick的关系

下面我们先看一下HAL_Delay函数的源码

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

  /* Add a freq to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }

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

从源码可以看出该函数将我们传入的参数与HAL_GetTick()-tickstart比较,若不满足条件则退出while、若满足

接下来我们追一下HAL_GetTick()的源代码:

__weak uint32_t HAL_GetTick(void)
{
return uwTick;
}

接着追一下uwTick ,发现在下面这个函数中对它的值进行了操作:

__weak void HAL_IncTick(void)
{
uwTick += uwTickFreq;
}

接着追一下uwTickFreq 发现uwTickFreq = 1,接着追一下HAL_IncTick(void)函数:

发现HAL_IncTick(void)函数是在SysTick的中断回调函数内调用的;

综上可知HAL_Delay与SysTick的关系:HAL_Delay函数的执行、最终是依赖于SysTick的每触发一次SysTick的中断耗时1ms,HAL_GetTick()-tickstart会增大1、知道差值等于HAL_Delay的传入参数。

二、由SysTick与HAL_Delay之间的关系可知,我们在使用HAL_Delay的时候需要注意:当在中断中使用了HAL_Delay函数,则该中断的抢占优先级必须低于SysTick中断的优先级,否则会导致SysTick中断不能抢占该中断函数、最终导致HAL_GetTick()-tickstart的值不会变,从而陷入死循环中。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41025
  • 源码
    +关注

    关注

    8

    文章

    573

    浏览量

    28589
  • 函数
    +关注

    关注

    3

    文章

    3880

    浏览量

    61310
  • Systick
    +关注

    关注

    0

    文章

    62

    浏览量

    12950
  • HAL
    HAL
    +关注

    关注

    2

    文章

    68

    浏览量

    12472
收藏 人收藏

    评论

    相关推荐

    STM32F7 IAP跳转后HAL_Delay没有执行的原因?

    on variable incremented in SysTick ISR. This implies that if HAL_Delay() is called from a peripheral
    发表于 04-09 06:53

    芯片金线包封胶的使用注意事项是什么?

    芯片金线包封胶的使用注意事项是什么?金线包封胶是一种高性能、高粘度的密封胶,广泛应用于电子、电器、汽车等领域。它具有良好的防水、防潮、防震等性能,能够保护产品内部零件不受环境影响,提高产品的使用寿命
    的头像 发表于 01-05 11:29 445次阅读
    芯片金线包封胶的使用<b class='flag-5'>注意事项</b>是什么?

    DC电源模块有哪些注意事项和使用技巧?

    DC电源模块有哪些注意事项和使用技巧?
    的头像 发表于 12-25 13:59 248次阅读
    DC电源模块有哪些<b class='flag-5'>注意事项</b>和使用技巧?

    电流互感器的使用注意事项

    当谈到电流互感器的使用时,有一些重要的注意事项需要我们牢记。在本文中,我们将探讨这些注意事项,为您提供详细和全面的信息。
    的头像 发表于 12-15 10:34 577次阅读
    电流互感器的使用<b class='flag-5'>注意事项</b>

    STM32使用__disable_irq()后就无法使用HAL_Delay(xx),这是为什么?

    __enable_irq();//打开所有中断但实际应用中发现,当使用__disable_irq(); 关闭所有中断后,再用__enable_irq();打开所有中断,就会出现HAL_Delay(xx)不能再使用,所以直接用上述方式也不可取。那么,究竟该如何正确地的关闭和开启Sy
    发表于 12-03 09:09

    HAL库常用函数汇总

    1,系统函数HAL_Delay原型:voidHAL_Delay(uint32_tDelay);作用:利用滴答定时器生成的系统延迟函数参数:Delay:延迟时间,单位是ms返回值:无示例代码
    的头像 发表于 11-29 08:00 662次阅读
    <b class='flag-5'>HAL</b>库常用函数汇总

    pcb板线路腐蚀清洗注意事项

    pcb板线路腐蚀清洗注意事项
    的头像 发表于 11-24 17:21 522次阅读

    VGA OUT 的PCB设计注意事项

    VGA OUT 的PCB设计注意事项
    的头像 发表于 11-23 09:04 341次阅读

    FreeRTOS中osDelay和HAL_Delay的区别

    ;A\r\n");HAL_Delay(1000);}}voidB(void*argument){while(1){printf("B\r\n");HAL_Delay(1000);}}烧
    的头像 发表于 10-29 08:00 844次阅读
    FreeRTOS中osDelay和<b class='flag-5'>HAL_Delay</b>的区别

    中8位MCU EEPROM使用注意事项

    中颖8位MCU EEPROM使用注意事项
    的头像 发表于 09-27 15:34 504次阅读
    中8位MCU EEPROM使用<b class='flag-5'>注意事项</b>

    直线模组的运行注意事项

    直线模组的运行注意事项
    的头像 发表于 08-21 17:36 895次阅读
    直线模组的运行<b class='flag-5'>注意事项</b>

    安全光栅选择注意事项

    安全光栅选择注意事项
    的头像 发表于 07-14 10:24 552次阅读
    安全光栅选择<b class='flag-5'>注意事项</b>

    使用注意事项

    使用注意事项
    发表于 07-07 19:04 0次下载
    使用<b class='flag-5'>注意事项</b>

    安全光幕选型方法以及注意事项

    安全光幕选型方法以及注意事项
    的头像 发表于 07-06 13:59 483次阅读
    安全光幕选型方法以及<b class='flag-5'>注意事项</b>

    安全光幕选型方法以及注意事项

    安全光幕选型方法以及注意事项
    的头像 发表于 06-28 14:35 461次阅读
    安全光幕选型方法以及<b class='flag-5'>注意事项</b>