系统时钟计时器–SYSTICK
sysTick工作原理:
- sysTick 中断通过获取系统时钟(AHB 或者 AHB/8),通过重装载寄存器向递减计数器中存入初值,当递减计数器值为0时,触发相关的中断,我们也可以通过访问 SysTick->CTRL寄存器的第16位来判断是否计数完成(当递减计数器当前值为0时,该位置1,当该位被读取后,会自动清0)
- sysTick 中断属于内核层次的外设,他的库函数编写在 core_cm3.h 文件中,其中递减计数器和重载载寄存器都只有24位可以使用,即最大值为* 2^24*!
- 内核外设中断优先级并不一定比普通外设中断优先级高,如系统时钟滴答中断,在下面的函数中,设置优先级为15,即 1111,此时优先级是最低的!内核外设中断的优先级分组和普通外设中断分组相同,即只要只需要设置普通外设中断优先级分组即代表设置了内核中断优先级分组!
- 初始化系统滴答寄存器,就是配置下面的结构体!
typedef struct
{
__IO uint32_t CTRL;
__IO uint32_t LOAD;
__IO uint32_t VAL;
__I uint32_t CALIB;
} SysTick_Type;
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
return (0);
}
- 系统中断滴答,计时公式为: t = reload * (1 / clk); 如果 clk = 72M,那么
- reload = 72, t = 1us
- reload = 72000, t = 1ms