stm32学习笔记之用systick写delay

一、系统滴答SysTick定时器 

      SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。大多数操作系统需要一个硬件定时器来产生滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务霸占系统;或者吧每个定时器周期的某个时间范围赐予特定的任务等,还有提供各种定时功能,都与滴答定时器有关。因此,需要一个定时器产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统的“心跳”的节奏。该定时器的时钟源可以是内部时钟(FCLK),或者是外部时钟(CM3处理器上的STCLK信号)。SysTick定时器能产生中断,异常中断。(内容摘自《Cortex-M3权威指南》)

      systick有四个寄存器:

      SysTick->CTRL 控制及状态寄存器 

      SysTick->LOAD   重装载寄存器

      SysTick->VAL   当前值寄存器

      SysTick->CALIB   校准值寄存器


二、delay函数

(偷学了网上的一点程序)

1、delay初始化

void delay_init()
{
	static u8  fac_us=0;		 //us延时倍乘数					
        static u16 fac_ms=0;	  //ms延时倍乘数					
	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);	 //选择外部时钟 HCLK/8
	fac_us=SystemCoreClock/8000000;		//为系统时钟的1/8		
	fac_ms=(u16)fac_us*1000;				
}	

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8) 时钟选择HCLK的8分频,外部晶振为8M,然后倍频72M,那么SysTick的时钟为9Mhz.,计数器减1代表时间过了1/9us(systick是倒计数定时器)。所以fac_us=系统时钟(72M)/8M,延时1us需要9个SysTick计数。

2、delay_us函数

void delay_us(u32 nus)
{		
	u32 temp;	    	 
	SysTick->LOAD=nus*fac_us; 	//时间加载			
	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是24位,所以nus<=(2^24)/fac_us

temp&0x01  用来判断定时器是否还处于开启状态,防止意外关闭导致的死循环。

3、delay_ms函数

void delay_ms(u16 nms)
{	 		  	  
	u32 temp;		   
	SysTick->LOAD=(u32)nms*fac_ms;			//nms<=1864	
	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;       				    
} 
同上nms<=0xffffff*8*1000/72000000=1864  (系统时钟72M)



      

你可能感兴趣的:(stm32学习笔记之用systick写delay)