STM32系統滴答定時器學習?

深入研究STM32F103VET6 系統滴答定時器延時程式

/*********************************************************************************** STM32F103VET6 系統滴答定時器驅動程式**************************************************************************************/#ifndef _SYSTICK_H#define _SYSTICK_H

#include "SysTick.h"

#define SYSTICK_CSR (*((volatile unsigned long *) 0xE000E010)) //控制暫存器#define SYSTICK_LOAD (*((volatile unsigned long *) 0xE000E014)) //過載暫存器#define SYSTICK_VAL (*((volatile unsigned long *) 0xE000E018)) //當前值暫存器#define SYSTICK_CALRB (*((volatile unsigned long *) 0xE000E01C)) //校準值暫存器

unsigned long SYSTICK_Delay; //定義延時變數

/* * SysTick配置暫存器子函式 */void SYSTICK_InitStructReadTCmd(void){ if(SysTick_Config(SystemCoreClock / 1000000)) //72000000 / 1000000 = 1us { while(1); //迴圈 } SYSTICK_CSR = 0X06; //關閉使能計數器需要時在開啟}

/* * SysTick中斷服務程式 */void SysTick_Handler(void) { SYSTICK_VAL = 0; //當前值暫存器清零 if(SYSTICK_Delay != 0x00) //判斷延時變數是否等於0 { SYSTICK_Delay--; //延時變數減減 } }

/* * 軟體延時子函式 */void Delay_1us(unsigned long CountLing) //帶引數的延時子函式{ SYSTICK_CSR = 0X07; //開啟使能計數器 SYSTICK_Delay = CountLing; //延時變數賦值 while(SYSTICK_Delay != 0); //等到延時變數等於0跳出迴圈 SYSTICK_CSR = 0X06; //關閉使能計數器}

#endif

/****************************************END*********************************************/

相關問題答案