久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

STM32入門(mén)學(xué)習(xí)之systick定時(shí)器

 SDNUC 2019-04-18
上來(lái)就是systick定時(shí)器,,因?yàn)镚PIO等的基礎(chǔ)操作過(guò)于簡(jiǎn)單,,網(wǎng)上資料太多了。
這里討論的是基于STM32F10x 的基于 V3.5.0庫(kù)的庫(kù)函數(shù)配置方法,。

      Systick又叫系統(tǒng)嘀答定時(shí)器,,是一個(gè)24位的硬件定時(shí)器。嵌入式操作系統(tǒng)常有一個(gè)類(lèi)似“心跳”的定時(shí)器,,來(lái)分配時(shí)間片,,實(shí)現(xiàn)宏觀上的多任務(wù)。
其實(shí),,操作系統(tǒng)的多任務(wù),,在微觀上,CPU對(duì)多任務(wù)的管理是分時(shí)的,。每個(gè)任務(wù)都給一定的時(shí)間片,,就是把時(shí)間分成N個(gè)等份,優(yōu)先級(jí)高或是
重要的任務(wù)多占幾個(gè)時(shí)間片,,優(yōu)先級(jí)低的或是不重要的任務(wù)就少占幾個(gè)時(shí)間片,。大部分嵌入式操作系統(tǒng)基于時(shí)間片的。如ucos,。

       那基于STM32F10x V3.5.0庫(kù)如何操作Systick定時(shí)器呢,。
首先:STM32 的內(nèi)核庫(kù)已經(jīng)提供了這個(gè)功能。只要配置SysTick_Config()即可實(shí)現(xiàn),。
看下面的程序段,。
/*
* 函數(shù)名:SysTick_Init
* 描述         :?jiǎn)?dòng)系統(tǒng)滴答定時(shí)器 SysTick
* 輸入  : 無(wú)
* 輸出  :無(wú)
* 調(diào)用  : 外部調(diào)用
*/
void SysTick_Init(void)
{
        if(SysTick_Config(SystemCoreClock/1000))         //1ms定時(shí)器
        {
                while(1);
        }
        //SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;                         //若無(wú)法啟動(dòng)則關(guān)閉
}


        SysTick_Config的參數(shù),其實(shí)就是一個(gè)時(shí)鐘次數(shù),,叫systick重裝定時(shí)器的值,。意思就是我要多少個(gè)1/fosc 時(shí)間后中斷一下。

      根據(jù)學(xué)過(guò)的物理中的時(shí)間與頻率的公式:fosc=1/T   T=1/fosc ,fosc為系統(tǒng)的頻率,。
如果STM32時(shí)鐘頻率為:72MHz,,每次的時(shí)間為:T=1/72MHz,。1秒鐘為:1/(每次的時(shí)間)=1/(1/72MHz)=72 000 000次。1MHz是:1000 000,。

      反過(guò)來(lái)講,。SysTick_Config(72000)代表:72000*(1/72MHz)=1/1000=1(ms)。即定時(shí)為1ms,。
如果需要1S則,,可以通一設(shè)置一個(gè)全局變量,然后定初值得為1000,,這樣,,每個(gè)systick中斷一次,這個(gè)全局變量減1,,減到0,即systick中斷1000次,,時(shí)間
為:1ms*1000=1S。從而實(shí)現(xiàn)1S的定時(shí),。
      因?yàn)镾ysTick定時(shí)器是:24位的,,最大定時(shí)時(shí)間為:2的24次方*(1/72MHz)的時(shí)間,這里系統(tǒng)頻率為:72MHz的情況下,。

      如何使用這個(gè)Systick用于程序設(shè)計(jì)上的延時(shí)或是定時(shí)作用呢,?
如下:
__IO uint32_t TimingDelay;
定義一個(gè)全局變量,注意類(lèi)型為 volatile的,。

volatile的作用: 作為指令關(guān)鍵字,,確保本條指令不會(huì)因?yàn)榫幾g器的優(yōu)化而省略,且要求每次直接讀值.然后定義一個(gè)延時(shí)或是定時(shí)函數(shù):


/*
* 函數(shù)名:Delay_ms
* 描述         :ms延時(shí)程序,,1ms為一個(gè)單位
* 輸入  : - nTime
* 輸出  :無(wú)
* 示例  : Delay_ms(1) 實(shí)現(xiàn)的延時(shí)為:1*ms=1ms
* 調(diào)用  :外部調(diào)用
*/
void Delay_ms(uint16_t nTime)
{
        TimingDelay = nTime;
        //使能系統(tǒng)滴答定時(shí)器
        while(TimingDelay !=0);
}

      還要在系統(tǒng)的中斷函數(shù)文件:stm32f10x_it.c/h里面,,修改系統(tǒng)自帶的systick函數(shù)。這個(gè)函數(shù)要么沒(méi)有聲明或是為空操作,。這里加入
定時(shí)延時(shí)里的處理,。
      即中斷后,,全局變量做個(gè)--處理即可,。

      在::stm32f10x_it.c里修改如下:
添加外部的聲明:
extern __IO uint32_t TimingDelay;

      修改這個(gè)函數(shù): SysTick_Handler,,這是系統(tǒng)的關(guān)于SysTick_Handler的中斷服務(wù)程序名,,
在啟動(dòng)文件里如:startup_stm32f10x_hd.s   有它的定義的名字,。不要弄錯(cuò)了。否則無(wú)法中斷處理,。


/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{
if (TimingDelay != 0x00)
        {   
                TimingDelay--; 
        }
}


      以上,即定義配置好了Systick定時(shí)器,。如何使用呢,?
很簡(jiǎn)單。
        Delay_ms(500);  即為延時(shí)500ms,。


       當(dāng)然,,使用前,,請(qǐng)先初始化:
SysTick_Init(),;
       否則無(wú)法使用并影響后續(xù)的程序運(yùn)行,,這個(gè)很重要,,就像打開(kāi)了串口中斷,,你不清標(biāo)志位,,也同樣在接收字符后,,CPU中斷在那里,,而不能繼續(xù)執(zhí)行!,。使用外設(shè)功能,,需要初始化,!


以上基本講完了。主要是加入了自己的理解,。

以下為搜索的一些其他理解,。

SysTick_Config(SystemFrequency / 10)   函數(shù)的形參就是systick重裝定時(shí)器的值,。

systck計(jì)數(shù)頻率為每秒72000000次,,所以7200000次就是1/10秒,,也就是100ms,。


SysTick是1個(gè)24bit遞減計(jì)數(shù)器,通過(guò)對(duì)SysTick控制與狀態(tài)寄存器的設(shè)置,,可選擇HCLK時(shí)鐘(72M)或HCLK的8分頻(9M,缺省是這個(gè))作為SysTick的時(shí)鐘源,。
SysTick的重裝寄存器決定了定時(shí)器頻率,。


若SysTick的時(shí)鐘源是72M,   SystemFrequency = 72000000Hz
所以 SysTick_Config(SystemFrequency / 1000); 就是1ms時(shí)基,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶(hù)發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多