一、概述:
SysTick是一個簡單的遞減24位計數器。如果你不需要再應用程序中嵌入操作系統,SysTick可以作為簡單的延時和產生周期性的中斷。
狀態控制寄存器的第0位可以使能計數器,當前值寄存器隨著時鐘一直遞減,當他減到0的時候,重裝載寄存器就會重新裝載這只的值,計數器繼續從這個值遞減。
二、相關寄存器:
2.1SysTick->CTRL 狀態和控制寄存器
位16:當前值寄存器遞減到0,位16置1
位2:時鐘源選擇位,0:使用外部參考時鐘;1:使用內核時鐘
位1:使能SysTick中斷,當前值寄存器遞減到0時產生中斷
位0:SysTick時鐘使能
2.2SysTick->LOAD 重裝載值寄存器
當前值寄存器為0時,自動將重裝載值重裝到當前值計數器,重裝載值的大小需要自己設置。
2.3 SysTick->VAL當前值寄存器
可讀可寫,當計數器使能時,這個寄存器的值開始遞減,使用前后注意清零。
三、SysTick邏輯圖
四、時鐘頻率與延時
4.1時鐘選擇采用參考8分頻的參考時鐘比較準,所以此處SysTick計數器選擇21M的時鐘。
4.2如何延時1us時鐘頻率為21M,也就是1s的時間技術21M次。由此可知計數一次用了 (1/21000000)s ,用了(1/21000)ms, 用了(1/21) us,所以,1us計數21次。
4.3如何延時1ms因為1ms = 1000us,所以綜上所述,1ms計數1000*21次計數,1ms也就是21000次計數
4.4最大延時24位計數器能保存的最大值 : 16777215。最大延時時間=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分頻時鐘 SysTick->CTRL &= ~(1 << 0); //關閉計數器}void delay_us(u32 num){ SysTick->LOAD = num * Value_us; SysTick->VAL = 0; SysTick->CTRL |= (1 << 0); //使能計數器 while (!(SysTick->CTRL & 1<<16)); //判斷是否計數完畢 SysTick->VAL = 0; SysTick->CTRL &= ~(1 << 0); //關閉計數器 }void delay_ms(u32 num){ SysTick->LOAD = num * Value_ms; SysTick->VAL = 0; SysTick->CTRL |= (1 << 0); //使能計數器 while (!(SysTick->CTRL & 1<<16)); SysTick->VAL = 0; SysTick->CTRL &= ~(1 << 0); //關閉計數器 }
-
寄存器
+關注
關注
31文章
5396瀏覽量
122459 -
STM32
+關注
關注
2281文章
10976瀏覽量
360734 -
計數器
+關注
關注
32文章
2279瀏覽量
95754
發布評論請先 登錄
相關推薦
SysTick的定義與相關寄存器詳解
SysTick寄存器介紹
STM32F103:精準延時delay——SysTick使用

帶你模仿正點原子編程風格到深入學習寄存器并手把手編寫STM32F103寄存器程序(SYSTICK滴答時鐘之delay延時)

stm32是如何將寄存器值通過標準庫寫入寄存器的?

[學習筆記]STM32F1 SYSTICK 滴答定時器(寄存器、標準庫、HAL庫)
![[學習筆記]<b class='flag-5'>STM32</b>F1 <b class='flag-5'>SYSTICK</b> 滴答定時<b class='flag-5'>器</b>(<b class='flag-5'>寄存器</b>、標準庫、HAL庫)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論