上來(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的重裝寄存器決定了定時(shí)器頻率,。 若SysTick的時(shí)鐘源是72M, SystemFrequency = 72000000Hz 所以 SysTick_Config(SystemFrequency / 1000); 就是1ms時(shí)基,。 |
|
來(lái)自: SDNUC > 《ARM(STM32)》