簡要說明
1概述
嘀嗒時鐘(SysTick)是一個簡單的系統(tǒng)時鐘節(jié)拍計數(shù)器,它屬于Cortex-M4內(nèi)核嵌套向量中斷控制器(NVIC)里的一個功能單元。他是一個24位的倒計時定時器(在NVIC中),當systick計數(shù)值到0的時候,SysTick重裝載寄存器就會自動重新裝載初值。只要SysTick控制和狀態(tài)寄存器(CTRL)中的使能位沒有ENABLE清除掉,那么就會永遠的執(zhí)行下去。
SysTick定時器被捆綁在NVIC中,可產(chǎn)生SysTick異常(異常號:15),屬于Cortex-M4內(nèi)核里的一個功能單元。
SysTick常作為系統(tǒng)節(jié)拍定時器用于操作系統(tǒng)(如mCOS-Ⅱ、FreeRTOS等)的系統(tǒng)節(jié)拍定時,從而推動任務和時間的管理。
SysTick的最大使命,就是作為系統(tǒng)的時基定期地產(chǎn)生異常請求。
在不采用操作系統(tǒng)的情況下,完全可以作為通用定時器、計數(shù)器使用的。
下圖是SysTick控制控制和狀態(tài)寄存器描述,(地址:0xe000e010)
SysTick 控制及狀態(tài)寄存器:
SysTick 寄存器:
SysTick 重裝載數(shù)值寄存器:地址 0XE000E014
特別注意:計數(shù)最大值是)0XFFFFFF,在設置重裝在值得時候不能大于這個。
SYSTick當前數(shù)值寄存器(VAL),地址:0XE000E018
畢業(yè)寄語:
畢業(yè),是一首離別的歌,更是青年成長的里程碑。四年的時光一千多日夜就這樣瞬息即過,但它卻是你們的瑰麗人生中最濃麗的一抹色彩!如一條條的小溪匯成了一條多彩的河流。你們成了校園里最靚麗的一道風景。
SYSTick校準數(shù)值寄存器(VAL),地址:0XE000E018
配置SysTick作為時鐘基準,主要通過對SysTick控制與狀態(tài)寄存器、SysTick重裝載數(shù)值寄存器和SysTick當前數(shù)值寄存器三個寄存器進行初始化。需要配置的內(nèi)容如下:
① SysTick時鐘源選擇。
② 異常請求設置。
③ SysTick時鐘使能。
④ 初始化SysTick重裝數(shù)值。
⑤ 清零SysTick當前數(shù)值寄存器。
庫函數(shù)
SysTick的庫函數(shù)
1、SysTick寄存器結構體類型
/** \\brief Structure type to access the System Timer (SysTick).
*/
typedef struct
{
__IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */
__IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */
__IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */
__I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */
} SysTick_Type;
2、SysTick時鐘源初始化函數(shù)
/**
- @brief Configures the SysTick clock source.
- @param SysTick_CLKSource: specifies the SysTick clock source.
- This parameter can be one of the following values:
-
@arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source.
-
@arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source.
- @retval None
*/
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
/* Check the parameters */
assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
{
SysTick->CTRL |= SysTick_CLKSource_HCLK;
}
else
{
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
}
}
SysTick_CLKSourceConfig函數(shù)被定義在misc.c文件中,配置的是SysTick控制與狀態(tài)寄存器中的位2。
設置為0:選擇使用HCLK/8作為時鐘源。
設置為1:選擇使用HCLK作為時鐘源。
在實際使用的過程中參數(shù)宏在misc.h文件里面。
#define SysTick_CLKSource_HCLK_Div8((uint32_t)0xFFFFFFFB)
#define SysTick_CLKSource_HCLK ((uint32_t)0x00000004)
3、SysTick配置函數(shù)
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = ticks - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}
SysTick_Config函數(shù)被定義在core_cm3.h文件中,它的功能是初始化并開啟SysTick計數(shù)器及其中斷,輸入參數(shù)ticks是兩次中斷間的ticks數(shù)值。通過次函數(shù)可以初始化系統(tǒng)嘀嗒定時器及其中斷并開啟系統(tǒng)嘀嗒定時器在自由運行模式下以產(chǎn)生周期中斷。
SysTick異常服務函數(shù)
void SysTick_Handler(void)
SysTick_Handler的服務函數(shù)已在啟動文件中定義過,并定義了[WEAK]屬性,函數(shù)內(nèi)執(zhí)行的是空循環(huán)。
這就要求用戶在使用SysTick異常服務時,需要在啟動文件之外的其他文件重新定義服務程序,并且其函數(shù)名要和啟動文件中的函數(shù)名保持一致,只有這樣才能在編譯階段,將重定義的服務程序函數(shù)入口地址替換到SysTick在異常/中斷向量表的位置。
應用小栗子
01應用實例
使用SysTick產(chǎn)生1s的定時,控制LED燈以2s為周期進行閃爍。
假設HCLK=180MHz。
在system_stm32f4xx.c文件中定義了全局變量uint32_t SystemCoreClock=180000000,并在頭文件system_stm32f4xx.c->stm32f4xx.h中聲明。
1-配置SysTick
按照1ms進行分片,配置程序如下:
SysTick_Config(SystemCoreClock/1000);
這樣,SysTick會每1ms產(chǎn)生一次異常請求。全局變量定義:
volatile uint32_tTimingDelay;
volatile防止變量TimingDelay在使用過程中被優(yōu)化
2-寫延時函數(shù)
編寫以1ms為計時基準的函數(shù):
void delay_ms(uint32_t nTime)
{
TimingDelay=nTime;
while(TimingDelay!=0);
}
其中,nTime是需要計時的ms數(shù)。
3-寫中斷服務函數(shù)
每1ms SysTick都會產(chǎn)生一次異常請求,執(zhí)行其異常服務程序SysTick_Handler。對SysTick異常服務程序進行編寫,每1ms對變量TimingDelay減1次。
void SysTick_Handler(void)
{
if (TimingDelay!=0)
{
TimingDelay--;
}
}
4-應用
int main(void)
{
/*配置SysTick為每1ms異常一次*/
if (SysTick_Config(SystemCoreClock/1000))
{
/*SystemCoreClock/1000超出計數(shù)最大值時報錯,程序陷入空循環(huán)*/
while (1);
}
/*初始化LED燈的GPIO*/
LED_Config ();
while (1)
{
/*反轉LED燈狀態(tài)*/
LED_TOGGLE;
/*延時1s*/
delay_ms (1000);
}
-
寄存器
+關注
關注
31文章
5355瀏覽量
120504 -
STM32
+關注
關注
2270文章
10904瀏覽量
356318 -
定時器
+關注
關注
23文章
3250瀏覽量
114910 -
Systick
+關注
關注
0文章
62瀏覽量
13110
發(fā)布評論請先 登錄
相關推薦
評論