0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

簡要說明

1概述

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

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

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

SysTick的最大使命,就是作為系統(tǒng)的時基定期地產(chǎn)生異常請求。

在不采用操作系統(tǒng)的情況下,完全可以作為通用定時器、計數(shù)器使用的。

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

SysTick 控制及狀態(tài)寄存器:

截圖20230109091048.png

SysTick 寄存器:

截圖20230109091048.png

SysTick 重裝載數(shù)值寄存器:地址 0XE000E014

截圖20230109091048.png

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

SYSTick當(dāng)前數(shù)值寄存器(VAL),地址:0XE000E018

截圖20230109091048.png

畢業(yè)寄語:

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

SYSTick校準(zhǔn)數(shù)值寄存器(VAL),地址:0XE000E018

截圖20230109091048.png

配置SysTick作為時鐘基準(zhǔn),主要通過對SysTick控制與狀態(tài)寄存器、SysTick重裝載數(shù)值寄存器和SysTick當(dāng)前數(shù)值寄存器三個寄存器進(jìn)行初始化。需要配置的內(nèi)容如下:

① SysTick時鐘源選擇。

② 異常請求設(shè)置。

③ SysTick時鐘使能。

④ 初始化SysTick重裝數(shù)值。

⑤ 清零SysTick當(dāng)前數(shù)值寄存器。

庫函數(shù)

SysTick的庫函數(shù)

1、SysTick寄存器結(jié)構(gòu)體類型

/** \\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時鐘源初始化函數(shù)

/**

  • @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函數(shù)被定義在misc.c文件中,配置的是SysTick控制與狀態(tài)寄存器中的位2。

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

設(shè)置為1:選擇使用HCLK作為時鐘源。

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

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

3、SysTick配置函數(shù)

__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函數(shù)被定義在core_cm3.h文件中,它的功能是初始化并開啟SysTick計數(shù)器及其中斷,輸入參數(shù)ticks是兩次中斷間的ticks數(shù)值。通過次函數(shù)可以初始化系統(tǒng)嘀嗒定時器及其中斷并開啟系統(tǒng)嘀嗒定時器在自由運行模式下以產(chǎn)生周期中斷。

SysTick異常服務(wù)函數(shù)

void SysTick_Handler(void)

SysTick_Handler的服務(wù)函數(shù)已在啟動文件中定義過,并定義了[WEAK]屬性,函數(shù)內(nèi)執(zhí)行的是空循環(huán)。

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

應(yīng)用小栗子

01應(yīng)用實例

使用SysTick產(chǎn)生1s的定時,控制LED燈以2s為周期進(jìn)行閃爍。

假設(shè)HCLK=180MHz。

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

1-配置SysTick

按照1ms進(jìn)行分片,配置程序如下:

SysTick_Config(SystemCoreClock/1000);

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

volatile   uint32_tTimingDelay;

volatile防止變量TimingDelay在使用過程中被優(yōu)化

2-寫延時函數(shù)

編寫以1ms為計時基準(zhǔn)的函數(shù):

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

其中,nTime是需要計時的ms數(shù)。

3-寫中斷服務(wù)函數(shù)

每1ms SysTick都會產(chǎn)生一次異常請求,執(zhí)行其異常服務(wù)程序SysTick_Handler。對SysTick異常服務(wù)程序進(jìn)行編寫,每1ms對變量TimingDelay減1次。

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

4-應(yīng)用

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

    關(guān)注

    31

    文章

    5253

    瀏覽量

    119206
  • STM32
    +關(guān)注

    關(guān)注

    2258

    文章

    10828

    瀏覽量

    352499
  • 定時器
    +關(guān)注

    關(guān)注

    23

    文章

    3218

    瀏覽量

    113688
  • Systick
    +關(guān)注

    關(guān)注

    0

    文章

    62

    瀏覽量

    13009
收藏 人收藏

    評論

    相關(guān)推薦

    systick嘀嗒時鐘設(shè)定為9MHz(HCLK/8的最大值)時產(chǎn)生1ms時間基準(zhǔn)應(yīng)該不對吧?

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

    嘀嗒定時器SysTick

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

    SysTick使用詳解

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

    Systick的信號來源

    STM32入門:Systick(系統(tǒng)嘀嗒定時器)學(xué)習(xí)、Systick 介紹Systick
    發(fā)表于 08-19 06:56

    詳解STM32時鐘系統(tǒng)與SysTick定時器

    STM32時鐘系統(tǒng)是什么意思?STM32時鐘系統(tǒng)有什么意義呢?SysTick定時器的工作原理是什么呢?如何去實現(xiàn)對
    發(fā)表于 11-22 07:37

    STM32嘀嗒定時器編程步驟

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

    CH579M的SysTick時鐘如何設(shè)置?

    當(dāng)系統(tǒng)嘀嗒時鐘設(shè)定為 32MHz,系統(tǒng)嘀嗒校準(zhǔn)值固定為 32000,將產(chǎn)生 1mS 時間基準(zhǔn)。(SysTick時鐘如何設(shè)置,沒有找到設(shè)置的函
    發(fā)表于 08-25 07:33

    什么是SysTick定時器?實現(xiàn)STM32時鐘系統(tǒng)的詳細(xì)資料說明

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

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

    STM32SysTick時鐘源來自哪里?
    的頭像 發(fā)表于 03-03 14:32 ?7660次閱讀

    STM32系統(tǒng)時鐘RCC詳解

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

    STM32—關(guān)于SYSTICK系統(tǒng)時鐘詳解及學(xué)習(xí)筆記

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

    STM32F103:精準(zhǔn)延時delay——SysTick使用

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

    17、STM32——SysTick詳解

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

    初學(xué)stm32-Systick滴答時鐘定時

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

    STM32SysTick時鐘源來自哪里?

    STM32SysTick時鐘源來自哪里?
    的頭像 發(fā)表于 10-26 15:58 ?1577次閱讀
    <b class='flag-5'>STM32</b>的<b class='flag-5'>SysTick</b><b class='flag-5'>時鐘</b>源來自哪里?