1. 程式人生 > >STM32 延時函式解析

STM32 延時函式解析

一、函式原型

STM32官方提供的函式庫中,可以找到類似於 HAL_Delay() 這樣的函式。這個函式的就是通過使用定時器,達到一個較為精確的時間延遲,提供給使用者呼叫。

這個函式一般包含在類似於 stm32f4xx_hal.c 這樣的函式中。函式原型如下:

__weak void HAL_Delay(__IO uint32_t Delay)
{
  uint32_t tickstart = 0U;
  tickstart = HAL_GetTick();
  while((HAL_GetTick() - tickstart) < Delay)
  {
  }
}

輸入引數為需要延時的時間,單位為毫秒(ms)。其中呼叫的 HAL_GetTick()

函式為獲取計數值 uwTick,該計數值在中段服務函式中進行加一操作。

__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}

在中斷服務函式如下:

void SysTick_Handler(void)
{
  uwTick++;
}

該中斷服務函式為系統定時器SysTick的中斷響應。而該定時器的初始化函式 HAL_InitTick() 是在 stm32f4xx_hal.c檔案裡定義,並在 HAL_Init() 函式中被呼叫。

檢視其初始化函式 HAl_InitTick() ,內容如下:

__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
  /*Configure the SysTick to have interrupt in 1ms time basis*/
HAL_SYSTICK_Config(SystemCoreClock/1000U); /*Configure the SysTick IRQ priority */ HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority ,0U); /* Return function status */ return HAL_OK; }

這個函式首先是為該定時器設定中斷產生的週期,例如當前情況下為1ms,也就是沒一毫秒都要產生一次中斷。其次是為該定時器設定中斷優先順序。

二、函式說明

使用者在使用延時時,直接呼叫函式 HAl_Delay(time),填入需要延時的時長,單位為毫秒,例如填入5000,則代表延遲5秒,這段時間MCU會產生5000次中斷,進5000次中斷服務函式對計數值進行加一操作。

延時函式的核心語句為 while迴圈,如下:

 while((HAL_GetTick() - tickstart) < Delay)
  {
  }

這個函式在條件滿足時會一直迴圈,但是由於迴圈體為空,所以實際上迴圈是不產生任何操作的,直到迴圈不滿足,也就是計數值在不斷加一操作後的值減去開始延遲時值已經大於延時值時。此時條件不滿足,迴圈結束,程式繼續向下執行。

關於上面這個while迴圈,還可以用採用for迴圈寫的版本,如下:

for(  ;(HAL_GetTick() - tickstart) < Delay;  );

即僅使用for迴圈的一個條件,這段程式碼等同於如下程式碼:

for(;;)
 {
    if((HAL_GetTick() - tickstart) > Delay)     
        break;
 }

三、更多說明

  • 1、關於 SysTick 定時器,資料手冊的說明如下:
    這裡寫圖片描述
  • 2、關於forwhile迴圈的效率說明,可以看這篇文章

相關推薦

STM32 函式解析

一、函式原型 STM32官方提供的函式庫中,可以找到類似於 HAL_Delay() 這樣的函式。這個函式的就是通過使用定時器,達到一個較為精確的時間延遲,提供給使用者呼叫。 這個函式一般包含在類似於 stm32f4xx_hal.c 這樣的函式中。函式原型如下

STM32 函式高階用法分析

一、使用場景 第一種情況,在使用普通 STM32 延遲函式,類似於 HAL_Delay(time),由於該函式是使用迴圈去判斷及延時的,所以在執行該函式時整個程式會在此處等待定時器的中斷服務函式修改參量使得迴圈判決條件不成立,從而繼續程式的執行,同時也達到延遲

STM32函式的四種方法

微控制器程式設計過程中經常用到延時函式,最常用的莫過於微秒級延時delay_us()和毫秒級delay_ms()。本文基於STM32F207介紹4種不同方式實現的延時函式。 1、普通延時 這種延時方式應該是大家在51微控制器時候,接觸最早的延時函式。這個比較簡單,讓微控制器做一些無關緊要的工作來打發時間,經常

STM32使用systick定時器定義硬體精準函式

前言 博文基於STM32F103ZET6和標準韌體庫V3.5.0在MDK5環境下開發; 本博文討論的是晶片不執行作業系統的情況下完成1s的延時功能; 如有不足之處還請多多指教; SysTick—系統滴答定時器是什麼? 是一個24位的硬體倒計數定時器; Sys

STM32的SysTick定時器與Delay函式

