一、概述:
SysTick是一個(gè)簡單的遞減24位計(jì)數(shù)器。如果你不需要再應(yīng)用程序中嵌入操作系統(tǒng),SysTick可以作為簡單的延時(shí)和產(chǎn)生周期性的中斷。
狀態(tài)控制寄存器的第0位可以使能計(jì)數(shù)器,當(dāng)前值寄存器隨著時(shí)鐘一直遞減,當(dāng)他減到0的時(shí)候,重裝載寄存器就會(huì)重新裝載這只的值,計(jì)數(shù)器繼續(xù)從這個(gè)值遞減。
二、相關(guān)寄存器:
2.1SysTick->CTRL 狀態(tài)和控制寄存器
位16:當(dāng)前值寄存器遞減到0,位16置1
位2:時(shí)鐘源選擇位,0:使用外部參考時(shí)鐘;1:使用內(nèi)核時(shí)鐘
位1:使能SysTick中斷,當(dāng)前值寄存器遞減到0時(shí)產(chǎn)生中斷
位0:SysTick時(shí)鐘使能
2.2SysTick->LOAD 重裝載值寄存器
當(dāng)前值寄存器為0時(shí),自動(dòng)將重裝載值重裝到當(dāng)前值計(jì)數(shù)器,重裝載值的大小需要自己設(shè)置。
2.3 SysTick->VAL當(dāng)前值寄存器
可讀可寫,當(dāng)計(jì)數(shù)器使能時(shí),這個(gè)寄存器的值開始遞減,使用前后注意清零。
三、SysTick邏輯圖
四、時(shí)鐘頻率與延時(shí)
4.1時(shí)鐘選擇采用參考8分頻的參考時(shí)鐘比較準(zhǔn),所以此處SysTick計(jì)數(shù)器選擇21M的時(shí)鐘。
4.2如何延時(shí)1us時(shí)鐘頻率為21M,也就是1s的時(shí)間技術(shù)21M次。由此可知計(jì)數(shù)一次用了 (1/21000000)s ,用了(1/21000)ms, 用了(1/21) us,所以,1us計(jì)數(shù)21次。
4.3如何延時(shí)1ms因?yàn)?ms = 1000us,所以綜上所述,1ms計(jì)數(shù)1000*21次計(jì)數(shù),1ms也就是21000次計(jì)數(shù)
4.4最大延時(shí)24位計(jì)數(shù)器能保存的最大值 : 16777215。最大延時(shí)時(shí)間=16777215 /21=798915us=798.915ms
五、示例代碼
#include "delay.h"
#define Value_us 21#define Value_ms 21000
void delay_init(void){ SysTick->CTRL &= (1 << 2); //控制寄存器位2置0,選擇8分頻時(shí)鐘 SysTick->CTRL &= ~(1 << 0); //關(guān)閉計(jì)數(shù)器}void delay_us(u32 num){ SysTick->LOAD = num * Value_us; SysTick->VAL = 0; SysTick->CTRL |= (1 << 0); //使能計(jì)數(shù)器 while (!(SysTick->CTRL & 1<<16)); //判斷是否計(jì)數(shù)完畢 SysTick->VAL = 0; SysTick->CTRL &= ~(1 << 0); //關(guān)閉計(jì)數(shù)器 }void delay_ms(u32 num){ SysTick->LOAD = num * Value_ms; SysTick->VAL = 0; SysTick->CTRL |= (1 << 0); //使能計(jì)數(shù)器 while (!(SysTick->CTRL & 1<<16)); SysTick->VAL = 0; SysTick->CTRL &= ~(1 << 0); //關(guān)閉計(jì)數(shù)器 }
-
寄存器
+關(guān)注
關(guān)注
31文章
5294瀏覽量
119814 -
STM32
+關(guān)注
關(guān)注
2264文章
10854瀏覽量
354289 -
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2253瀏覽量
94278
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論