系统时钟 SysTick

什么是 SysTick?

CM3的内核中包含一个SysTick时钟。SysTick为一个24位的递减计数器,SysTick设定初值并使能后,每经过1个系统时钟周期,计数值就减1。当计数到0后,SysTick计数器自动重装初值并继续计数,同时内部的COUNTFLAG标志会被置1,触发中断。中断响应属于NVIC异常,异常号为15

SysTick定时器寄存器

<1> CTRL 寄存器
CTRL 是 SysTick 定时器的控制及状态寄存器。其相应位功能如下:
系统时钟 SysTick_第1张图片
注:CLKSOURCE 位是用于选择 SysTick 定时器时钟来源,如果该位为 1,表示其时钟是由系统时钟直接提供即 72M。如果为 0,表示其时钟是由系统时钟八分频后提供即 72/8=9M。

<2> LOAD 寄存器
LOAD 是 SysTick 定时器的重装载数值寄存器。其相应位功能如下:
在这里插入图片描述
因为 STM32F1 的 SysTick 定时器是一个 24 位递减计数器,因此重装载寄存
器中只使用到了低 24 位,即 bit0-bit23。当系统复位时,其值为 0。

<3> VAL 寄存器
VAL 是 SysTick 定时器的当前数值寄存器。其相应位功能如下:
在这里插入图片描述
同样只有 bit0-bit23 有效,复位时值为 0

<4> CALIB 寄存器
CALIB 是 SysTick 定时器的校准数值寄存器。其相应位功能如下:
系统时钟 SysTick_第2张图片
此寄存器在定时实验中不需要使用,可以不用了解。

SysTick操作步骤

<1> 设置SysTick定时器的时钟源
<2> 设置SysTick的重装初始值(如果需要中断,就将中断使能打开)
<3> 清零SysTick定时器当前计数器的值
<4> 打开SysTick定时器

毫秒延时 代码示例

static u16 fac_ms=0;							//ms延时倍乘数

//初始化延迟函数
//SYSTICK的时钟固定为AHB时钟的1/8
//SYSCLK:系统时钟频率
void SysTick_Init(u8 SYSCLK)
{
	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); 
	fac_us=SYSCLK/8;					
	fac_ms=(u16)fac_us*1000;				   
}								    

void delay_ms(u16 nms)
{	 		  	  
	u32 temp;		   
	SysTick->LOAD=(u32)nms*fac_ms;				//时间加载(SysTick->LOAD为24bit)
	SysTick->VAL =0x00;							//清空计数器
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;	//开始倒数  
	do
	{
		temp=SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));		//等待时间到达   
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;	//关闭计数器
	SysTick->VAL =0X00;       					//清空计数器	  	    
} 

你可能感兴趣的:(系统时钟 SysTick)