1.BB一下 原子哥的Delay延時函式,在沒有使用OS的情況下,沒有使用SysTick中斷,而筆者希望通過該中斷記錄系統時間 不使用OS,使用SysTick中斷 不使用OS,不使用SysTick

STM32中通過普通函式來精確

在STM32中處處會用到延時函式,一般而言,對於普通的控制延時,並不會要求特別精確,所以可以使用普通的延時函式,例如 void delay(u32 time) { while(time--);

STM32】SysTick滴答定時器(delay函式講解)

STM32F1xx官方資料:《Cortex-M3權威指南-中文》-第8章最後一個小節:Systick定時器SysTick定時器Systick定時器,是一個簡單的定時器,對於CM3、CM4核心晶片,都有Systick定時器。Systick定時器常用來做延時,或者實時系統的心跳時

stm32 使用正點原子delay函式,主函式失效

最近在做一個東西時,發現一個現象。之前一直沒有發現過,或者發現也沒有仔細研究過,在此為大家分享。 在使用原子哥的延時函式時,發現主函式裡面的延時函式失效了。沒有起任何作用。下面簡單分析一個整個過程。 先直接上程式碼,很簡單的一個例項 int main(void) {

STM32 SysTick定時器做函式

在STM32中延時函式用的非常廣泛,具體延時函式怎麼使用,下面我們來進行想詳解,本文主要介紹採用SysTick計時器來實驗系統延時: 原理介紹:                  SysTick計時器是一個24位的倒計數定時器,主要用來做作業系統的定時器,每來一個時鐘週期

STM32函式,配合系統滴答定時

#include "delay_cfg.h" /////////////////////////////////////////////////////////////////////////////// //////函    數: void Delay_us(UINT32_

STM32 自定義函式

在stm32除錯過程中加入一個延時,有兩種方式:一種是純計數方式,另一種是使用系統計數器的方式。 現使用系統計數器產生中斷的方式實現,查閱STM32的程式設計手冊可知,STM32有一個24bit的系統計時器,並有STK_CTRL、STK_LOAD、STK_VAL、STK_C

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

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

利用STM32的SysTick設計精確函式

在專案中使用I2C介面感測器時要求有比較精確的延時,在網上搜了下,如果不想用中斷SysTick定時器可以做到,找到如下資料: 主要仿照原子的《STM32不完全手冊》。SYSTICK 的時鐘固定為HCLK 時鐘的1/8,在這裡我們選用內部時鐘源72M,所以SYSTICK的時

stm32中的函式

//粗延時函式,微秒 void delay_nus(u16 time) {        u16 i=0;      while(time--)    {       i=10;  //自己定義    

STM32滴答定時器與UCOS時鐘系統,以及心跳和函式的實現.

   Systick就是一個定時器而已,只是它放在了NVIC中,主要的目的是為了給作業系統提供一個硬體上的中斷(號稱滴答中斷)。滴答中斷?這裡來簡單地解釋一下。作業系統進行運轉的時候,也會有“心跳”。它會根據“心跳”的節拍來工作,把整個時間段分成很多小小的時間片,每個任務每次

STM32 F4 (8) Systick滴答定時器-函式講解 QQ群 860099671

 SysTick定時器適用所有的STM32開發板,這節課講解SysTick定時器產生的 延時函式,STM32開發指南5.1小節有有關SysTick相關的 介紹,在程式中在delay資料夾中,SysTick定時器是核心級別的,這個定時器很簡單,主要用來延時和用作實時系統裡面的心

unity函式

新建一個工具類 public class DelayToInvoke : MonoBehaviour{ public static IEnumerator DelayToInvokeDo(Action action, float delaySeconds){yield return new Wai

linux核心 訊號量與自旋鎖、函式比較

       在驅動程式中,當多個執行緒同時訪問相同的資源時(驅動程式中的全域性變數是一種典型的共享資源),可能會引發"競態",因此我們必須對共享資源進行併發控制。Linux核心中解決併發控制的最常用方法是自旋鎖與訊號量(絕大多數時候作為互斥鎖使用)。   自

Systick滴答定時器-函式

1、參考資料       《STM32F1開發指南-庫函式版本》-5.1小節 delay資料夾介紹           《Cortex-M3權威指南-中文》-第8章最後一個小節:Systick定時器 2、Systick定時器     Systick定時器,是一個簡單的定時器

一個超簡單的 android 函式

因java初學,總是帶著一些VB的語法思路,想在一個 for迴圈裡面暫停個幾毫秒以實現指定的動畫效果,又不想用動畫函式(因為只是移動文字的位置),所以只好學著VB裡面一樣,弄一個延時函式來用用了: private void delay(int ms){ try {