吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一文詳解STM32的嘀嗒時鐘(SysTick)

CHANBAEK ? 來源:南山府嵌入式 ? 作者:南山府嵌入式 ? 2023-01-19 18:11 ? 次閱讀

簡要說明

1概述

嘀嗒時鐘(SysTick)是一個簡單的系統時鐘節拍計數器,它屬于Cortex-M4內核嵌套向量中斷控制器(NVIC)里的一個功能單元。他是一個24位的倒計時定時器(在NVIC中),當systick計數值到0的時候,SysTick重裝載寄存器就會自動重新裝載初值。只要SysTick控制和狀態寄存器(CTRL)中的使能位沒有ENABLE清除掉,那么就會永遠的執行下去。

SysTick定時器被捆綁在NVIC中,可產生SysTick異常(異常號:15),屬于Cortex-M4內核里的一個功能單元。

SysTick常作為系統節拍定時器用于操作系統(如mCOS-Ⅱ、FreeRTOS等)的系統節拍定時,從而推動任務和時間的管理。

SysTick的最大使命,就是作為系統的時基定期地產生異常請求。

在不采用操作系統的情況下,完全可以作為通用定時器、計數器使用的。

下圖是SysTick控制控制和狀態寄存器描述,(地址:0xe000e010)

SysTick 控制及狀態寄存器:

截圖20230109091048.png

SysTick 寄存器:

截圖20230109091048.png

SysTick 重裝載數值寄存器:地址 0XE000E014

截圖20230109091048.png

特別注意:計數最大值是)0XFFFFFF,在設置重裝在值得時候不能大于這個。

SYSTick當前數值寄存器(VAL),地址:0XE000E018

截圖20230109091048.png

畢業寄語:

畢業,是一首離別的歌,更是青年成長的里程碑。四年的時光一千多日夜就這樣瞬息即過,但它卻是你們的瑰麗人生中最濃麗的一抹色彩!如一條條的小溪匯成了一條多彩的河流。你們成了校園里最靚麗的一道風景。

SYSTick校準數值寄存器(VAL),地址:0XE000E018

截圖20230109091048.png

配置SysTick作為時鐘基準,主要通過對SysTick控制與狀態寄存器、SysTick重裝載數值寄存器和SysTick當前數值寄存器三個寄存器進行初始化。需要配置的內容如下:

① SysTick時鐘源選擇。

② 異常請求設置。

③ SysTick時鐘使能。

④ 初始化SysTick重裝數值。

⑤ 清零SysTick當前數值寄存器。

庫函數

SysTick的庫函數

1、SysTick寄存器結構體類型

/** \\brief Structure type to access the System Timer (SysTick).

*/

typedef struct
{
  __IO uint32_t CTRL;                    /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */
  __IO uint32_t LOAD;                    /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register       */
  __IO uint32_t VAL;                     /*!< Offset: 0x008 (R/W)  SysTick Current Value Register      */
  __I  uint32_t CALIB;                   /*!< Offset: 0x00C (R/ )  SysTick Calibration Register        */
} SysTick_Type;

2、SysTick時鐘源初始化函數

/**

  • @brief Configures the SysTick clock source.
  • @param SysTick_CLKSource: specifies the SysTick clock source.
  • This parameter can be one of the following values:
  • @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source.
    
  • @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source.
    
  • @retval None

*/

void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
  /* Check the parameters */
  assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
  if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
  {
    SysTick->CTRL |= SysTick_CLKSource_HCLK;
  }
  else
  {
    SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
  }
}

SysTick_CLKSourceConfig函數被定義在misc.c文件中,配置的是SysTick控制與狀態寄存器中的位2。

設置為0:選擇使用HCLK/8作為時鐘源。

設置為1:選擇使用HCLK作為時鐘源。

在實際使用的過程中參數宏在misc.h文件里面。

#define SysTick_CLKSource_HCLK_Div8((uint32_t)0xFFFFFFFB)
#define SysTick_CLKSource_HCLK  ((uint32_t)0x00000004)

3、SysTick配置函數

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);      /* Reload value impossible */




  SysTick->LOAD  = ticks - 1;                                  /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */
  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* Function successful */
}

SysTick_Config函數被定義在core_cm3.h文件中,它的功能是初始化并開啟SysTick計數器及其中斷,輸入參數ticks是兩次中斷間的ticks數值。通過次函數可以初始化系統嘀嗒定時器及其中斷并開啟系統嘀嗒定時器在自由運行模式下以產生周期中斷。

