衡阳派盒市场营销有限公司

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

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

3天內不再提示

一文詳解SysTick寄存器和SysTick編程

安芯教育科技 ? 來源:靈動MM32 MCU ? 作者:Nuoeriris ? 2022-05-13 12:08 ? 次閱讀

OS能夠支持多任務,能夠以周期性地完成上下文的切換,以并行的架構處理任務,單一任務的崩潰并不會牽連到整個系統。上下文周期性切換需要一個定時器能夠打斷程序執行,SysTick定時器就可以提供必要的時鐘節拍,為OS的任務調度提供一個有節奏的“心跳”。

SysTick定時器即系統滴答定時器,也稱“心跳定時器”,它是一個24 位的倒計數定時器,計到0 時,將從重裝載寄存器中自動重裝載定時初值。只要不把它在SysTick 控制及狀態寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。

SysTick定時器被捆綁在NVIC中,用于產生SysTick異常(異常號:15),SysTick中斷的優先級也可以設置。

它會根據節拍來工作,把整個時間段分成很多小小的時間片,而每個任務每次只能運行一個時間片的時間長度,超時就退出給別的任務運行,這樣可以確保任何一個任務都不會霸占操作系統提供的各種定時功能,都與這個滴答定時器有關。

當啟用時,定時器從重載值遞減計數到零,在下一個時鐘周期將重裝載SYST\_RVR 中的值,然后在后續時鐘周期遞減。將零值寫入 SYST\_RVR 會在下一次回調時禁用計數器。當計數器變為零時,COUNTFLAG 狀態位設置為 1。讀取 SYST\_CSR 將 COUNTFLAG 位清除為 0。寫入 SYST\_CVR 將清除寄存器和 COUNTFLAG 狀態位為 0,寫入不會觸發 SysTick 異常邏輯,讀取該寄存器會在訪問時返回其值。

1. SysTick寄存器

SysTick定時器主要由4個寄存器組成:

46c01c4c-d1b2-11ec-bce3-dac502259ad0.png

在CMSIS中系統控制寄存器結構體:


	

