STM32F1xx官方資料:
《Cortex-M3權(quán)威指南-中文》-第8章最后一個(gè)小節(jié):Systick定時(shí)器
SysTick定時(shí)器
Systick定時(shí)器,是一個(gè)簡(jiǎn)單的定時(shí)器,對(duì)于CM3、CM4內(nèi)核芯片,都有Systick定時(shí)器。Systick定時(shí)器常用來做延時(shí),或者實(shí)時(shí)系統(tǒng)的心跳時(shí)鐘。這樣可以節(jié)省MCU資源,不用浪費(fèi)一個(gè)定時(shí)器。比如UCOS中,分時(shí)復(fù)用,需要一個(gè)最小的時(shí)間戳,一般在STM32+UCOS系統(tǒng)中,都采用Systick做UCOS心跳時(shí)鐘。
Systick定時(shí)器就是系統(tǒng)滴答定時(shí)器,一個(gè)24 位的倒計(jì)數(shù)定時(shí)器,計(jì)到0 時(shí),將從RELOAD 寄存器中自動(dòng)重裝載定時(shí)初值。只要不把它在SysTick 控制及狀態(tài)寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。
SysTick定時(shí)器被捆綁在NVIC中,用于產(chǎn)生SYSTICK異常(異常號(hào):15)。Systick中斷的優(yōu)先級(jí)也可以設(shè)置。
實(shí)際上,Systick就是一個(gè)定時(shí)器而已,只是它放在了NVIC中,主要的目的是為了給操作系統(tǒng)提供一個(gè)硬件上的中斷,稱之為滴答中斷操作系統(tǒng)進(jìn)行運(yùn)轉(zhuǎn)的時(shí)候,也會(huì)有時(shí)間節(jié)拍。它會(huì)根據(jù)節(jié)拍來工作,把整個(gè)時(shí)間段分成很多小小的時(shí)間片,而每個(gè)任務(wù)每次只能運(yùn)行一個(gè)時(shí)間片的時(shí)間長(zhǎng)度,超時(shí)就退出給別的任務(wù)運(yùn)行,這樣可以確保任何一個(gè)任務(wù)都不會(huì)霸占操作系統(tǒng)提供的各種定時(shí)功能,都與這個(gè)滴答定時(shí)器有關(guān)。因此,需要一個(gè)定時(shí)器來產(chǎn)生周期性的中斷,而且最好還讓用戶程序不能隨意訪問它的寄存器,以維持操作系統(tǒng)的節(jié)拍。只要不把它在SysTick控制及狀態(tài)寄存器中的使能位清除,就一直執(zhí)行。
SysTick相關(guān)寄存器
SysTick有四個(gè)寄存器,分別為CTRL(控制與狀態(tài)寄存器)、LOAD(自動(dòng)重裝載值寄存器)、VAL(當(dāng)前值寄存器)、CALIB(校準(zhǔn)值寄存器)。
在MDK的core_m3.h文件中定義了一個(gè)結(jié)構(gòu)體SysTick_Type,里面也包括了這四個(gè)寄存器。
typedef struct
{
__IO uint32_t CTRL; /*!< Offset: 0x00 SysTick Control and Status Register */
__IO uint32_t LOAD; /*!< Offset: 0x04 SysTick Reload Value Register */
__IO uint32_t VAL; /*!< Offset: 0x08 SysTick Current Value Register */
__I uint32_t CALIB; /*!< Offset: 0x0C SysTick Calibration Register */
} SysTick_Type;
它們的各位描述如下面的表格所述:
CTRL寄存器各位描述
位段 名稱 類型 復(fù)位值 描述
16 COUNTFLAG R 0
如果在上次讀取本寄存器后,SysTick已經(jīng)數(shù)到了0,是該位為1.如果讀
取該位,該位自動(dòng)清零。
2 CLKSOURCE R/W 0
0 外部時(shí)鐘源(STCLK)
1 內(nèi)核時(shí)鐘(FCLK)
1 TICKINT R/W 0
1 SysTick倒數(shù)到0時(shí)產(chǎn)生SysTick異常請(qǐng)求
0 數(shù)到0時(shí)無動(dòng)作
0 ENABLE R/W 0 SysTick定時(shí)器的使能位
對(duì)于STM32,外部時(shí)鐘源(STCLK)是HCLK(AHB總線時(shí)鐘)的1/8,內(nèi)核時(shí)鐘(FCLK)是HCLK(AHB總線時(shí)鐘)。
LOAD寄存器各位描述
位段 名稱 類型 復(fù)位值 描述
23:0 RELOAD R/W 0 當(dāng)?shù)箶?shù)至0是,將被重新裝載的值
VAL寄存器各位描述
位段 名稱 類型 復(fù)位值 描述
23:0 CORRENT R/Wc 0
讀取時(shí)返回當(dāng)前倒計(jì)數(shù)的值,寫它則使之清零,同時(shí)還會(huì)清
除在CTRL寄存器的COUNTFLAG位
SysTick相關(guān)庫函數(shù)
SysTick_CLKSourceConfig(),這是Systick的時(shí)鐘源選擇,直接配置CTRL寄存器的值。假設(shè)HCLK為72MHz,選用外部時(shí)鐘源,那么SysTick的時(shí)鐘即9MHz。這就意味著,SysTick的計(jì)數(shù)器VAL每減1代表時(shí)間過去了1/9us。
具體的定義在misc.c文件中。
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_Config(uint32_t ticks) ,這是SysTick的初始化函數(shù),時(shí)鐘為HCLK,并開啟SysTick中斷。其中函數(shù)的參數(shù)表示兩次中斷之間時(shí)間間隔期間的SysTick周期,即兩次中斷之間有多少個(gè)SysTick周期。
具體的定義在core_cm3.h文件中。
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
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 */
}
void SysTick_Handler(void),這是SysTick的中斷服務(wù)函數(shù)。我們舉一個(gè)例子,利用中斷的方式實(shí)現(xiàn)delay延時(shí)函數(shù),見下面的程序:
static __IO uint32_t TimingDelay;
void Delay(__IO uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
void SysTick_Handler(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
int main(void)
{ …
if (SysTick_Config(SystemCoreClock / 1000)) //systick時(shí)鐘為HCLK,中斷時(shí)間間隔1ms
{
while (1);
}
while(1)
{ Delay(200);//200ms
…
}
}
Delay延時(shí)函數(shù)講解
之前利用中斷實(shí)現(xiàn)延時(shí)函數(shù),但是一直使用中斷會(huì)造成資源的浪費(fèi),不建議這樣實(shí)現(xiàn),我們利用查詢的方式實(shí)現(xiàn)delay延時(shí)。下面主要介紹Delay延時(shí)函數(shù)的實(shí)現(xiàn):
delay_init()
首先是delay_init(),延時(shí)初始化函數(shù)。利用Syst_CLKSourceConfig()函數(shù)選擇SysTick時(shí)鐘源,選擇外部時(shí)鐘(HCLK的1/8);同時(shí)初始化fac_us和fac_ms兩個(gè)變量。
void delay_init()
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //選擇外部時(shí)鐘 HCLK/8
fac_us=SystemCoreClock/8000000; //為系統(tǒng)時(shí)鐘的1/8,實(shí)際上也就是在計(jì)算1usSysTick的VAL減的數(shù)目
fac_ms=(u16)fac_us*1000; //代表每個(gè)ms需要的systick時(shí)鐘數(shù),即每毫秒SysTick的VAL減的數(shù)目
}
delay_ms()
其次,delay_ms(),此函數(shù)用來延時(shí)指定的ms。
此時(shí)要注意nms的范圍,SysTick->LOAD為24位寄存器,所以最大延時(shí)為:nms<=0xffffff*8*1000/SYSCLK;SYSCLK單位為Hz,nms單位為ms。對(duì)72M條件下,nms<=1864。如果超出這個(gè)值,建議多次調(diào)用此函數(shù)來實(shí)現(xiàn)。
void delay_ms(u16 nms)
{
u32 temp;
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ù)器
}
這段代碼其實(shí)就是先把延時(shí)的時(shí)間換算成SysTick的時(shí)鐘周期數(shù),然后寫入LOAD寄存器。然后清空當(dāng)前寄存器VAL的內(nèi)容,再開啟倒數(shù)功能。等倒數(shù)結(jié)束即延時(shí)了nms、最后關(guān)閉SysTick,清空VAL的值,實(shí)現(xiàn)一次延時(shí)的操作。
這里特別說一下,temp&0x01,這一句用來判斷SysTick定時(shí)器是否還處在開啟的狀態(tài),可以防止SysTick被意外關(guān)閉導(dǎo)致的死循環(huán)。
delay_us()
最后,delay_us(),此函數(shù)用來延時(shí)指定的us。具體的邏輯和上面一個(gè)函數(shù)類似,就不介紹了。
void delay_us(u32 nus)
{
u32 temp;
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ù)器
}
delay延時(shí)的相關(guān)函數(shù)在SYSTEM文件夾下的delay子文件夾,在使用delay_ms()或者delay_us()函數(shù)之前一定不要忘記先初始化delay_init()。
上一篇:【STM32】GPIO工作原理(八種工作方式超詳細(xì)分析)
下一篇:【STM32】NVIC中斷優(yōu)先級(jí)管理(中斷向量表)
推薦閱讀
史海拾趣
在電子行業(yè)的激烈競(jìng)爭(zhēng)中,Electrolube公司始終堅(jiān)持以客戶需求為導(dǎo)向,不斷創(chuàng)新和拓展產(chǎn)品線。除了UVCL涂層外,公司還推出了一系列樹脂、涂料和熱管理解決方案的產(chǎn)品組合,為EV電池提供全面保護(hù)。
這些產(chǎn)品不僅具有優(yōu)異的性能表現(xiàn),而且能夠滿足不同客戶的需求。例如,某些產(chǎn)品具有優(yōu)異的耐高溫性能,適用于高溫環(huán)境下的電子設(shè)備;而另一些產(chǎn)品則具有出色的耐化學(xué)腐蝕性能,能夠在惡劣的工作環(huán)境中保持穩(wěn)定的性能。
Electrolube公司通過不斷的技術(shù)創(chuàng)新和產(chǎn)品優(yōu)化,成功拓展了市場(chǎng)份額,并在電子行業(yè)中樹立了良好的品牌形象。同時(shí),公司還積極與各大汽車制造商合作,共同推動(dòng)電動(dòng)汽車產(chǎn)業(yè)的發(fā)展。
面對(duì)全球電子市場(chǎng)的不斷擴(kuò)張,Artaflex公司制定了全球化的發(fā)展戰(zhàn)略。公司通過設(shè)立海外分支機(jī)構(gòu)、拓展國(guó)際市場(chǎng)、參與國(guó)際展會(huì)等方式,不斷提升品牌知名度和市場(chǎng)份額。同時(shí),公司還積極引進(jìn)國(guó)際先進(jìn)技術(shù)和管理經(jīng)驗(yàn),提升自身的競(jìng)爭(zhēng)力。這一戰(zhàn)略的實(shí)施使得Artaflex在全球電子行業(yè)中占據(jù)了重要地位。
在ARM公司的支持下,Keil公司不斷進(jìn)行技術(shù)創(chuàng)新和產(chǎn)品升級(jí)。其中最具代表性的是Keil C51集成開發(fā)環(huán)境的推出。這一產(chǎn)品不僅繼承了Keil PK51的優(yōu)點(diǎn),還在性能、穩(wěn)定性和易用性等方面進(jìn)行了大幅提升。Keil C51的推出,極大地滿足了市場(chǎng)對(duì)嵌入式系統(tǒng)開發(fā)的需求,也進(jìn)一步鞏固了Keil公司在行業(yè)內(nèi)的領(lǐng)先地位。
背景:HN Electronics成立于20世紀(jì)90年代初,正值全球電子市場(chǎng)快速崛起的時(shí)期。公司由一群在半導(dǎo)體領(lǐng)域擁有豐富經(jīng)驗(yàn)的工程師創(chuàng)立,他們看到了智能手機(jī)和消費(fèi)電子產(chǎn)品市場(chǎng)的巨大潛力。
發(fā)展:初期,HN Electronics專注于研發(fā)高性能的電源管理芯片,通過技術(shù)創(chuàng)新解決了當(dāng)時(shí)市場(chǎng)上存在的能效低、發(fā)熱量大等問題。公司迅速獲得了業(yè)界的認(rèn)可,并與幾家知名手機(jī)制造商建立了合作關(guān)系。
關(guān)鍵事件:1995年,HN Electronics成功推出其首款自主研發(fā)的電源管理芯片,該產(chǎn)品迅速成為市場(chǎng)熱銷產(chǎn)品,為公司贏得了第一桶金。
EOZ S.A.S公司非常重視企業(yè)文化和團(tuán)隊(duì)建設(shè)。公司倡導(dǎo)“創(chuàng)新、協(xié)作、共贏”的價(jià)值觀,鼓勵(lì)員工積極參與創(chuàng)新活動(dòng)并分享創(chuàng)新成果。同時(shí),公司還注重員工的培訓(xùn)和發(fā)展,為員工提供豐富的培訓(xùn)資源和晉升機(jī)會(huì)。這些舉措不僅激發(fā)了員工的積極性和創(chuàng)造力,也為企業(yè)的發(fā)展提供了有力的人才保障。在EOZ S.A.S公司的發(fā)展歷程中,優(yōu)秀的企業(yè)文化和團(tuán)隊(duì)成為公司最寶貴的財(cái)富之一。
DPA Components International公司自成立以來,一直將技術(shù)創(chuàng)新作為公司發(fā)展的核心動(dòng)力。在電子行業(yè)的早期階段,該公司就投入大量資源研發(fā)新型電子元件,這些元件以其高精度和穩(wěn)定性迅速在市場(chǎng)上獲得了認(rèn)可。隨著技術(shù)的不斷進(jìn)步,DPA不斷推出具有創(chuàng)新性的產(chǎn)品,如智能傳感器和高效能集成電路,這些產(chǎn)品不僅滿足了客戶對(duì)性能的需求,也推動(dòng)了整個(gè)電子行業(yè)的發(fā)展。通過不斷的技術(shù)創(chuàng)新,DPA Components International公司在市場(chǎng)上建立了良好的口碑,成為行業(yè)內(nèi)的領(lǐng)軍企業(yè)。
1:空調(diào)新裝好進(jìn)行充填時(shí),先從高壓側(cè)進(jìn)行時(shí)間在5min以上的抽真空,然后關(guān)閉閥門觀察高低壓力表讀數(shù),再從高、低兩個(gè)方向抽真空這樣可以輔助檢測(cè)系統(tǒng)是否堵塞和泄漏.抽完真空要先關(guān)閉壓力表閥門再切斷真空泵電源,以免真空度下降. 2:填充制 ...… 查看全部問答∨ |
|
各種單片機(jī)CPLD/FPGA開發(fā)板 詳細(xì)情況請(qǐng)?jiān)L問: http://www.ednchina.com/blog/yangguang1975/… 查看全部問答∨ |
|
急聘嵌入式軟件測(cè)試社會(huì)及實(shí)習(xí)生 一、研究院簡(jiǎn)介 中國(guó)科學(xué)院光電研究院(以下簡(jiǎn)稱光電院)是隸屬于中國(guó)科學(xué)院的科研機(jī)構(gòu),總部設(shè)在北京。院址選定在北京航天城,目前辦公地點(diǎn)在北京海淀區(qū)。 中國(guó)科學(xué)院光電研究院評(píng)測(cè)中心主要從事載人航天工程應(yīng)用系 ...… 查看全部問答∨ |
小生準(zhǔn)備考研了,小生已經(jīng)瞄準(zhǔn)了嵌入式這塊肥肉,敢問各位兄臺(tái),那所大學(xué)的嵌入式比較好啊?… 查看全部問答∨ |
最近在搞EVC4.2+WinCE4.0遷移到VS2005+WinCE6.0中去,突然發(fā)現(xiàn) 有好多的問題,不知道哪位大哥有在VS2005+WinCE6.0上開發(fā)的經(jīng)驗(yàn)的 請(qǐng)給一些參考書籍或則資料什么的,十分感謝,同樣也希望大家有什么 問題提出來一起交流一下。共同努 ...… 查看全部問答∨ |
|
在凌陽的單片機(jī)中,使用LCD的時(shí)候怎么樣寫一個(gè)完整的程序才能把一個(gè)字符顯示在LCD上呢?請(qǐng)說說過程,特別是怎么樣使用的輸入輸出口的?在此先感謝!!… 查看全部問答∨ |
我在用USB FET調(diào)試時(shí),居然提示我說“firmware的版本不對(duì),是否要升級(jí)”。試了幾次,都出現(xiàn)這種情況。本來想明天咨詢了再弄的,結(jié)果熬不住,點(diǎn)了“確定”。這下好了,就看見IAR在進(jìn)行了什么“Erase――”之后,就永遠(yuǎn)地停在那里了。 各位大蝦,這 ...… 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 人形機(jī)器人馬拉松背后的思考,兆易創(chuàng)新如何賦能機(jī)器人產(chǎn)業(yè)
- 一種基于STM32的智能柜控制器設(shè)計(jì)
- 小型傾轉(zhuǎn)旋翼機(jī)的無刷直流電機(jī)驅(qū)動(dòng)器設(shè)計(jì)
- 超高速攝影機(jī)電控系統(tǒng)設(shè)計(jì)
- 基于GPS自動(dòng)授時(shí)的無線智能控制器的設(shè)計(jì)
- 基于PTR2000的無線氣象信息采集系統(tǒng)設(shè)計(jì)
- Microchip推出MEC175xB系列器件,為嵌入式控制器引入硬件 抗量子攻擊能力
- 無人飛行器機(jī)載穩(wěn)定云臺(tái)控制系統(tǒng)的設(shè)計(jì)
- 匠芯創(chuàng)推出面向具身智能高性能實(shí)時(shí)處理器M7000
- 自動(dòng)駕駛卡車公司Aurora重新引入駕駛員
- 全固態(tài)電池新標(biāo)準(zhǔn)出臺(tái),明確定義解決行業(yè)界定義及測(cè)試難題
- 長(zhǎng)城死磕增程!下代平臺(tái)用6C充電,插混純電續(xù)航竟然破400公里!
- 寶馬全固態(tài)電池電動(dòng)汽車上路測(cè)試
- 基于數(shù)采系統(tǒng)的車載A2B信號(hào)測(cè)試解決方案
- 從夢(mèng)想到落地:固態(tài)激光雷達(dá)的十年發(fā)展史
- AI 座艙芯片,走入全民時(shí)代
- 2025年1-3月ADAS供應(yīng)商裝機(jī)量排行榜:自主廠商引領(lǐng)技術(shù)融合新趨勢(shì)
- 又一廠商官宣大動(dòng)作,汽車零部件企業(yè)緣何涌向機(jī)器人領(lǐng)域?
- 總規(guī)模50億!蘇州吳中區(qū)成立機(jī)器人專項(xiàng)基金
- 答題贏京東卡|PI InnoSwitch產(chǎn)品系列學(xué)習(xí)中心
- 喜迎新年,EE喊你搶新年福袋啦!
- Atmel SAM R21“無線”設(shè)計(jì)大賽
- 有獎(jiǎng)直播 | 安富利、Nordic、TDK | AIoT“ 算法+芯片+終端 ”邊緣計(jì)算解決方案
- 西門子白皮書下載《物聯(lián)網(wǎng)在電子制造行業(yè)的成功應(yīng)用》
- 高性能 i.MX RT 處理器助力智能節(jié)點(diǎn)無需聯(lián)網(wǎng)實(shí)現(xiàn)機(jī)器學(xué)習(xí)
- 最后一天!Beetle ESP32-C3免費(fèi)測(cè)評(píng),趕緊上車
- 贏京東卡——我家房子“成精”了!與英飛凌一起來探索吧!
- “集齊五友”參與KW41Z創(chuàng)意征集活動(dòng),贏100元京東卡!
- 萬人學(xué)習(xí)51單片機(jī)