STM32 系統滴答計時器


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++;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM