5.STM32之系統(tǒng)定時(shí)器(SysTick)

1.系統(tǒng)定時(shí)器介紹

總體概述

SysTick 定時(shí)器被捆綁在 NVIC 中蜂挪,用于產(chǎn)生SysTick異常(異常號:15)。
SysTick 中斷對系統(tǒng)尤其重要矾柜,操作系統(tǒng)提供的各種定時(shí)功能都與這個(gè)滴答定時(shí)器有關(guān)伏穆。因此。需要一個(gè)定時(shí)器來產(chǎn)生周期性的中斷恨统,而且最好讓用戶不能隨意訪問它的寄存器以維持系統(tǒng)“心跳”的節(jié)律叁扫。
SysTick 定時(shí)器能產(chǎn)生中斷,CM3 為它專門開出一個(gè)異常類型畜埋,并且在向量表中有它的一席之地莫绣。它使操作系統(tǒng)和其他系統(tǒng)軟件在 CM3 器件之間的移植變得簡單,因?yàn)樵谒械?CM3 產(chǎn)品中悠鞍,SysTick的處理方式都是相同的对室。SysTick定時(shí)器不僅能服務(wù)于操作系統(tǒng),還能用于延時(shí)咖祭,鬧鐘以及測量時(shí)間掩宜。

原理分析

SysTick 是一個(gè)24位的寄存器,因此它一次最多可以計(jì)數(shù)2的24次方個(gè)時(shí)鐘脈沖么翰。
用戶定義一個(gè)時(shí)鐘脈沖的值之后牺汤,這個(gè)值被送入計(jì)數(shù)寄存器中,每收到一個(gè)脈沖硬鞍,這個(gè)值就減1慧瘤,當(dāng)這個(gè)值減小到0時(shí)就觸發(fā)異常。

2.程序代碼

程序目的:使用 SysTick 延時(shí)控制 LED 燈的閃爍固该。

<------------------------------------------------------------->

systick.h源代碼:
#ifndef __SYSTICK_H
#define __SYSTICK_H

#include "stm32f10x.h"

void SysTick_Init(void);

void Delay_ms( __IO u32 nTime );

#endif
systick.c源代碼:
/***************************************
程序的本意是想在初始化時(shí)關(guān)閉滴答定時(shí)器
在每次使用延時(shí)函數(shù)時(shí)再把它打開
這兩句代碼去掉锅减,程序也可以正常運(yùn)行 
***************************************/
#include "stm32f10x.h"
#include "systick.h"

static __IO u32 TimingDelay;

void SysTick_Init(void)
{
    
    /**********************************
    StstemFrequency / 1000      1ms
    StstemFrequency / 100000    10us
    StstemFrequency / 1000000   1us
    ***********************************/
    
    if( SysTick_Config( SystemCoreClock / 1000 ) )   //ST3.5.0 庫版本
    {
        /* Capture error */
        
        while ( 1 );
    }
    
    /* 關(guān)閉滴答定時(shí)器 */
    //SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_MSK;
    
}

void Delay_ms( __IO u32 nTime )
{
    
    TimingDelay = nTime;
    
    /* 使能滴答定時(shí)器 */
    //SysTick->CTRL |= SysTick_CTRL_ENABLE_MSK;
    
    while( TimingDelay != 0 );
    
}

void TimingDelay_Decrement(void)
{
    
    if( TimingDelay != 0x00 )
    {
        TimingDelay --;
    }
    
}
stm32f103x_it.c源代碼:
/******************************************************************
在stm32f103x_it.c文件中可以找到 SysTick_Handler 函數(shù)
這個(gè)函數(shù)是系統(tǒng)定義好的,在里面調(diào)用 TimingDelay_Decrement 函數(shù)即可
因?yàn)?TimingDelay_Decrement 函數(shù)是在別的地方定義的
所以要在 stm32f103x_it.c 中加上以下聲明:
extern void TimingDelay_Decrement(void);
******************************************************************/
void SysTick_Handler(void)
{
    TimingDelay_Decrement();
}
主函數(shù)main.c源代碼:
#include "stm32f10x.h"
#include "led.h"
#include "systick.h"

int main(void)
{
    LED_Init();
    SysTick_Init();
    LED2(ON);
    
    while(1)
    {
        
        Delay_ms(200);
        LED2_REV;
        LED3_REV;
        
    }
    
}

3.補(bǔ)充

在延時(shí)的函數(shù)中我們會發(fā)現(xiàn) TimingDelay 這個(gè)變量伐坏,它的定義是這樣的:

static __IO u32 TimingDelay;
static:

static 修飾符好理解怔匣,它用來聲明靜態(tài)變量,相當(dāng)于全局變量桦沉。
我們知道每瞒,C/C++的變量都有一個(gè)作用域。舉個(gè)例子纯露,一個(gè)函數(shù)聲明的變量只存在于它的執(zhí)行過程中剿骨,這時(shí)變量保存在棧里。一旦退出函數(shù)埠褪,變量也就死亡了浓利。而用 static 修飾的變量是存儲在堆里的挤庇,知道整個(gè)程序結(jié)束它才會消失。
因此在我們進(jìn)行延時(shí)的時(shí)候贷掖,需要讓延時(shí)剩下的脈沖數(shù)一直存在于程序中嫡秕,這樣才能完成延時(shí)。

__IO:

__IO 本身是不存在于 C 語言中的苹威,它是一個(gè)另一個(gè)修飾符的宏定義:

#define     __IO    volatile

如果一個(gè)值有可能會被意想不到的改變昆咽,那么它有必要被定義為 volatile。
這樣牙甫,編譯器就不會去假設(shè)這個(gè)變量的值了掷酗。精確地說就是,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值腹暖,而不是使用保存在寄存器里的備份汇在。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市脏答,隨后出現(xiàn)的幾起案子糕殉,更是在濱河造成了極大的恐慌,老刑警劉巖殖告,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阿蝶,死亡現(xiàn)場離奇詭異,居然都是意外死亡黄绩,警方通過查閱死者的電腦和手機(jī)羡洁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爽丹,“玉大人筑煮,你說我怎么就攤上這事≡列” “怎么了真仲?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長初澎。 經(jīng)常有香客問我秸应,道長,這世上最難降的妖魔是什么碑宴? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任软啼,我火速辦了婚禮,結(jié)果婚禮上延柠,老公的妹妹穿的比我還像新娘祸挪。我一直安慰自己,他們只是感情好贞间,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布贿条。 她就那樣靜靜地躺著盈罐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闪唆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天钓葫,我揣著相機(jī)與錄音悄蕾,去河邊找鬼。 笑死础浮,一個(gè)胖子當(dāng)著我的面吹牛帆调,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播豆同,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼番刊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了影锈?” 一聲冷哼從身側(cè)響起芹务,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸭廷,沒想到半個(gè)月后枣抱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辆床,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年佳晶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讼载。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡轿秧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咨堤,到底是詐尸還是另有隱情菇篡,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布吱型,位于F島的核電站逸贾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏津滞。R本人自食惡果不足惜铝侵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望触徐。 院中可真熱鬧咪鲜,春花似錦、人聲如沸撞鹉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至享郊,卻和暖如春览祖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背炊琉。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工展蒂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苔咪。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓锰悼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親团赏。 傳聞我的和親對象是個(gè)殘疾皇子箕般,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容