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

    文章

    898

    浏览量

    41489
  • 源码
    +关注

    关注

    8

    文章

    640

    浏览量

    29197
  • 函数
    +关注

    关注

    3

    文章

    4329

    浏览量

    62588
  • Systick
    +关注

    关注

    0

    文章

    62

    浏览量

    13081
  • HAL
    HAL
    +关注

    关注

    2

    文章

    70

    浏览量

    12611
收藏 人收藏

    评论

    相关推荐

    多层板埋孔设计注意事项

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

    PCBA生产注意事项

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

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

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

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

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

    绕线电感定制的注意事项

    电子发烧友网站提供《绕线电感定制的注意事项.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

    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

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

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

    EMI / Safety观念简介及注意事项

    电子发烧友网站提供《EMI / Safety观念简介及注意事项.ppt》资料免费下载
    发表于 02-28 09:45 1次下载

    浪涌抑制器的应用及注意事项

    浪涌抑制器的应用及注意事项?|深圳比创达电子
    的头像 发表于 01-19 09:55 735次阅读
    浪涌抑制器的应用及<b class='flag-5'>注意事项</b>?

    测速电机: 常见6大注意事项

    测速电机: 常见6大注意事项!测速电机是一种用于测量物体运动速度的设备,广泛应用于工业生产和科学研究中。测速电机常见的6大注意事项以确保安全和准确性。
    的头像 发表于 01-11 10:53 486次阅读
    测速电机: 常见6大<b class='flag-5'>注意事项</b>