SysTick異常服務函數

void SysTick_Handler(void)

SysTick_Handler的服務函數已在啟動文件中定義過,并定義了[WEAK]屬性,函數內執行的是空循環。

這就要求用戶在使用SysTick異常服務時,需要在啟動文件之外的其他文件重新定義服務程序,并且其函數名要和啟動文件中的函數名保持一致,只有這樣才能在編譯階段,將重定義的服務程序函數入口地址替換到SysTick在異常/中斷向量表的位置。

應用小栗子

01應用實例

使用SysTick產生1s的定時,控制LED燈以2s為周期進行閃爍。

假設HCLK=180MHz。

在system_stm32f4xx.c文件中定義了全局變量uint32_t SystemCoreClock=180000000,并在頭文件system_stm32f4xx.c->stm32f4xx.h中聲明。

1-配置SysTick

按照1ms進行分片,配置程序如下:

SysTick_Config(SystemCoreClock/1000);

這樣,SysTick會每1ms產生一次異常請求。全局變量定義:

volatile   uint32_tTimingDelay;

volatile防止變量TimingDelay在使用過程中被優化

2-寫延時函數

編寫以1ms為計時基準的函數:

void delay_ms(uint32_t nTime)
{ 
TimingDelay=nTime;
while(TimingDelay!=0);
}

其中,nTime是需要計時的ms數。

3-寫中斷服務函數

每1ms SysTick都會產生一次異常請求,執行其異常服務程序SysTick_Handler。對SysTick異常服務程序進行編寫,每1ms對變量TimingDelay減1次。

void SysTick_Handler(void)
{
  if (TimingDelay!=0)
{ 
TimingDelay--;
}
}

4-應用

