一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

安芯教育科技 ? 來源:靈動MM32 MCU ? 作者:Nuoeriris ? 2022-05-13 12:08 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

1. SysTick寄存器

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

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

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


	

typedefstruct {__IOuint32_tCTRL;/*!

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

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

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

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

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

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

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

而下述方法可以清零:

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

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

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

2. SysTick編程

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

  2. 禁止SysTick

  3. 設置重裝值寄存器

  4. 清除當前值寄存器

  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定時器,并且使能SysTick異常 LDRR0,=0xE000E010;加載STCSR的地址 MOVR1,#0 STRR1,[R0];先停止SysTick,以防意外產(chǎn)生異常請求 LDR R1, =0x3FF ;讓SysTick每1024周期計完一次。因為是從1023數(shù)到 ;0,總共數(shù)了1024個周期,所以加載值為0x3FF STRR1,[R0,#4];寫入重裝載的值 STRR1,[R0,#8];往STCVR中寫任意的數(shù),以確保清除COUNTFLAG標志 MOVR1,#0x7;選擇FCLK作為時鐘源,并使能SysTick及其異常請求 STRR1,[R0];寫入數(shù)值,開啟定時器 在CMSIS庫中有定義對應的配置函數(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可以通過輪詢或者中斷方式進行操作,使用輪詢的程序可以讀取SysTick控制和狀態(tài)寄存器,檢查COUNTFLAG,如果該位置位,則表明SysTick計數(shù)已減到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 //為系統(tǒng)時鐘的1/4,實際上也就是在計算1usSysTick的VAL減的數(shù)目 fac_us=SystemCoreClock/4000000; //代表每個ms需要的systick時鐘數(shù),即每毫秒SysTick的VAL減的數(shù)目 fac_ms=(u16)fac_us*1000; } voiddelay_ms(u16nms) { u32temp; SysTick->LOAD=(u32)nms*fac_ms;//時間加載(SysTick->LOAD為24bit) SysTick->VAL=0x00;//清空計數(shù)器 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//開始倒數(shù) do { temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16)));???//等待時間到達,看CTRL的第16位(COUNTFLAG)是否為1,看STRL的第0位(ENABLE)是否為1??? ?????SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//關(guān)閉計數(shù)器 SysTick->VAL=0X00;//清空計數(shù)器 } voiddelay_us(u32nus) { u32temp; SysTick->LOAD=nus*fac_us;//時間加載 SysTick->VAL=0x00;//清空計數(shù)器 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//開始倒數(shù) do { temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16)));????????//等待時間到達??? ????SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//關(guān)閉計數(shù)器 SysTick->VAL=0X00;//清空計數(shù)器 } SysTick定時器除了能服務于操作系統(tǒng)之外,還能用于其它目的:如時間測量、定時或者鬧鈴等。

						

						

						
														


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

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

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

    關(guān)注

    31

    文章

    5434

    瀏覽量

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

    關(guān)注

    23

    文章

    3298

    瀏覽量

    118943
  • Systick
    +關(guān)注

    關(guān)注

    0

    文章

    63

    瀏覽量

    13596

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    SysTick使用詳解

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

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

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

    SysTick寄存器介紹

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

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

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

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

    在 STM32F1 庫函數(shù)中,并沒有提供相應的 SysTick 定時配置函數(shù),我們要操作 SysTick 定時就需要了解它的寄存器功能。
    的頭像 發(fā)表于 02-11 15:37 ?1.9w次閱讀
    <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相關(guān)寄存器狀態(tài)
    發(fā)表于 12-02 18:36 ?10次下載
    STM32F103:精準延時delay——<b class='flag-5'>SysTick</b>使用

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

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

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

    帶你模仿正點原子到寄存器編寫–SYSTICK(delay函數(shù))以下是本篇文章正文內(nèi)容,下面案例可供參考鄧家-廣州華軟軟件學院、 前提了解系統(tǒng)時鐘
    發(fā)表于 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—系統(tǒng)定時

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

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

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

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

    SysTick的中斷函數(shù):4. 程序設計(寄存器)5. 程序設計(標準庫)6. 程序設計(HAL庫)7. 實驗結(jié)果8. 源碼下載7.SYSTICK 滴答定時0. 博主理解:
    發(fā)表于 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)

    計數(shù)值到0的時候,SysTick重裝載寄存器就會自動重新裝載初值。只要SysTick控制和狀態(tài)寄存器(CTRL)中的使能位沒有ENABLE清除掉,那么就會永遠的執(zhí)行下去。
    的頭像 發(fā)表于 01-19 18:11 ?1.6w次閱讀
    <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內(nèi)核的處理,內(nèi)部包含了SysTick定時,SysTick個24位的
    的頭像 發(fā)表于 03-01 17:40 ?1143次閱讀
    <b class='flag-5'>SysTick</b>時鐘

    STM32 SysTick配置函數(shù)

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

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

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