你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Systick的中断是在哪里使能的?

[复制链接]
希望在转角 提问时间:2019-10-9 17:50 /
       用Cube生成了一个工程文件,在“stm32f4xx_it.c”中就会有Systick的中断处理函数SysTick_Handler(),并且程序能够进入到这里。
       上电TICKINT位应该默认为0,也就是禁止Systick中断的。那么意味着程序里一定有地方使能了Systick中断。
       可是我只找到HAL_InitTick()这个函数,里面也没有去使能Systick中断,那么到底在哪里使能的呢?
收藏 评论10 发布时间:2019-10-9 17:50

举报

10个回答
哀歌与世无争 回答时间:2019-10-10 09:58:16
HAL_InitTick()里面的HAL_SYSTICK_Config(),HAL_SYSTICK_Config函数里调用的SysTick_Config(TicksNumb);
/* Configure the SysTick to have interrupt in 1ms time basis*/
  if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U)
  {
    return HAL_ERROR;
  }


/**
  * @brief  Initializes the System Timer and its interrupt, and starts the System Tick Timer.
  *         Counter is in free running mode to generate periodic interrupts.
  * @param  TicksNumb: Specifies the ticks Number of ticks between two interrupts.
  * @retval status:  - 0  Function succeeded.
  *                  - 1  Function failed.
  */
uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb)
{
   return SysTick_Config(TicksNumb);
}
Paderboy 回答时间:2019-10-10 09:33:52
void HAL_ResumeTick(void)
{
  /* Enable SysTick Interrupt */
  SET_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk);
}

希望在转角 回答时间:2019-10-16 10:13:30
哀歌与世无争 发表于 2019-10-10 09:58
HAL_InitTick()里面的HAL_SYSTICK_Config(),HAL_SYSTICK_Config函数里调用的SysTick_Config(TicksNumb);
  ...

SysTick_Config()只设置了SysTick的中断优先级,没有去使能SysTick中断
希望在转角 回答时间:2019-10-16 10:13:58
Paderboy 发表于 2019-10-10 09:33
void HAL_ResumeTick(void)
{
  /* Enable SysTick Interrupt */

没有看到调用HAL_ResumeTick()的地方啊!
哀歌与世无争 回答时间:2019-10-16 15:42:40
macompengluo 发表于 2019-10-16 10:13
SysTick_Config()只设置了SysTick的中断优先级,没有去使能SysTick中断

有的,看注释也知道,怎么说没有呢,难道你说的是NVIC没设置?systick属于内核中断,不可屏蔽,一直都是使能的,你可以点CubeMX里的NVIC设置,就会发现systick的Enabled是取消不了的,也就是默认中断使能的。所以只要开systick控制寄存器里的中断使能位就行了。
SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */
Timer */

完整的SysTick_Config:
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
  {
    return (1UL);                                                   /* Reload value impossible */
  }

  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */
  return (0UL);                                                     /* Function successful */
}
希望在转角 回答时间:2019-10-21 19:02:41
哀歌与世无争 发表于 2019-10-16 15:42
有的,看注释也知道,怎么说没有呢,难道你说的是NVIC没设置?systick属于内核中断,不可屏蔽,一直都是 ...

明白了,谢谢!
希望在转角 回答时间:2019-10-21 19:03:18
哀歌与世无争 发表于 2019-10-16 15:42
有的,看注释也知道,怎么说没有呢,难道你说的是NVIC没设置?systick属于内核中断,不可屏蔽,一直都是 ...

明白了,谢谢!
butterflyspring 回答时间:2019-10-31 16:58:31
CUBE库中在一开始的 HAL_Init()中。找到后继续往下看,里面有详细的源码
systick.PNG
Ankky 回答时间:2019-11-1 08:51:48
SYSTICK中断也是可以屏蔽的。
橡胶机械记 回答时间:2024-4-14 16:55:25

Ankky 发表于 2019-11-1 08:51
SYSTICK中断也是可以屏蔽的。

能详细聊一下吗,我看手册里面只是说NMI是不可屏蔽中断,但我用

    // NVIC_DisableIRQ(PendSV_IRQn);

这个函数去屏蔽它们时,会进入Fault异常

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版