【STM32F系列庫函式】SysTick延時—delay
阿新 • • 發佈:2021-02-06
技術標籤: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; //清空計數器 }