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

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

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

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

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

OS能夠支持多任務(wù),能夠以周期性地完成上下文的切換,以并行的架構(gòu)處理任務(wù),單一任務(wù)的崩潰并不會(huì)牽連到整個(gè)系統(tǒng)。上下文周期性切換需要一個(gè)定時(shí)器能夠打斷程序執(zhí)行,SysTick定時(shí)器就可以提供必要的時(shí)鐘節(jié)拍,為OS的任務(wù)調(diào)度提供一個(gè)有節(jié)奏的“心跳”。

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

SysTick定時(shí)器被捆綁在NVIC中,用于產(chǎn)生SysTick異常(異常號(hào):15),SysTick中斷的優(yōu)先級(jí)也可以設(shè)置。

它會(huì)根據(jù)節(jié)拍來工作,把整個(gè)時(shí)間段分成很多小小的時(shí)間片,而每個(gè)任務(wù)每次只能運(yùn)行一個(gè)時(shí)間片的時(shí)間長度,超時(shí)就退出給別的任務(wù)運(yùn)行,這樣可以確保任何一個(gè)任務(wù)都不會(huì)霸占操作系統(tǒng)提供的各種定時(shí)功能,都與這個(gè)滴答定時(shí)器有關(guān)。

當(dāng)啟用時(shí),定時(shí)器從重載值遞減計(jì)數(shù)到零,在下一個(gè)時(shí)鐘周期將重裝載SYST\_RVR 中的值,然后在后續(xù)時(shí)鐘周期遞減。將零值寫入 SYST\_RVR 會(huì)在下一次回調(diào)時(shí)禁用計(jì)數(shù)器。當(dāng)計(jì)數(shù)器變?yōu)榱銜r(shí),COUNTFLAG 狀態(tài)位設(shè)置為 1。讀取 SYST\_CSR 將 COUNTFLAG 位清除為 0。寫入 SYST\_CVR 將清除寄存器和 COUNTFLAG 狀態(tài)位為 0,寫入不會(huì)觸發(fā) SysTick 異常邏輯,讀取該寄存器會(huì)在訪問時(shí)返回其值。

1. SysTick寄存器

SysTick定時(shí)器主要由4個(gè)寄存器組成:

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

在CMSIS中系統(tǒng)控制寄存器結(jié)構(gòu)體:


	

