希望在转角 发表于 2019-10-9 17:50:13

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

       用Cube生成了一个工程文件,在“stm32f4xx_it.c”中就会有Systick的中断处理函数SysTick_Handler(),并且程序能够进入到这里。
       上电TICKINT位应该默认为0,也就是禁止Systick中断的。那么意味着程序里一定有地方使能了Systick中断。
       可是我只找到HAL_InitTick()这个函数,里面也没有去使能Systick中断,那么到底在哪里使能的呢?

哀歌与世无争 发表于 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;
}


/**
* @briefInitializes the System Timer and its interrupt, and starts the System Tick Timer.
*         Counter is in free running mode to generate periodic interrupts.
* @paramTicksNumb: Specifies the ticks Number of ticks between two interrupts.
* @retval status:- 0Function succeeded.
*                  - 1Function 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);
}

:loveliness::loveliness:

希望在转角 发表于 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()中。找到后继续往下看,里面有详细的源码:)

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异常
页: [1]
查看完整版本: Systick的中断是在哪里使能的?