滴答定时器(时钟)
用途
各种算法需要的采样时间、外设模块需要的延时时间、测试所需的延时时间等,都可以使用SysTick
该功能不一定用作定时器,一种常规用法是直接读取SysTick->LOAD
(定时器重装载值)、SysTick->VAL
(定时器当前值)和SysTick->CTRL
(第16位为定时器溢出标志,读一次清空)
系统结构树
//自上而下,逐级调用,配置系统时钟溢出时间
void main()
//用于配置各种系统参数
HAL_StatusTypeDef HAL_Init(void);
//弱函数,未重定向,该函数唯一参数用于分配滴答定时器优先级
//但内部有全局变量SystemCoreClock和uwTickFreq控制定时器溢出
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority);
//如果SystemCoreClock不除以一个数的话,滴答定时器正好1s溢出一次
HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq));
以下为SystemCoreClock赋值的过程
使滴答定时器正好1s把SystemCoreClock计完,然后溢出
//自上而下,逐级调用,配置系统时钟溢出时间
void main();
void SystemClock_Config(void);
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> RCC_CFGR_HPRE_Pos];
使用
使用起来实际上没有那么复杂,在cubeMX配置好the Cortex System Timer后
HAL_Delay()函数会调用滴答定时器的溢出情况(中断)来计时
上述提到的变量uwTickFreq(值来自宏HAL_TICK_FREQ_1KHZ==1),即让SysTick每1ms溢出一次
换句话说,HAL_Delay()函数的时基单元为1ms
我们也可以直接调用SysTick->LOAD和SysTick->VAL,来计算各种时间(如某一个函数的被调用频率)