int main(void)
{
/*配置SysTick為每1ms異常一次*/
if (SysTick_Config(SystemCoreClock/1000))
{ 
/*SystemCoreClock/1000超出計數最大值時報錯,程序陷入空循環*/ 
while (1);
}
/*初始化LED燈的GPIO*/
LED_Config ();
while (1)
{
/*反轉LED燈狀態*/
LED_TOGGLE;
/*延時1s*/
delay_ms (1000);
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5363

    瀏覽量

    121193
  • STM32
    +關注

    關注

    2272

    文章

    10924

    瀏覽量

    357592
  • 定時器
    +關注

    關注

    23

    文章

    3255

    瀏覽量

    115380
  • Systick
    +關注

    關注

    0

    文章

    62

    瀏覽量

    13150
收藏 人收藏

    評論

    相關推薦

    systick嘀嗒時鐘設定為9MHz(HCLK/8的最大值)時產生1ms時間基準應該不對吧?

    ; 產生1us? fac_ms=(u16)fac_us*1000;}在stm32參考手冊是這樣描述的,系統嘀嗒校準值固定為9000,當系統嘀嗒時鐘設定為9MHz(HCLK/8的最大值)
    發表于 09-02 20:28

    嘀嗒定時器SysTick

    第22章 STM32F407的SysTick實現多組軟件定時器本章節為大家講解嘀嗒定時器SysTick嘀嗒定時器比較容易掌握,其實大家只要
    發表于 08-10 07:59

    SysTick使用詳解

    處理器的微控制器都可以由這個定時器獲得定的時間間隔。2. SysTick相關寄存器狀態寄存器-CTRLSTCLK外部時鐘源:AHB總線時鐘的 1/8FCLK 內部
    發表于 08-12 06:32

    Systick的信號來源

    STM32入門:Systick(系統嘀嗒定時器)學習Systick 介紹Systick
    發表于 08-19 06:56

    詳解STM32時鐘系統與SysTick定時器

    STM32時鐘系統是什么意思?STM32時鐘系統有什么意義呢?SysTick定時器的工作原理是什么呢?如何去實現對
    發表于 11-22 07:37

    STM32嘀嗒定時器編程步驟

    STM32嘀嗒定時器編程步驟(個人學習總結)基本知識SysTick 屬于CM3,CM4內核芯片內部資源。個24位的倒計數定時器,計到0時,將從RELOAD寄存器中自動重裝載定時初值,
    發表于 01-10 08:05

    CH579M的SysTick時鐘如何設置?

    當系統嘀嗒時鐘設定為 32MHz,系統嘀嗒校準值固定為 32000,將產生 1mS 時間基準。(SysTick時鐘如何設置,沒有找到設置的函
    發表于 08-25 07:33

    什么是SysTick定時器?實現STM32時鐘系統的詳細資料說明

    什么是SysTick定時器?實現STM32時鐘系統的詳細資料說明主要內容包括了:Systick原理和配置方法,ALIENTEK 延時函數delay講解
    發表于 01-02 08:00 ?3次下載
    什么是<b class='flag-5'>SysTick</b>定時器?實現<b class='flag-5'>STM32</b><b class='flag-5'>時鐘</b>系統的詳細資料說明

    STM32中的SysTick時鐘源來自哪里?

    STM32SysTick時鐘源來自哪里?
    的頭像 發表于 03-03 14:32 ?7940次閱讀

    STM32系統時鐘RCC詳解

    STM32】系統時鐘RCC詳解(超詳細,超全面) 原創
    發表于 11-30 12:21 ?14次下載
    <b class='flag-5'>STM32</b>系統<b class='flag-5'>時鐘</b>RCC<b class='flag-5'>詳解</b>

    STM32—關于SYSTICK系統時鐘詳解及學習筆記

    SysTick_Handler中也無需對中斷標志進行清零(參考exit外部中斷服務函數)2.要注意的是關于systick其實有兩個關鍵函數,SySTick_Config,SysTick
    發表于 11-30 15:51 ?15次下載
    <b class='flag-5'>STM32</b>—關于<b class='flag-5'>SYSTICK</b>系統<b class='flag-5'>時鐘</b>的<b class='flag-5'>詳解</b>及學習筆記

    STM32F103:精準延時delay——SysTick使用

    處理器的微控制器都可以由這個定時器獲得定的時間間隔。2. SysTick相關寄存器狀態寄存器-CTRLSTCLK外部時鐘源:AHB總線時鐘的 1/8FCLK 內部
    發表于 12-02 18:36 ?10次下載
    <b class='flag-5'>STM32</b>F103:精準延時delay——<b class='flag-5'>SysTick</b>使用

    17、STM32——SysTick詳解

    。不過,STCLK 的具體來源則由芯片設計者決定,因此不同產品之間的時鐘頻率可能會大不相同,你需要查找芯片的器件手冊來決定選擇什么作為時鐘源。Cortex-M3 的內核中包含SysTic
    發表于 12-23 19:56 ?0次下載
    17、<b class='flag-5'>STM32</b>——<b class='flag-5'>SysTick</b><b class='flag-5'>詳解</b>

    初學stm32-Systick滴答時鐘定時

    系統的心跳時鐘。這樣可以節省MCU資源,不用浪費個定時器。比如uCOS中,分時復用,需要個最小的時間戳,般在STM32+UCOS系統中
    發表于 12-31 19:46 ?15次下載
    初學<b class='flag-5'>stm32-Systick</b>滴答<b class='flag-5'>時鐘</b>定時

    STM32SysTick時鐘源來自哪里?

    STM32SysTick時鐘源來自哪里?
    的頭像 發表于 10-26 15:58 ?2129次閱讀
    <b class='flag-5'>STM32</b>的<b class='flag-5'>SysTick</b><b class='flag-5'>時鐘</b>源來自哪里?
    百家乐官网筹码多少钱| 新澳门百家乐官网娱乐城| 百家乐娱乐城网址| 大发888在线投注| 真人百家乐官网蓝盾娱乐网| 最好百家乐的玩法技巧和规则 | 澳门百家乐官网网上娱乐场开户注册 | 百家乐官网游戏唯一官网站| 金博士百家乐的玩法技巧和规则| 一二博网址| 24山什么来龙是真龙| 威尼斯人娱乐棋牌平台| 百家乐官网德州扑克轮盘| 什么叫百家乐的玩法技巧和规则 | 大发888无数| 博彩网百家乐官网全讯网| 德州扑克 在线| 属羊的和属猪的做生意| bet365在线体育投注| 做生意风水摆件| 博彩论坛网| 百家乐视频赌博| 百家乐官网最新投注法| 至尊百家乐20111110| 峨眉山市| 百家乐入庄闲概率| 百家乐官网投注杀手| 赌球| 百家乐官网下注法| 凤山县| 百家乐百博| 百家乐官网布| 大发888娱乐吧| 百家乐园千术大全| 澳门百家乐官网赢技巧| 太阳城橙翠园| 百家乐大赢家书籍| 百家乐官网真钱路怎么看| 大发888手机下载| 百家乐赔率技巧| 百家乐官网做中介赚钱|