1. 程式人生 > 其它 >【STM32F系列庫函式】SysTick延時—delay

【STM32F系列庫函式】SysTick延時—delay

技術標籤:STM32STM32延時函式SysTick滴答定時器delay

delay.h

/* --------------------------------------------------------- */
// 檔名稱:delay.h       
// 功能描述: SysTick延時函式標頭檔案   
 
/* --------------------------------------------------------- */

#ifndef _DELAY_H_
#define _DELAY_H_

#ifdef __cplusplus
extern "c"{
#endif
	
	
#include "stm32f0xx.h"        
void delay_init(void);        //Systick定時器延時初始化
void delay_us(int32_t nus);    //延時n個us
void delay_ms(int16_t nms);    //延時n個ms
	
	
#ifdef __cplusplus 
}
#endif

#endif

delay.c

/* --------------------------------------------------------- */
// 檔名稱:delay.c        
// 功能描述: SysTick延時函式原始檔

/* --------------------------------------------------------- */

#include "delay.h"


static int8_t  fac_us=0;    //us
static int16_t fac_ms=0;    //ms


void delay_init()	 
{
	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//選擇外部時鐘  HCLK/8
 
	fac_us=72000000/8000000;						    //為系統時鐘的1/8  /* fac_us=SystemCoreClock/8000000;	*/
	fac_ms=(int16_t)fac_us*1000;						//每個ms需要的systick時鐘數   
}	
//延時Nus
void delay_us(int32_t nus)
{		
	int32_t 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;       							//清空計數器	 
}

//延時Nms
void delay_ms(int16_t nms)
{	 		  	  
	int32_t temp;		   
	SysTick->LOAD=(int32_t)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;       							//清空計數器	  	    
}