1. 程式人生 > >STM32基於systick的延時函式(V3.5庫函式)

STM32基於systick的延時函式(V3.5庫函式)

/**

  • 滴答定時器systick延時函式
    */
    #define D13_ON GPIO_ResetBits(GPIOC,GPIO_Pin_13)
    #define D13_OFF GPIO_SetBits(GPIOC,GPIO_Pin_13)

__IO u32 delay_t;//定義一個全域性變數

//延時函式初始化
void delay_init(void)
{
//系統時鐘72M,此處時間為72M/1000000=72,用72*(1/72M)=1us
SysTick_Config(SystemCoreClock/1000000);//SystemCoreClock=72M
}
//延時ns秒函式
void delay_s(u32 ns)
{
delay_t=ns*1000000;
while(delay_t);
}
//延時nms豪秒函式
void delay_ms(u32 nms)
{
delay_t=nms*1000;
while(delay_t);
}
//延時nus微秒函式
void delay_us(u32 nus)
{
delay_t=nus;
while(delay_t);
}

//初始化GPIO
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA,ENABLE);
//PC13燈
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_ResetBits(GPIOC,GPIO_Pin_13); //關閉LED
}

int main(void)
{
GPIO_Config();
delay_init();
while(1){
delay_s(1);
D13_OFF;
delay_s(1);
D13_ON;
}
}
/****************************************END OF FILE*****************/

//中斷函式,要在中斷檔案裡面填寫,因為已經有函式體在裡面了
extern __IO u32 delay_t;//申明一個全域性變數
void SysTick_Handler(void)
{
if(delay_t)delay_t–;
}

—————————–結束————————————————-
雜項:/*
SysTick_Config(uint32_t ticks),在core_cm3.h
主要的作用:
1、初始化systick
2、開啟systick
3、開啟systick的中斷並設定優先順序
4、返回一個0代表成功或1代表失敗
注意:
Uint32_t ticks 即為重灌值,
這個函式預設使用的時鐘源是AHB,即不分頻。
要想分頻,呼叫void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource),
但是要注意函式呼叫的次序,先SysTick_Config(uint32_t ticks),
後SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)

*/
//需要的時間乘以9M(72M8分頻),此處即1ms*9M=9000,
//每1ms一次中斷,即9000個時鐘週期一次中斷,
SysTick_Config(9000);
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);