typedefstruct {__IOuint32_tCTRL;/*!

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

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

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

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

MM32F0130系列的SysTick的HCLK來源于AHB總線經(jīng)過硬件4分頻,F(xiàn)CLK直接來源于AHB時(shí)鐘總線。

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

當(dāng) SysTick 定時(shí)器從1計(jì)到0時(shí),它將把COUNTFLAG位置位;

而下述方法可以清零:

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

  • 往 SysTick 當(dāng)前值寄存器(STCVR)中寫任何數(shù)據(jù)

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

2. SysTick編程

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

  2. 禁止SysTick

  3. 設(shè)置重裝值寄存器

  4. 清除當(dāng)前值寄存器

  5. 使能SysTick

  6. 完成

SysTick操作相關(guān)函數(shù)有:

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

	;使能SysTick定時(shí)器,并且使能SysTick異常 LDRR0,=0xE000E010;加載STCSR的地址 MOVR1,#0 STRR1,[R0];先停止SysTick,以防意外產(chǎn)生異常請(qǐng)求 LDR R1, =0x3FF ;讓SysTick每1024周期計(jì)完一次。因?yàn)槭菑?023數(shù)到 ;0,總共數(shù)了1024個(gè)周期,所以加載值為0x3FF STRR1,[R0,#4];寫入重裝載的值 STRR1,[R0,#8];往STCVR中寫任意的數(shù),以確保清除COUNTFLAG標(biāo)志 MOVR1,#0x7;選擇FCLK作為時(shí)鐘源,并使能SysTick及其異常請(qǐng)求 STRR1,[R0];寫入數(shù)值,開啟定時(shí)器 在CMSIS庫中有定義對(duì)應(yīng)的配置函數(shù):

	__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可以通過輪詢或者中斷方式進(jìn)行操作,使用輪詢的程序可以讀取SysTick控制和狀態(tài)寄存器,檢查COUNTFLAG,如果該位置位,則表明SysTick計(jì)數(shù)已減到0。中斷方式延時(shí)參考程序:

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

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

						

						

						
														


原文標(biāo)題:技術(shù)分享 | Cortex-M0中斷控制和系統(tǒng)控制(五)

文章出處:【微信公眾號(hào):安芯教育科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5253

    瀏覽量

    119206
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3218

    瀏覽量

    113688
  • Systick
    +關(guān)注

    關(guān)注

    0

    文章

    62

    瀏覽量

    13009

原文標(biāo)題:技術(shù)分享 | Cortex-M0中斷控制和系統(tǒng)控制(五)

文章出處:【微信號(hào):Ithingedu,微信公眾號(hào):安芯教育科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    SysTick使用詳解

    處理的微控制都可以由這個(gè)定時(shí)獲得定的時(shí)間間隔。2. SysTick相關(guān)寄存器狀態(tài)
    發(fā)表于 08-12 06:32

    SysTick的定義與相關(guān)寄存器詳解

    、概述:SysTick個(gè)簡單的遞減24位計(jì)數(shù)如果你不需要再應(yīng)用程序中嵌入操作系統(tǒng),SysTick可以作為簡單的延時(shí)和產(chǎn)生周期性的中斷
    發(fā)表于 01-05 07:26

    SysTick寄存器介紹

    設(shè)置系統(tǒng)時(shí)鐘SYSCLK 等于72M。當(dāng)重裝載數(shù)值寄存器的值遞減到0 的時(shí)候,系統(tǒng)定時(shí)就產(chǎn)生次中斷,以此循環(huán)往復(fù)。SysTick 寄存器
    發(fā)表于 01-21 11:37

    如何使用STM32實(shí)現(xiàn)systick的精確延時(shí)

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

    SysTick定時(shí)介紹,SysTick定時(shí)寄存器

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

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

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

    Systick定時(shí)幾個(gè)簡單的函數(shù)簡介

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

    帶你模仿正點(diǎn)原子編程風(fēng)格到深入學(xué)習(xí)寄存器并手把手編寫STM32F103寄存器程序(SYSTICK滴答時(shí)鐘之delay延時(shí))

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

    STM32_SysTick—系統(tǒng)定時(shí)

    SysTick 的簡介和寄存器的詳細(xì)描述。因?yàn)?SysTick 是屬于CM3 內(nèi)核的外設(shè),有關(guān)寄存器的定義和部分庫函數(shù)都在 core_CM3.h 這個(gè)頭文件中實(shí)現(xiàn)。所以學(xué)習(xí)
    發(fā)表于 12-23 19:56 ?2次下載
    STM32_<b class='flag-5'>SysTick</b>—系統(tǒng)定時(shí)<b class='flag-5'>器</b>

    STM32學(xué)習(xí)筆記(5)——系統(tǒng)定時(shí)SysTick

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

    [學(xué)習(xí)筆記]STM32F1 SYSTICK 滴答定時(shí)(寄存器、標(biāo)準(zhǔn)庫、HAL庫)

    SysTick的中斷函數(shù):4. 程序設(shè)計(jì)(寄存器)5. 程序設(shè)計(jì)(標(biāo)準(zhǔn)庫)6. 程序設(shè)計(jì)(HAL庫)7. 實(shí)驗(yàn)結(jié)果8. 源碼下載7.SYSTICK 滴答定時(shí)0. 博主理解:
    發(fā)表于 12-23 20:02 ?7次下載
    [學(xué)習(xí)筆記]STM32F1 <b class='flag-5'>SYSTICK</b> 滴答定時(shí)<b class='flag-5'>器</b>(<b class='flag-5'>寄存器</b>、標(biāo)準(zhǔn)庫、HAL庫)

    詳解STM32的嘀嗒時(shí)鐘(SysTick)

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

    SysTick時(shí)鐘

    Cortex-M3內(nèi)核的處理,內(nèi)部包含了個(gè)SysTick定時(shí),SysTick個(gè)24位的
    的頭像 發(fā)表于 03-01 17:40 ?717次閱讀
    <b class='flag-5'>SysTick</b>時(shí)鐘

    STM32 SysTick配置函數(shù)

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

    個(gè)人對(duì)STM32 SysTick的總結(jié)(寄存器操作)

    、概述:SysTick個(gè)簡單的遞減24位計(jì)數(shù)。如果你不需要再應(yīng)用程序中嵌入操作系統(tǒng),SysTick可以作為簡單的延時(shí)和產(chǎn)生周期性的中
    的頭像 發(fā)表于 01-06 08:00 ?1429次閱讀
    個(gè)人對(duì)STM32 <b class='flag-5'>SysTick</b>的總結(jié)(<b class='flag-5'>寄存器</b>操作)