static u8 fac_us = 0;//us與系統滴答的被乘數 static unsigned short fac_ms = 0;//ms與系統滴答的被乘數 static unsigned int m_sys_seconds = 0;//系統運行秒數 /** * @description:系統滴答計時系統初始化 * @param 無 * @retval 無 */ void SysTick_Init(void) { //配置系統滴答時鍾源 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //選擇外部時鍾 HCLK/8 //設置預裝載值 SysTick->LOAD = 0x895440;//時間加載 //計算ms & us轉換因數 fac_us = SystemCoreClock/8000000; //為系統時鍾的1/8 fac_ms = (unsigned short)fac_us*1000; //代表每個ms需要的systick時鍾數 //開啟中斷,使能計時 SysTick->CTRL |= (SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk) ; //開始倒數 } /*------------------------------------------------------------------------------------------------- *@description: 返回當前系統運行的秒數.(溢出不計) --------------------------------------------------------------------------------------------------*/ unsigned long sys_seconds(void) { return m_sys_seconds; } /*------------------------------------------------------------------------------------------------- *@description: 返回當前系統運行的時間,Unit ms.(溢出不計) --------------------------------------------------------------------------------------------------*/ unsigned long long sys_millis(void) { unsigned long long millisecond = (0x895440-SysTick->VAL)/fac_ms + m_sys_seconds*1000; //當前系統運行時間ms return millisecond; } /*------------------------------------------------------------------------------------------------- *@description: 返回當前系統運行的時間,Unit us.(溢出不計) --------------------------------------------------------------------------------------------------*/ unsigned long long sys_micros(void) { unsigned long long microseconds = (0x895440-SysTick->VAL)/fac_us + m_sys_seconds*1000000; return microseconds; } // couter 減1的時間 等於 1/systick_clk // 當counter 從 reload 的值減小到0的時候,為一個循環,如果開啟了中斷則執行中斷服務程序, // 同時 CTRL 的 countflag 位會置1 // 這一個循環的時間為 reload * (1/systick_clk) void SysTick_Delay_Us( unsigned short ns_num) { unsigned long long current_us = sys_micros(); if((current_us + ns_num) <= 0x3e7fffb7bbf)//不存在溢出 { current_us += ns_num; do { ; }while(sys_micros() < current_us); } else//存在溢出 { current_us = (current_us + ns_num) - 0x3e7fffb7bbf; do { ; }while(sys_micros() <= 0x3e7fffb7bbf); do { }while(sys_micros() < current_us); } } void SysTick_Delay_Ms( unsigned short ms_num) { unsigned long long current_ms = sys_millis(); if((current_ms + ms_num) <= 0xfffffed7)//不存在溢出 { current_ms += ms_num; do { ; }while(sys_millis() < current_ms); } else//存在溢出 { current_ms = (current_ms + ms_num) - 0xfffffed7; do { ; }while(sys_millis() <= 0xffffed7); do { ; }while(sys_millis() < current_ms); } } /** * @brief This function handles SysTick Handler. * @param None * @retval None */ void SysTick_Handler(void) { m_sys_seconds++; }