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

    文章

    900

    浏览量

    41918
  • 源码
    +关注

    关注

    8

    文章

    656

    浏览量

    29724
  • 函数
    +关注

    关注

    3

    文章

    4351

    浏览量

    63206
  • Systick
    +关注

    关注

    0

    文章

    62

    浏览量

    13215
  • HAL
    HAL
    +关注

    关注

    2

    文章

    71

    浏览量

    12735
收藏 人收藏

    相关推荐

    智多晶DDR Controller使用注意事项

    最后一期我们主要介绍智多晶DDR Controller使用时的注意事项
    的头像 发表于 01-24 11:14 309次阅读
    智多晶DDR Controller使用<b class='flag-5'>注意事项</b>

    多层板埋孔设计注意事项

    多层板埋孔设计注意事项
    的头像 发表于 12-20 16:06 376次阅读

    PCBA生产注意事项

       PCBA生产注意事项。 长按识别二维码关注[现代电子装联工艺技术]订阅号,开启我们共同的学习之旅 end
    的头像 发表于 11-15 17:04 550次阅读
    PCBA生产<b class='flag-5'>注意事项</b>

    如何为住宅配置静态IP:步骤与注意事项

    为住宅配置静态IP地址,通常涉及以下步骤和注意事项
    的头像 发表于 10-24 08:02 457次阅读

    脉冲式充电器的使用注意事项

    脉冲式充电器的使用注意事项主要包括以下几个方面: 一、安全注意事项 用电安全 :在充电过程中,应始终保持警惕,注意用电安全,避免触电和短路等危险情况的发生。 防火防灾 :避免在易燃易爆物品附近进行
    的头像 发表于 09-26 16:05 1467次阅读

    绕线电感定制的注意事项

    电子发烧友网站提供《绕线电感定制的注意事项.docx》资料免费下载
    发表于 09-20 11:24 0次下载

    共模电感定制的注意事项

    电子发烧友网站提供《共模电感定制的注意事项.docx》资料免费下载
    发表于 09-04 11:47 0次下载

    LiFePO4设计注意事项

    电子发烧友网站提供《LiFePO4设计注意事项.pdf》资料免费下载
    发表于 09-03 09:24 0次下载
    LiFePO4设计<b class='flag-5'>注意事项</b>

    cubeide中使用Hal_Delay()时,每次调试总会跳转到异常状态,如何解决?

    cubeide 中使用Hal_Delay()时,每次调试总会跳转到异常状态。 Break at address \"0xaf5cf47e\" with no debug
    发表于 07-23 07:52

    现场总线的使用方法与注意事项

    的稳定可靠运行,正确的使用方法和注意事项至关重要。本文将详细介绍现场总线的使用方法和注意事项,以供读者参考。
    的头像 发表于 06-06 11:49 950次阅读

    stm32cubemx的HAL_Delay()函数,当HAL_GetTick()的计数正好要溢出时,是不是延时就不准了?

    ; } __weak void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = 0; tickstart = HAL
    发表于 05-09 06:20

    FMD LINK 使用注意事项

    电子发烧友网站提供《FMD LINK 使用注意事项.pdf》资料免费下载
    发表于 05-06 10:11 0次下载

    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

    家用路由器的使用技巧和注意事项**

    家用路由器使用技巧包括合理放置、定期重启、设置强密码、设置访客网络、更新固件、启用双频网络和设置家长控制。注意事项包括避免过度拥挤、防止过度疲劳、防止遮挡信号、定期检查网络设备、保护隐私信息、避免恶意攻击和避免强度过高的信号。遵循这些技巧和注意事项,可以提高家庭网络的连接
    的头像 发表于 03-21 17:37 991次阅读

    STM32F767ZGT6改IAP后HAL_Delay卡死,定时器不进中断,直到freeRTOS初始化才开始中断,为什么?

    以后程序卡在HAL_Delay里,在定时器中断中加串口打印发现应该是定时器一直没有开启导致计数,应该MX_FREERTOS_Init()以及osKernelStart执行完以后才开启的定时器, 我把
    发表于 03-21 06:13