4.1 SysTick概述
Cortex-M3內核的處理器,內部包含了一個SysTick定時器,SysTick是一個24位的倒計數定時器,當計數到0時,將從ReLoad寄存器中自動重裝載定時初值,開始新一輪計數。只要不把它在SysTick控制及狀態寄存器中的使能位清除,就永不停息。
SysTick定時器能產生中斷,CM3為它專門開出一個異常類型,并且在向量表中有它的一席之地。它使操作系統和其它系統軟件在CM3器件間的移植變得簡單多了,因為在所有CM3產品間對其處理都是相同的。
我們在程序中使用SysTick時鐘來作為延時函數,這樣就不會占用定時器資源,SysTick時鐘是一個直接掛載在AHB總線上的一個定時器,輸入的時鐘頻率直接就是AHB總線上的時鐘頻率,使用SysTick定時器進行延時,可以精確的設置延時時間,與之前51單片機的for循環累加的精度是完全不一樣的。
4.2 相關寄存器
4.2.1 控制及狀態寄存器CTRL
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| - | flag | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| - | CLK | IRQ | EN |
Bit 16:計數狀態(只讀)
0:該位數據已經被讀走
1:上次讀取到該位的數據后,計數值達到了0
Bit 2:時鐘源選擇
0:外部時鐘源
1:內核時鐘
Bit 1:中斷標志位
0:計數到0不產生中斷
1:計數到0產生SysTick中斷
Bit 0:定時器使能位
0:關閉定時器
1:開啟定時器
4.2.2 重裝載數值寄存器LOAD
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| - | ReLoad[7:0] | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| ReLoad[15:0] |
ReLoad[23:0]:當計數到0后,該寄存器的數據自動更新到VAL中。
4.2.3 當前數值寄存器VAL
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| - | VAL[7:0] | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| VAL[15:0] |
VAL[23:0]:讀取時返回當前倒計數的值,寫它:清零,同時還會清除在SysTick控制及狀態寄存器中的flag標志。
4.2.4 校準值寄存器CALIB
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| REF | flag | - | TENMS[7:0] | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| TENMS[15:0] |
Bit 31:外部參考時鐘可用標志
0:外部參考時鐘可用
1:外部參考時鐘不可用
Bit 30:校準值10ms標志
0:校準是準確的10ms
1:校準不是準確的10ms
Bit 23~Bit 0:10ms的時間內倒計數的格數。若該值讀回零,則表示無法使用校準功能
4.3 SysTick驅動函數
4.3.1 創建目錄
(1)在SYSTEM目錄下創建delay文件夾,并創建delay.c和delay.h文件。如下圖所示。


(2)將delay.c添加進工程,delay.h添加進程序。


(3)在delay.h文件中輸入如下內容。

(4)底層寄存器文件添加寄存器組

(5)底層寄存器文件添加基礎地址

4.3.2 初始化

這里首先選擇外部時鐘源,由于系統時鐘72MHz,并且SYSTICK時鐘固定位系統時鐘的1/8,所以1us的計數脈沖實際是72/8,也就是9個脈沖才是1us,這個1us的脈沖數就是基礎時鐘。
4.3.3 us級別延時函數

4.3.4 ms級別延時函數

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
處理器
+關注
關注
68文章
20255瀏覽量
252299 -
定時器
+關注
關注
23文章
3368瀏覽量
123628 -
Systick
+關注
關注
0文章
67瀏覽量
13969
發布評論請先 登錄
相關推薦
熱點推薦
請問TM4C123的systick時鐘如何使用
我想使用TM4C123的滴答時鐘系統,但是發現找到的systick時鐘的相關函數,但是我不知道計數值的對應關系#if defined(TARGET_IS_TM4C123_RA1
發表于 08-14 06:12
SysTick時鐘是指外部8M時鐘還是PLL倍頻后的系統時鐘?
SysTick->CTRL|=0xfffffffb;//設置外部時鐘作為SysTick時鐘這個是把外部時鐘設置為
發表于 06-18 09:00
使用FreeRTOS時Systick時鐘的配置分享
FreeRTOS按照教程移植好之后就可以使用了。需要注意的是從官網下載的針對keil環境下STM32F103的FreeRTOS文件,使用systick時鐘作為rtos的時鐘,而這個systic
發表于 07-30 11:39
STM32的SysTick時鐘源是來自Cortex系統定時器嗎
置頂/星標公眾號,不錯過每一條消息!有位朋友在后臺大概問了這樣一個問題:STM32的SysTick時鐘源是來自Cortex系統定時器嗎?引伸:為什么ST...
發表于 08-19 08:19
SYSTICK的時鐘固定為HCLK時鐘的1/8
delay函數static u8fac_us=0;//us延時倍乘數static u16 fac_ms=0;//ms延時倍乘數//初始化延遲函數//SYSTICK的時鐘固定為HCLK時鐘的1/8
發表于 08-19 07:22
STM32的SysTick時鐘源
有位朋友在后臺大概問了這樣一個問題:STM32的SysTick時鐘源是來自Cortex系統定時器嗎?引伸:為什么STM32CubeMX中Cortex系統定時器可選擇1分頻(和8分頻)?1寫在前面看到
發表于 08-19 06:47
STM32的SysTick時鐘源是來自Cortex系統定時器嗎
STM32的SysTick時鐘源是來自Cortex系統定時器嗎?為什么STM32CubeMX中Cortex系統定時器可選擇1分頻(和8分頻)?
發表于 11-24 07:24
SysTick時鐘簡介
。不過,STCLK 的具體來源則由芯片設計者決定,因此不同產品之間的時鐘頻率可能會大不相同,你需要查找芯片的器件手冊來決定選擇什么作為時鐘源。Cortex-M3 的內核中包含一個 SysTick
發表于 02-18 07:53
CH579M的SysTick時鐘如何設置?
當系統嘀嗒時鐘設定為 32MHz,系統嘀嗒校準值固定為 32000,將產生 1mS 時間基準。(SysTick時鐘如何設置,沒有找到設置的函數)
發表于 08-25 07:33
STM32的SysTick時鐘源是來自Cortex系統定時器嗎?
初始化調用這段代碼之后,SysTick將會實現1ms中斷一次。這段代碼實現1ms中斷一次相信大家都能理解,但是這里SysTick初始化和上面說的時鐘『/8』有關系嗎?
STM32入門學習筆記之SysTick時鐘
Cortex-M3內核的處理器,內部包含了一個SysTick定時器,SysTick是一個24位的倒計數定時器,當計數到0時,將從ReLoad寄存器中自動重裝載定時初值,開始新一輪計數。只要不把它在SysTick控制及狀態寄存器中
SysTick時鐘
評論