1. SysTick概述
SysTick即为系统定时器,又称嘀嗒定时器,是Cortex-M3内核的一个外设,集成在NVIC中。Systick定时器是一个24位的倒计数定时器,从预装值(自己设置的)一直计数到0时,然后再将从重装载寄存器中自动重装载定时初值。只要不把它使能位清除,那么它就永远不停,即使在芯片在睡眠模式下也能工作。每计数一次的时间为1/SYSCLK分别是内部时钟(FCLK 自由运行时钟,等于系统总线时钟HCLK72MHZ)和外部时钟(STCLK Cortex系统定时器时钟,等于系统总线时钟HCLK的8分频 9MHZ)。
操作系统需要执行多任务管理,用SysTick产生中断,确保单个任务不会锁定整个系统。同时SysTick还可用于闹钟定时、时间测量等。
1.1、 Systick定时器内部框图

2、相关寄存器

2.1、控制及状态寄存器(SysTick-》CTRL)
寄存器作用:设置SysTick定时器的工作模式位31:17 保留,必须保持复位值。
位16 COUNTFLAG:到0标志位
当SysTick定时器的计数值倒计数到0时,该位会被硬件自动置1。如果我们读取该位,会得到目前的状态,然后此位会被自动清0。
位15:3 保留,必须保持复位值。
位2 CLKSOURCE:SysTick时钟源输入选择
0:选择外部时钟作为计数脉冲的参考时钟(SysClk/8)
1:选择系统时钟作为计数脉冲(SysClk)
位1 TICKINT:SysTick中断使能
0:禁止产生SysTick中断
1:允许产生SysTick中断
位0 ENABLE:SysTick使能
0:关闭SysTick定时器
1:开启SysTick定时器
2.2 自动重装载数据寄存器(SysTick-》LOAD)
寄存器作用:存放重装载SysTick定时器计数初值

2.3、 当前值寄存器(SysTick-》VAL)
寄存器作用:SysTick定时器倒计数寄存器。读取时返回当前倒计数的值,对这个寄存器进行写操作,则使之清零,并对到零标志位清零。

3、 SysTick定时器初始值
3.1 定时器初值计算
总所周知,需要定时的时长由系统时钟频率和载入的初始值共同决定。假设外部时钟为24MHz,那么计数周期为1
/(24MHz)=1/24us,则计24次就是1us的定时。同时要注意,由于计数位宽是24位,所以最大计数值不能超过2的24次方-1(即
16777215),由此可得出微秒级的初始值计算公式: LOAD- 1 = Clk * us 公式4.1:定时器初值计算公式
注:us:需要定时的微秒时间值。 LOAD:需要填入SysTick定时器自动重装载寄存器的值。
Clk:SysTick定时器定时频率,单位是MHz。
3.2 SysTick定时器延时程序设计流程
写一个微秒级延时函数
选择时钟源(一般选择外部时钟源CTRL寄存器迪2bit清零)
设置LOAD寄存器决定计数器的初值
对VAL寄存器赋初值(写什么无所谓,val寄存器都会清零,目的是让LOAD的值加载到VAL寄存器)
使能定时器(CTRL第0位)
判断定时时间是否到达(不停的去读CTRL寄存器的第16位是否为)
关闭定时器(CTRL第一位)
4、代码
4.1、毫秒级
void delay_ms(u16 ms)
{
SysTick-》CTRL &= ~(0x1《《2); //选择外部时钟9MHZ
SysTick-》VAL =0x00; //预设初值
SysTick-》LOAD = ms*9*1000; //需要填入SysTick定时器自动重装载寄存器的值,9*1000为1ms
SysTick-》CTRL |= 0x1《《0; //开启SysTick定时器
while(!(SysTick-》CTRL & (0x1《《16))){ //当CTRL第16bit为1时,数数结束
;
}
SysTick-》CTRL &= ~(0x1《《0); //关闭SysTick定时器
SysTick-》VAL &=~(0x1《《0);
}
4.2、微秒级
void delay_us(u16 us)
{
SysTick-》CTRL &= ~(0x1《《2); //选择外部时钟9MHZ
SysTick-》VAL =0x00; //预设初值
SysTick-》LOAD = us*9; //需要填入SysTick定时器自动重装载寄存器的值,1us
SysTick-》CTRL |= 0x1《《0; //开启SysTick定时器
while(!(SysTick-》CTRL & (0x1《《16))){ //当CTRL第16bit为1时,数数结束
;
}
SysTick-》CTRL &= ~(0x1《《0); //关闭SysTick定时器
SysTick-》VAL &=~(0x1《《0);
}
1. SysTick概述
SysTick即为系统定时器,又称嘀嗒定时器,是Cortex-M3内核的一个外设,集成在NVIC中。Systick定时器是一个24位的倒计数定时器,从预装值(自己设置的)一直计数到0时,然后再将从重装载寄存器中自动重装载定时初值。只要不把它使能位清除,那么它就永远不停,即使在芯片在睡眠模式下也能工作。每计数一次的时间为1/SYSCLK分别是内部时钟(FCLK 自由运行时钟,等于系统总线时钟HCLK72MHZ)和外部时钟(STCLK Cortex系统定时器时钟,等于系统总线时钟HCLK的8分频 9MHZ)。
操作系统需要执行多任务管理,用SysTick产生中断,确保单个任务不会锁定整个系统。同时SysTick还可用于闹钟定时、时间测量等。
1.1、 Systick定时器内部框图

