目录
什么是系统定时器
系统定时器又:SysTick。
系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往 复。 因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器, 使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维 持操作系统的心跳。
四个寄存器
SysTick有4个寄存器,汇总如下:(配置寄存器就是控制芯片)
其中第4个寄存器,也就是校验数值寄存器在本操作中并不是很重要,所以可以不配置了。
配置定时器
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
//重载数值寄存器
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
//优先级配置
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
//当前数值寄存器
SysTick->VAL = 0; /* Load the SysTick Counter Value */
//控制及状态寄存器
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |//时钟源选择位
SysTick_CTRL_TICKINT_Msk |//中断
SysTick_CTRL_ENABLE_Msk; //使能位 /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}
一、首先判断我们的参数是否合格,不合格直接返回1;
二、Reload值的配置,就是配置每次运行完后Reload的值;
三、设置中断的优先级;
四、当前寄存器记录者时时刻刻的Load的值;
五、控制及状态寄存器的相应的配置
时钟源的选择,选择是否分频
中断使能打开
定时器打开
这样就配置了一个隔一定时间,Load又回到Reload,同时这里有一个标志位,那就是COUNTFLAG。
微秒(us)定时器
void Systick_Delay_us(uint32_t us)
{
uint32_t i;
SysTick_Config(72);
for(i=0;i<us;i++)//这里类似于while(us--)
{
while(!((SysTick->CTRL)&(1<<16)));//这里检测的是标志位,是否置1,当时间未达到要求时,一直循环;
}
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
}
该函数运行结果如下:
开启计时器
在循环里面就是 每个隔1us就会有COUNTFLAG置1,所以这时候 i就会加1
这里循环一次就是表明达到了定时器设定,1us;
这里总时间是多少还得看循环多少次,毕竟循环一次就是1us,所以想要定时多少时间就设置多少次循环;
毫秒(ms)定时器
void Systick_Delay_ms(uint32_t ms)
{
uint32_t i;
SysTick_Config(72000);
for(i=0;i<ms;i++)//这里类似于while(us--)
{
while(!((SysTick->CTRL)&(1<<16)));//这里检测的是标志位,是否置1,当时间未达到要求时,一直循环;
}
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
}
这里的解释和微秒的一样,位移不同的就是定时器设置为毫秒定时器;