一、概述
SysTick 提供 1 个 24 位、降序、零约束、写清除的计数器,Systick设定初值并使能后,每经过1个系统时钟周期,计数值就减1。
计数到0时,Systick计数器自动重装载初值并继续计数,同时内部的COUNTFLAG标志置位,触发中断(如果中断使能)
二、相关寄存器
1. SysTick Control and Status Register
Systick控制及状态寄存器
位段 | 名称 | 类型 | 复位值 | 描述 |
16 | COUNTFLAG | R | 0 | 如果在上次读取本寄存器后,Systick已经数到0,则该位为1。如果读取该位,该位将自动清零。 |
2 | CLKSOURCE | R/W | 0 | 0=使用HCLK/8作为Systick时钟 1=使用HCLK作为Systick时钟 |
1 | TICKINT | R/W | 0 | 0=数到0时无动作 1=Systick倒数到0后产生Systick异常请求 |
0 | ENABLE | R/W | 0 | Systick定时器使能位 0=关闭Systick功能 1=开启Systick功能 |
2. SysTick Reload Value Register
Systick重装载数值寄存器
位段 | 名称 | 类型 | 复位值 | 描述 |
23:0 | RELOAD | R/W | 0 | 当Systick倒数计数至0时,将被重装载的值 |
3. SysTick Current Value Register
Systick当前数值寄存器
位段 | 名称 | 类型 | 复位值 | 描述 |
23:0 | CURRENT | R/W | 0 | 读取时返回当前倒计数的值,写它则使之清零, 同时还会清除在SysTick控制及状态寄存器中的COUNTFLAG 标志 |
三、Systick逻辑图
RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(Systick)的外部时钟。
四、代码示例
系统时钟为72MHz时,微秒/毫秒延时
1 void delay_us(u32 i) 2 { 3 u32 temp; 4 SysTick->LOAD=9*i; //设置重装数值, 系统时钟为72MHz 5 SysTick->CTRL=0x01; //使能,减到零是无动作,采用外部时钟源 6 SysTick->VAL=0; //清零计数器 7 do 8 { 9 temp=SysTick->CTRL; //读取当前倒计数值 10 } 11 while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达 12 SysTick->CTRL=0; //关闭计数器 13 SysTick->VAL=0; //清空计数器 14 }
1 void delay_ms(u32 i) 2 { 3 u32 temp; 4 SysTick->LOAD=9000*i; //设置重装数值, 系统时钟为72MHz 5 SysTick->CTRL=0X01; //使能,减到零是无动作,采用外部时钟源 6 SysTick->VAL=0; //清零计数器 7 do 8 { 9 temp=SysTick->CTRL; //读取当前倒计数值 10 } 11 while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达 12 SysTick->CTRL=0; //关闭计数器 13 SysTick->VAL=0; //清空计数器 14 }