Systick的中断是在哪里使能的?
用Cube生成了一个工程文件,在“stm32f4xx_it.c”中就会有Systick的中断处理函数SysTick_Handler(),并且程序能够进入到这里。上电TICKINT位应该默认为0,也就是禁止Systick中断的。那么意味着程序里一定有地方使能了Systick中断。
可是我只找到HAL_InitTick()这个函数,里面也没有去使能Systick中断,那么到底在哪里使能的呢?
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);
} void HAL_ResumeTick(void)
{
/* Enable SysTick Interrupt */
SET_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk);
}
:loveliness::loveliness: 哀歌与世无争 发表于 2019-10-10 09:58
HAL_InitTick()里面的HAL_SYSTICK_Config(),HAL_SYSTICK_Config函数里调用的SysTick_Config(TicksNumb);
...
SysTick_Config()只设置了SysTick的中断优先级,没有去使能SysTick中断 Paderboy 发表于 2019-10-10 09:33
void HAL_ResumeTick(void)
{
/* Enable SysTick Interrupt */
没有看到调用HAL_ResumeTick()的地方啊! 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-16 15:42
有的,看注释也知道,怎么说没有呢,难道你说的是NVIC没设置?systick属于内核中断,不可屏蔽,一直都是 ...
明白了,谢谢! 哀歌与世无争 发表于 2019-10-16 15:42
有的,看注释也知道,怎么说没有呢,难道你说的是NVIC没设置?systick属于内核中断,不可屏蔽,一直都是 ...
明白了,谢谢! CUBE库中在一开始的 HAL_Init()中。找到后继续往下看,里面有详细的源码:)
SYSTICK中断也是可以屏蔽的。
页:
[1]