typedefstruct {__IOuint32_tCTRL;/*!

Arm官方資料中4個寄存器的命名分別是SYST\_CSR、SYST\_RVR、SYST\_CVR和SYST\_CALIB,但是在CMSIS中進行了簡化命名,更加清晰明了。

1.1 SysTick控制和狀態寄存器(SYST\_CSR)

46edf02c-d1b2-11ec-bce3-dac502259ad0.png

CSR寄存器用到的位有4個,bit0用于是否開啟定時器,置1表示使能SysTick定時器;bit1用于控制是否產生中斷,該位置為1為允許產生中斷;bit2用于設置定時器的時鐘源,設為1,定時器的時鐘源為主時鐘,反之設為0的話定時器的時鐘源為主時鐘的四分之一。

MM32F0130系列的SysTick的HCLK來源于AHB總線經過硬件4分頻,FCLK直接來源于AHB時鐘總線。

4721a58e-d1b2-11ec-bce3-dac502259ad0.png

當 SysTick 定時器從1計到0時,它將把COUNTFLAG位置位;

而下述方法可以清零:

  • 讀取 SysTick 控制及狀態寄存器(STCSR)

  • 往 SysTick 當前值寄存器(STCVR)中寫任何數據

1.2 SysTick重裝載寄存器(SYST\_RVR)
473c3caa-d1b2-11ec-bce3-dac502259ad0.png ?RVR寄存器用到0~23位,這個值是定時器倒計時的初始值,打開定時器以后,就會從這里設置的值倒計時到0,倒計時到0以后,又會從此值開始倒計時。
1.3 SysTick當前值寄存器(SYST\_CVR)
4759d7ce-d1b2-11ec-bce3-dac502259ad0.png ?CVR寄存器也是用到0~23位,這是一個狀態寄存器,當定時器開始運作的時候,這個值在不斷的變化,從RVR寄存器獲取初值以后,倒計時到0。CURRENT:讀此寄存器返回系統定時器的當前值,給這個寄存器賦值,將使定時器歸0,且清CTRL中的COUNTFLAG位。
1.4 SysTick當前值寄存器(SYST\_CALIB)
47772126-d1b2-11ec-bce3-dac502259ad0.png ?如果不知道校準信息,則根據處理器時鐘或外部時鐘的頻率計算所需的校準值。校準值寄存器提供了這樣一個解決方案:它使系統即使在不同的CM0產品上運行,也能產生恒定的SysTick中斷頻率。最簡單的作法就是:直接把TENMS的值寫入重裝載寄存器,這樣一來,只要沒突破系統極限,就能做到每10ms來一次 SysTick異常。如果需要其它的SysTick異常周期,則可以根據TENMS的值加以比例計算。在系統定時器的四個寄存器中,SYST\_CALIB為校準寄存器,這個是在出廠之前就已經配置好了的,我們不必考慮這個寄存器。

2. SysTick編程

SysTick配置需要遵循一定的流程:
  1. 開始

  2. 禁止SysTick

  3. 設置重裝值寄存器

  4. 清除當前值寄存器

  5. 使能SysTick

  6. 完成

SysTick操作相關函數有:

	__STATIC_INLINEuint32_tSysTick_Config(uint32_tticks); voidSysTick_CLKSourceConfig(u32systick_clk_source); voidRCC_SystickDisable(void); voidRCC_SystickEnable(u32sys_tick_period); 下面的代碼演示啟用 SysTick 的基本程序:

	;使能SysTick定時器,并且使能SysTick異常 LDRR0,=0xE000E010;加載STCSR的地址 MOVR1,#0 STRR1,[R0];先停止SysTick,以防意外產生異常請求 LDR R1, =0x3FF ;讓SysTick每1024周期計完一次。因為是從1023數到 ;0,總共數了1024個周期,所以加載值為0x3FF STRR1,[R0,#4];寫入重裝載的值 STRR1,[R0,#8];往STCVR中寫任意的數,以確保清除COUNTFLAG標志 MOVR1,#0x7;選擇FCLK作為時鐘源,并使能SysTick及其異常請求 STRR1,[R0];寫入數值,開啟定時器 在CMSIS庫中有定義對應的配置函數:

	__STATIC_INLINEuint32_tSysTick_Config(uint32_tticks) { /*Reloadvalueimpossible*/ if((ticks-1UL)>SysTick_LOAD_RELOAD_Msk){ return(1UL); } /*setreloadregister*/ SysTick->LOAD=(uint32_t)(ticks-1UL); /*setPriorityforSystickInterrupt*/ NVIC_SetPriority(SysTick_IRQn,(1UL<VAL=0UL; /*EnableSysTickIRQandSysTickTimer*/ SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk| SysTick_CTRL_TICKINT_Msk| SysTick_CTRL_ENABLE_Msk; /*Functionsuccessful*/ return(0UL); } SysTick可以通過輪詢或者中斷方式進行操作,使用輪詢的程序可以讀取SysTick控制和狀態寄存器,檢查COUNTFLAG,如果該位置位,則表明SysTick計數已減到0。中斷方式延時參考程序:

	static__IOuint32_tTimingDelay; voidDelay(__IOuint32_tnTime) { TimingDelay=nTime; while(TimingDelay!=0); } voidSysTick_Handler(void) { if(TimingDelay!=0x00) { TimingDelay--; } } intmain(void) { //systick時鐘為HCLK,中斷時間間隔1ms if(SysTick_Config(SystemCoreClock/1000)) { while(1); } while(1) { Delay(200);//200ms } } 輪詢方式延時參考程序:

	voiddelay_init() { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div4);//選擇外部時鐘HCLK/4 //為系統時鐘的1/4,實際上也就是在計算1usSysTick的VAL減的數目 fac_us=SystemCoreClock/4000000; //代表每個ms需要的systick時鐘數,即每毫秒SysTick的VAL減的數目 fac_ms=(u16)fac_us*1000; } voiddelay_ms(u16nms) { u32temp; SysTick->LOAD=(u32)nms*fac_ms;//時間加載(SysTick->LOAD為24bit) SysTick->VAL=0x00;//清空計數器 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//開始倒數 do { temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16)));???//等待時間到達,看CTRL的第16位(COUNTFLAG)是否為1,看STRL的第0位(ENABLE)是否為1??? ?????SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//關閉計數器 SysTick->VAL=0X00;//清空計數器 } voiddelay_us(u32nus) { u32temp; SysTick->LOAD=nus*fac_us;//時間加載 SysTick->VAL=0x00;//清空計數器 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//開始倒數 do { temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16)));????????//等待時間到達??? ????SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//關閉計數器 SysTick->VAL=0X00;//清空計數器 } SysTick定時器除了能服務于操作系統之外,還能用于其它目的:如時間測量、定時或者鬧鈴等。

						

						

						
														


原文標題:技術分享 | Cortex-M0中斷控制和系統控制(五)

文章出處:【微信公眾號:安芯教育科技】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5363

    瀏覽量

    121162
  • 定時器
    +關注

    關注

    23

    文章

    3255

    瀏覽量

    115371
  • Systick
    +關注

    關注

    0

    文章

    62

    瀏覽量

    13149

原文標題:技術分享 | Cortex-M0中斷控制和系統控制(五)

文章出處:【微信號:Ithingedu,微信公眾號:安芯教育科技】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    SysTick使用詳解

    處理的微控制都可以由這個定時獲得定的時間間隔。2. SysTick相關寄存器狀態
    發表于 08-12 06:32

    SysTick的定義與相關寄存器詳解

    、概述:SysTick個簡單的遞減24位計數如果你不需要再應用程序中嵌入操作系統,SysTick可以作為簡單的延時和產生周期性的中斷
    發表于 01-05 07:26

    SysTick寄存器介紹

    設置系統時鐘SYSCLK 等于72M。當重裝載數值寄存器的值遞減到0 的時候,系統定時就產生次中斷,以此循環往復。SysTick 寄存器
    發表于 01-21 11:37

    如何使用STM32實現systick的精確延時

    SYSTICK寄存器初始化 void SysTick_Configuration(void) { if (SysTick_Config(SystemCoreClock
    發表于 11-21 15:54 ?5978次閱讀

    SysTick定時介紹,SysTick定時寄存器

    在 STM32F1 庫函數中,并沒有提供相應的 SysTick 定時配置函數,我們要操作 SysTick 定時就需要了解它的寄存器功能。
    的頭像 發表于 02-11 15:37 ?1.8w次閱讀
    <b class='flag-5'>SysTick</b>定時<b class='flag-5'>器</b>介紹,<b class='flag-5'>SysTick</b>定時<b class='flag-5'>器</b><b class='flag-5'>寄存器</b>

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

    處理的微控制都可以由這個定時獲得定的時間間隔。2. SysTick相關寄存器狀態
    發表于 12-02 18:36 ?10次下載
    STM32F103:精準延時delay——<b class='flag-5'>SysTick</b>使用

    Systick定時幾個簡單的函數簡介

    目錄Systick定時Systick定時是什么?SysTick的四個寄存器
    發表于 12-04 17:06 ?1次下載
    <b class='flag-5'>Systick</b>定時<b class='flag-5'>器</b>幾個簡單的函數簡介

    帶你模仿正點原子編程風格到深入學習寄存器并手把手編寫STM32F103寄存器程序(SYSTICK滴答時鐘之delay延時)

    帶你模仿正點原子到寄存器編寫–SYSTICK(delay函數)以下是本篇文章正文內容,下面案例可供參考鄧家-廣州華軟軟件學院、 前提了解系統時鐘
    發表于 12-08 18:21 ?0次下載
    帶你模仿正點原子<b class='flag-5'>編程</b>風格到深入學習<b class='flag-5'>寄存器</b>并手把手編寫STM32F103<b class='flag-5'>寄存器</b>程序(<b class='flag-5'>SYSTICK</b>滴答時鐘之delay延時)

    STM32_SysTick—系統定時

    SysTick 的簡介和寄存器的詳細描述。因為 SysTick 是屬于CM3 內核的外設,有關寄存器的定義和部分庫函數都在 core_CM3.h 這個頭文件中實現。所以學習
    發表于 12-23 19:56 ?2次下載
    STM32_<b class='flag-5'>SysTick</b>—系統定時<b class='flag-5'>器</b>

    STM32學習筆記(5)——系統定時SysTick

    單獨拿出來講的個內核外設(所以不要期望在STM32中參考手冊找到它!即使找到也只會叫你看cm3內核編程手冊),說明它真的很重要。STM32學習筆記(5)——系統定時
    發表于 12-23 19:56 ?4次下載
    STM32學習筆記(5)——系統定時<b class='flag-5'>器</b><b class='flag-5'>SysTick</b>

    [學習筆記]STM32F1 SYSTICK 滴答定時(寄存器、標準庫、HAL庫)

    SysTick的中斷函數:4. 程序設計(寄存器)5. 程序設計(標準庫)6. 程序設計(HAL庫)7. 實驗結果8. 源碼下載7.SYSTICK 滴答定時0. 博主理解:
    發表于 12-23 20:02 ?7次下載
    [學習筆記]STM32F1 <b class='flag-5'>SYSTICK</b> 滴答定時<b class='flag-5'>器</b>(<b class='flag-5'>寄存器</b>、標準庫、HAL庫)

    詳解STM32的嘀嗒時鐘(SysTick)

    計數值到0的時候,SysTick重裝載寄存器就會自動重新裝載初值。只要SysTick控制和狀態寄存器(CTRL)中的使能位沒有ENABLE清除掉,那么就會永遠的執行下去。
    的頭像 發表于 01-19 18:11 ?1.4w次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>詳解</b>STM32的嘀嗒時鐘(<b class='flag-5'>SysTick</b>)

    SysTick時鐘

    Cortex-M3內核的處理,內部包含了SysTick定時,SysTick個24位的
    的頭像 發表于 03-01 17:40 ?887次閱讀
    <b class='flag-5'>SysTick</b>時鐘

    STM32 SysTick配置函數

    之前使用SysTick滴答定時都是通過查找內核編程手冊配置寄存器SysTick滴答定時工作
    的頭像 發表于 07-22 10:21 ?1729次閱讀
    STM32 <b class='flag-5'>SysTick</b>配置函數

    個人對STM32 SysTick的總結(寄存器操作)

    、概述:SysTick個簡單的遞減24位計數。如果你不需要再應用程序中嵌入操作系統,SysTick可以作為簡單的延時和產生周期性的中
    的頭像 發表于 01-06 08:00 ?2069次閱讀
    個人對STM32 <b class='flag-5'>SysTick</b>的總結(<b class='flag-5'>寄存器</b>操作)
    赌百家乐庄闲能赢| 百家乐官网赌的技巧| 百家乐赌场信息| 至尊百家乐官网2014| 大发888 yule| 百家乐赌博大赢家| 宝马会百家乐官网的玩法技巧和规则| 大发888游戏平台df888| 立博百家乐游戏| 百家乐官网稳赢投注方法| 大发888官方 截图| 百家乐博娱乐网| 百家乐官网冼牌机| 关于百家乐切入点| 蕉岭县| 易胜博百家乐娱乐城| 百家乐官网单注技巧| 万龙百家乐的玩法技巧和规则| 百家乐官网趋势图怎么看| 好运来百家乐的玩法技巧和规则| 百家乐官网是多少个庄闲| 易发国际| 沈阳娱网棋牌官方下载| 新时代百家乐的玩法技巧和规则| 澳门百家乐技巧| 永利高百家乐信誉| 博彩百家乐官网龙虎| 太阳城娱乐城官方网| 百家乐路单走势图| 百家乐赌博玩法技巧| 百家乐官网英皇娱乐场开户注册| 百家乐官网平台网| 百家乐官网园会员注册| 贺兰县| 在线真人娱乐城| 利博| 大发扑克官网| 澳门赌场攻略| 唐人博彩| 星河国际娱乐场| 赤峰市|