簡(jiǎn)要說明
1概述
嘀嗒時(shí)鐘(SysTick)是一個(gè)簡(jiǎn)單的系統(tǒng)時(shí)鐘節(jié)拍計(jì)數(shù)器,它屬于Cortex-M4內(nèi)核嵌套向量中斷控制器(NVIC)里的一個(gè)功能單元。他是一個(gè)24位的倒計(jì)時(shí)定時(shí)器(在NVIC中),當(dāng)systick計(jì)數(shù)值到0的時(shí)候,SysTick重裝載寄存器就會(huì)自動(dòng)重新裝載初值。只要SysTick控制和狀態(tài)寄存器(CTRL)中的使能位沒有ENABLE清除掉,那么就會(huì)永遠(yuǎn)的執(zhí)行下去。
SysTick定時(shí)器被捆綁在NVIC中,可產(chǎn)生SysTick異常(異常號(hào):15),屬于Cortex-M4內(nèi)核里的一個(gè)功能單元。
SysTick常作為系統(tǒng)節(jié)拍定時(shí)器用于操作系統(tǒng)(如mCOS-Ⅱ、FreeRTOS等)的系統(tǒng)節(jié)拍定時(shí),從而推動(dòng)任務(wù)和時(shí)間的管理。
SysTick的最大使命,就是作為系統(tǒng)的時(shí)基定期地產(chǎn)生異常請(qǐng)求。
在不采用操作系統(tǒng)的情況下,完全可以作為通用定時(shí)器、計(jì)數(shù)器使用的。
下圖是SysTick控制控制和狀態(tài)寄存器描述,(地址:0xe000e010)
SysTick 控制及狀態(tài)寄存器:
SysTick 寄存器:
SysTick 重裝載數(shù)值寄存器:地址 0XE000E014
特別注意:計(jì)數(shù)最大值是)0XFFFFFF,在設(shè)置重裝在值得時(shí)候不能大于這個(gè)。
SYSTick當(dāng)前數(shù)值寄存器(VAL),地址:0XE000E018
畢業(yè)寄語(yǔ):
畢業(yè),是一首離別的歌,更是青年成長(zhǎng)的里程碑。四年的時(shí)光一千多日夜就這樣瞬息即過,但它卻是你們的瑰麗人生中最濃麗的一抹色彩!如一條條的小溪匯成了一條多彩的河流。你們成了校園里最靚麗的一道風(fēng)景。
SYSTick校準(zhǔn)數(shù)值寄存器(VAL),地址:0XE000E018
配置SysTick作為時(shí)鐘基準(zhǔn),主要通過對(duì)SysTick控制與狀態(tài)寄存器、SysTick重裝載數(shù)值寄存器和SysTick當(dāng)前數(shù)值寄存器三個(gè)寄存器進(jìn)行初始化。需要配置的內(nèi)容如下:
① SysTick時(shí)鐘源選擇。
② 異常請(qǐng)求設(shè)置。
③ SysTick時(shí)鐘使能。
④ 初始化SysTick重裝數(shù)值。
⑤ 清零SysTick當(dāng)前數(shù)值寄存器。
庫(kù)函數(shù)
SysTick的庫(kù)函數(shù)
1、SysTick寄存器結(jié)構(gòu)體類型
/** \\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í)鐘源初始化函數(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。
設(shè)置為0:選擇使用HCLK/8作為時(shí)鐘源。
設(shè)置為1:選擇使用HCLK作為時(shí)鐘源。
在實(shí)際使用的過程中參數(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計(jì)數(shù)器及其中斷,輸入參數(shù)ticks是兩次中斷間的ticks數(shù)值。通過次函數(shù)可以初始化系統(tǒng)嘀嗒定時(shí)器及其中斷并開啟系統(tǒng)嘀嗒定時(shí)器在自由運(yùn)行模式下以產(chǎn)生周期中斷。
SysTick異常服務(wù)函數(shù)
void SysTick_Handler(void)
SysTick_Handler的服務(wù)函數(shù)已在啟動(dòng)文件中定義過,并定義了[WEAK]屬性,函數(shù)內(nèi)執(zhí)行的是空循環(huán)。
這就要求用戶在使用SysTick異常服務(wù)時(shí),需要在啟動(dòng)文件之外的其他文件重新定義服務(wù)程序,并且其函數(shù)名要和啟動(dòng)文件中的函數(shù)名保持一致,只有這樣才能在編譯階段,將重定義的服務(wù)程序函數(shù)入口地址替換到SysTick在異常/中斷向量表的位置。
應(yīng)用小栗子
01應(yīng)用實(shí)例
使用SysTick產(chǎn)生1s的定時(shí),控制LED燈以2s為周期進(jìn)行閃爍。
假設(shè)HCLK=180MHz。
在system_stm32f4xx.c文件中定義了全局變量uint32_t SystemCoreClock=180000000,并在頭文件system_stm32f4xx.c->stm32f4xx.h中聲明。
1-配置SysTick
按照1ms進(jìn)行分片,配置程序如下:
SysTick_Config(SystemCoreClock/1000);
這樣,SysTick會(huì)每1ms產(chǎn)生一次異常請(qǐng)求。全局變量定義:
volatile uint32_tTimingDelay;
volatile防止變量TimingDelay在使用過程中被優(yōu)化
2-寫延時(shí)函數(shù)
編寫以1ms為計(jì)時(shí)基準(zhǔn)的函數(shù):
void delay_ms(uint32_t nTime)
{
TimingDelay=nTime;
while(TimingDelay!=0);
}
其中,nTime是需要計(jì)時(shí)的ms數(shù)。
3-寫中斷服務(wù)函數(shù)
每1ms SysTick都會(huì)產(chǎn)生一次異常請(qǐng)求,執(zhí)行其異常服務(wù)程序SysTick_Handler。對(duì)SysTick異常服務(wù)程序進(jìn)行編寫,每1ms對(duì)變量TimingDelay減1次。
void SysTick_Handler(void)
{
if (TimingDelay!=0)
{
TimingDelay--;
}
}
4-應(yīng)用
int main(void)
{
/*配置SysTick為每1ms異常一次*/
if (SysTick_Config(SystemCoreClock/1000))
{
/*SystemCoreClock/1000超出計(jì)數(shù)最大值時(shí)報(bào)錯(cuò),程序陷入空循環(huán)*/
while (1);
}
/*初始化LED燈的GPIO*/
LED_Config ();
while (1)
{
/*反轉(zhuǎn)LED燈狀態(tài)*/
LED_TOGGLE;
/*延時(shí)1s*/
delay_ms (1000);
}
-
寄存器
+關(guān)注
關(guān)注
31文章
5359瀏覽量
120792 -
STM32
+關(guān)注
關(guān)注
2270文章
10915瀏覽量
356751 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3254瀏覽量
115070 -
Systick
+關(guān)注
關(guān)注
0文章
62瀏覽量
13124
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論