Systick滴答定时器
SysTick是一个24位定时器,属于Cortex-M4内核中的一个外设,类似NVIC。用于提供时间基准,多为操作系统所使用,常用于对时间要求严格的情况,意义是很重要的。
SysTick定时器一次最多可以计数2^24(24bit)个时钟脉冲,这个脉冲计数值保存在当前计数值寄存器STK_VAL(Systick current value register)中,只能向下计数,也就是倒计数。每接收到一个时钟脉冲(CPU主频,这里是168MHz),STK_VAL的值就会向下减1,当减到0时,硬件会自动将重装载寄存器STK_LOAD(可以设定,跟STK_VAL初始值相等)中保存的数值加载到STK_VAL,使其重新计数。并且,系统滴答定时器就产生一次中断,以此循环往复,只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。

相关的寄存器
HAL库函数对systick的初始化
HAL_Init();中调用初始化函数HAL_InitTick(TICK_INT_PRIORITY); 参数TICK_INT_PRIORITY是滴答定时器中断优先级,初值为0
HAL_InitTick(TICK_INT_PRIORITY);函数中调用HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq))函数和HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);函数,
HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq))函数调用 SysTick_Config函数配置重载值寄存器,当前值寄存器,并配置控制及状态寄存器,启动滴答定时器,允许定时器中断,始终选择为系统时钟168MHZ,
HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);函数配置滴答定时器优先级

systick的两种用法
第一种用法
滴答定时器默认配置是1ms,时间到自动进入到中断处理函数void SysTick_Handler(void)中,中断处理函数对变量进行++,然后延时函数HAL_Delay(1000); 通过变零的值确定延时时间,实现延时

第二种用法
滴答定时器默认配置好中断时间后,每次进入中断都会调用中断处理函数HAL_SYSTICK_IRQHandler();这个函数需要自己添加,中断处理函数中调用HAL_SYSTICK_Callback();中断回调函数,在回调函数中通过计数也可以确定时间,这种用法程序不用等待,只需要做判断就可以。

自己对systick的初始化
// HAL_RCC_GetHCLKFreq()/1000    1ms中断一次
// HAL_RCC_GetHCLKFreq()/100000     10us中断一次
// HAL_RCC_GetHCLKFreq()/1000000 1us中断一次
1
2
3
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); // 配置并启动系统滴答定时器
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); // 系统滴答定时器时钟源
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); /* 系统滴答定时器中断优先级配置 */
这样可以方便确定中断的时间基准。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/lscguoke/article/details/104060536

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