目录
【1】Systick定时器
概念:
SysTick又称滴答定时器。是一个定时设备,位于Cortex-M0内核中,和NVIC捆绑,产生SysTick异常(IRQ异常号15)可以对输入的时钟进行计数,系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。
工作原理
工作原理:
滴答定时器是一个24位递减定时器,也就是最多能计数2^24(0xFFFFFF)。
SysTick设定初值并使能后,每来一个时钟信号,计数值就减1。
计数到0时,触发中断,SysTick计数器自动重装初值并继续减一,循环不断。
系统默认开启滴答定时器。
时钟基准
探究:systick多久触发一次异常?
首先看Systick每次触发异常在异常处理程序中做了哪些工作
每次systick触发中断后会让uwTick自加1
这个uwTick的值就作为我们系统的时钟基准。
然后再来研究一下,uwTick多久会被加1.
在main.c中main函数首个执行的函数HAL_Init(),会对systick进行初始化。
在HAL_Init中通过调用HAL_InitTick函数,对Tick进行初始化
传递参数为:
TICK_INT_PRIORITY = 0 作为systick的中断优先级
调用HAL_SYSTICK_Config函数用于配置systick时基
SystemCoreClock / (1000U /(uint32_t)uwTickFreq)
uint32_t SystemCoreClock = 16000000UL;
16000000 / 1000 / 1 = 16000
将16000作为参数传递给了HAL_SYSTICK_Config函数
Systic_Config函数对Systick的重装值、初值、优先级和校准值都进行了配置。
if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) //如果systick初值大于最大值0xFFFFFF
{
return (1UL); //返回1 说明配置失败
}
SysTick->LOAD = (uint32_t)(ticks - 1UL); /* 重载的计数值 */ 16000 - 1
NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
return (0UL);
先来看一下每次重装的值为多少
SysTick->LOAD = (uint32_t)(ticks - 1UL); //即16000 - 1
从16000 - 1开始递减到0,总共需要计数16000次
当前时钟频率16Mhz,说明计一个数用时1/16M s
计16000个数需要用时 16000 * 1/16000000 s = 1/1000 s = 1ms
因此Systick每隔1ms会触发一次异常。