OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3089|回复: 3

HAL库的1ms延时计数底层实现机制

[复制链接]

4

主题

57

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1740
金钱
1740
注册时间
2017-6-23
在线时间
170 小时
发表于 2023-6-12 11:03:04 | 显示全部楼层 |阅读模式
1金钱
HAL库中,HAL_Delay(n)在不同系统时钟下都可以实现n毫秒延时,其底层实现在系统初始化时自动完成,使用官方cubeMX自动生成任意一个工程代码,进入main函数后,首先调用下面两个函数
  1.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  2.     HAL_Init();
  3.    
  4.     /* Configure the system clock */
  5.     SystemClock_Config();
复制代码
在这两个函数中都有调用以下函数


  1. __weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
  2. {
  3.   HAL_StatusTypeDef  status = HAL_OK;

  4.   /* Check uwTickFreq for MisraC 2012 (even if uwTickFreq is a enum type that doesn't take the value zero)*/
  5.   if ((uint32_t)uwTickFreq != 0U)
  6.   {
  7.     /*Configure the SysTick to have interrupt in 1ms time basis*/
  8.     if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / (uint32_t)uwTickFreq)) == 0U)
  9.     {
  10.       /* Configure the SysTick IRQ priority */
  11.       if (TickPriority < (1UL << __NVIC_PRIO_BITS))
  12.       {
  13.         HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
  14.         uwTickPrio = TickPriority;
  15.       }
  16.       else
  17.       {
  18.         status = HAL_ERROR;
  19.       }
  20.     }
  21.     else
  22.     {
  23.       status = HAL_ERROR;
  24.     }
  25.   }
  26.   else
  27.   {
  28.     status = HAL_ERROR;
  29.   }

  30.   /* Return function status */
  31.   return status;
  32. }
复制代码
计算每毫秒时间内的系统时钟计数值,调用HAL_SYSTICK_Config()函数,写入寄存器,实现毫秒延时
  1. #if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)

  2. /**
  3.   \brief   System Tick Configuration
  4.   \details Initializes the System Timer and its interrupt, and starts the System Tick Timer.
  5.            Counter is in free running mode to generate periodic interrupts.
  6.   \param [in]  ticks  Number of ticks between two interrupts.
  7.   \return          0  Function succeeded.
  8.   \return          1  Function failed.
  9.   \note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
  10.            function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
  11.            must contain a vendor-specific implementation of this function.
  12. */
  13. __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
  14. {
  15.   if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
  16.   {
  17.     return (1UL);                                                   /* Reload value impossible */
  18.   }

  19.   SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
  20.   NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
  21.   SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */
  22.   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
  23.                    SysTick_CTRL_TICKINT_Msk   |
  24.                    SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */
  25.   return (0UL);                                                     /* Function successful */
  26. }

  27. #endif
复制代码

问题来了,#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)表达式值为true,为啥显示结果是false的样子?
微信截图_20230612105858.png

最佳答案

查看完整内容[请看2#楼]

你不回帖我回帖,我不回帖谁回帖
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

57

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1740
金钱
1740
注册时间
2017-6-23
在线时间
170 小时
 楼主| 发表于 2023-6-12 11:03:05 | 显示全部楼层
你不回帖我回帖,我不回帖谁回帖
回复

使用道具 举报

4

主题

57

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1740
金钱
1740
注册时间
2017-6-23
在线时间
170 小时
 楼主| 发表于 2023-6-14 11:03:17 | 显示全部楼层
你不回帖我回帖,我不回帖谁回帖
回复

使用道具 举报

10

主题

74

帖子

0

精华

高级会员

Rank: 4

积分
607
金钱
607
注册时间
2014-4-12
在线时间
182 小时
发表于 2023-6-14 17:37:31 | 显示全部楼层
我把#if和#endif给注释掉了,反正能用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 07:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表