SysTick详解
SysTick详解
SysTick定时器简介
SysTick定时器也叫SysTick滴答定时器,它是Cortex内核的一个外设,被嵌入在NVIC中。它是一个24位向下递减的定时器,每计数一次所需时间为1/SYSTICK,SYSTICK是系统定时器时钟,它可以直接取自系统时钟,还可以通过系统时钟8分频后获取。当定时器计数到0时,将从LOAD 寄存器中自动重装定时器初值,重新向下递减计数,如此循环往复。如果开启SysTick中断的话,当定时器计数到0,将产生一个中断信号。因此只要知道计数的次数就可以准确得到它的延时时间。
SysTick定时器作为HAL_Delay的基准
在cube生成的代码中,main函数中HAL_RCC_ClockConfig();
初始化系统时钟的时候Systick被初始化。
初始化时,Cube默认设置Systick中断优先级为最高优先级,中断周期由函数HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)
确定,默认值为1ms。
中断频率可以通过修改HAL_TICK_FREQ_DEFAULT参数修改,hal.h中给出10Hz,100Hz,1KHz,三种选项。
修改后HAL_Delay函数延时的时间也会改变
如何修改SysTick中断频率?
1 | __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) |
Systick的中断频率是通过该函数设置的,SystemCoreClock是系统的主频。
“SysTick->LOAD = ticks – 1;”知道,ticks就是LOAD值,即重载值,表示两次中断的计数。
我们知道了时钟,就知道定时器每递减一个值需要的时间了,即:1/SystemCoreClock 秒,即每递减一个值,耗时1/SystemCoreClock秒。所以如果要使得10ms定时,即0.01/(1/SystemCoreClock)=SystemCoreClock/100,回头看看前面定时10ms的参数,是不是这个值呢。以此类推,需要定时多长时间,你可以自己算一个参数带进去了,需要注意的是,LOAD值是个24位数,带进去的数不要超过24位数的最大值。还有一个需要注意的地方,就是LOAD值最小255,当你给LOAD值带进去小于255值,LOAD会自动变成255。
因此,如果要把HAL_Delay改成1us一次中断
HAL_SYSTICK_Config(==SystemCoreClock / (10U / uwTickFreq)==);即修改重载值为==SystemCoreClock/10^6==,则中断一次需要(1/SystemCoreClock)X SystemCoreClock/10^6 = 1us。
但实际上中断设为1us是不行的,因为SystemCoreClock/10^6<255了,所以可以改成10us,即装载设成==SystemCoreClock /10^5==
使用时的注意事项
1.需要注意的是,调高Systick的中断频率会导致系统频繁中断,实际应用中不建议将Systick设置的过高。
如需快于1ms的时间基准,建议再开一个定时器,通过读取TIMx->CNT来获取。
2.在用户的其他中断中使用HAL_Delay(),如果遇到延时跳不出的情况,检查用户中断优先级,建议用户中断优先级设置尽可能的低
非修改SysTick中断频率得到1us延时的方法
1 |
|
SystemCoreClock/1000000 = (1/1000000) / (1/SystemCoreClock)=1 us / SysTick中断周期