2、相关寄存器

2.1、控制及状态寄存器(SysTick-》CTRL)
寄存器作用:设置SysTick定时器的工作模式位31:17 保留,必须保持复位值。
位16 COUNTFLAG:到0标志位
当SysTick定时器的计数值倒计数到0时,该位会被硬件自动置1。如果我们读取该位,会得到目前的状态,然后此位会被自动清0。
位15:3 保留,必须保持复位值。
位2 CLKSOURCE:SysTick时钟源输入选择
0:选择外部时钟作为计数脉冲的参考时钟(SysClk/8)
1:选择系统时钟作为计数脉冲(SysClk)
位1 TICKINT:SysTick中断使能
0:禁止产生SysTick中断
1:允许产生SysTick中断
位0 ENABLE:SysTick使能
0:关闭SysTick定时器
1:开启SysTick定时器
2.2 自动重装载数据寄存器(SysTick-》LOAD)
寄存器作用:存放重装载SysTick定时器计数初值

2.3、 当前值寄存器(SysTick-》VAL)
寄存器作用:SysTick定时器倒计数寄存器。读取时返回当前倒计数的值,对这个寄存器进行写操作,则使之清零,并对到零标志位清零。

3、 SysTick定时器初始值
3.1 定时器初值计算
总所周知,需要定时的时长由系统时钟频率和载入的初始值共同决定。假设外部时钟为24MHz,那么计数周期为1
/(24MHz)=1/24us,则计24次就是1us的定时。同时要注意,由于计数位宽是24位,所以最大计数值不能超过2的24次方-1(即
16777215),由此可得出微秒级的初始值计算公式: LOAD- 1 = Clk * us 公式4.1:定时器初值计算公式
注:us:需要定时的微秒时间值。 LOAD:需要填入SysTick定时器自动重装载寄存器的值。
Clk:SysTick定时器定时频率,单位是MHz。
3.2 SysTick定时器延时程序设计流程
写一个微秒级延时函数
选择时钟源(一般选择外部时钟源CTRL寄存器迪2bit清零)
设置LOAD寄存器决定计数器的初值
对VAL寄存器赋初值(写什么无所谓,val寄存器都会清零,目的是让LOAD的值加载到VAL寄存器)
使能定时器(CTRL第0位)
判断定时时间是否到达(不停的去读CTRL寄存器的第16位是否为)
关闭定时器(CTRL第一位)
4、代码
4.1、毫秒级
void delay_ms(u16 ms)
{
SysTick-》CTRL &= ~(0x1《《2); //选择外部时钟9MHZ
SysTick-》VAL =0x00; //预设初值
SysTick-》LOAD = ms*9*1000; //需要填入SysTick定时器自动重装载寄存器的值,9*1000为1ms
SysTick-》CTRL |= 0x1《《0; //开启SysTick定时器
while(!(SysTick-》CTRL & (0x1《《16))){ //当CTRL第16bit为1时,数数结束
;
}
SysTick-》CTRL &= ~(0x1《《0); //关闭SysTick定时器
SysTick-》VAL &=~(0x1《《0);
}
4.2、微秒级
void delay_us(u16 us)
{
SysTick-》CTRL &= ~(0x1《《2); //选择外部时钟9MHZ
SysTick-》VAL =0x00; //预设初值
SysTick-》LOAD = us*9; //需要填入SysTick定时器自动重装载寄存器的值,1us
SysTick-》CTRL |= 0x1《《0; //开启SysTick定时器
while(!(SysTick-》CTRL & (0x1《《16))){ //当CTRL第16bit为1时,数数结束
;
}
SysTick-》CTRL &= ~(0x1《《0); //关闭SysTick定时器
SysTick-》VAL &=~(0x1《《0);
}
举报