写在前面——
《STM32单片机开发应用教程(HAL库版)—基于国信长天嵌入式竞赛实训平台(CT117E-M4)》第四章4.2 sysTICK系统定时器,本节讲述syTIK系统定时器原理,以及其使用方法
官方例程下载:https://pan.baidu.com/s/1QC5BnDgY1m1me6-ihQ_OUQ?pwd=nqb1
提取码:nqb1
目录
4.2 sysTICK系统定时器
4.2.1. 实验任务
1. 参考官方例程HAL_03_SYSTICK,掌握延迟函数HAL_Delay,实现流水灯。
2. 功能拓展:使用全局变量uwTick,实现自定义计时。
4.2.2. sysTICK系统定时器原理
1. sysTICK功能解析
sysTICK系统定时器在CPU核内部实现的,跟MCU外设无关,因此无需外部电路连接。只要是ARM Cortex-M系列内核的MCU都包含这个定时器。使用内核的sysTICK定时器来实现延时,可以不占用系统定时器,节约资源。
sysTICK 一般用于 HAL 库的毫秒级延时函数HAL_Delay(),可以实现精准的延时计时。该函数已经封装好了,直接调用即可。
但是,在按键长/短按等实例中,需要精确的计时,这就要使用到sysTICK定时器。
简单说, sysTICK就是一个24bit、倒计时(递减计数)、自动重装载定时器,倒计时结束会产生一个中断。
设:VAL中的数值为 80,脉冲频率为 80MHz,则VAL由 80 减到 0 所需要的时间为 ,并且当减到 0 时会触发中断(相当于 1us 定时器),同时 LOAD 的值也会重新载入到VAL中。
在 STM32CubeMX 中配置好时钟树后,时钟频率会输入到 Cortex System timer内核时钟 。而 sysTICK又属于内核,故给到 sysTICK的脉冲频率来自于此。
2. sysTICK —HAL_Delay函数代码解析
精准的1ms定时在SysTick_Config()中,从此函数逐渐深入到 core_cm4.h 中就有详细的SysTICK配置。
LOAD寄存器 和 VAL寄存器 的值都在此函数中配置好了。
这样,执行我们编程的函数时,内核还会不断的产生1ms中断(只是我们看不见),该中断服务函数SysTick_Handler在stm32g4xx.it.c中。
其中,HAL_IncTick()在stm32g4xx_hal.c中定义:
其中,uwTick是一个全局变量(非常重要的变量),uwTickFreq 的值为1(可跳转