SysTick 淺談
摘要:本章主要介紹SysTick系統定時器的基本原理,然后實作了毫秒定時器
1. SysTick Timer (STK)系統定時器,是CM3 內核的外設,內嵌在 NVIC 中,系統定時器 是一個 24bit 的向下遞減的計數器,計數器每計數一次的時間為 1/SYSCLK,一般我們設定 系統時鐘 SYSCLK 等于 72M,當重裝載數值暫存器的值遞減到 0 的時候,系統定時器就產 生一次中斷,以此回圈往復, 因為 SysTick 是屬于 CM3 內核的外設,所以所有基于 CM3 內核的單片機都具有這個 系統定時器,使得軟體在 CM3 單片機中可以很容易的移植,系統定時器一般用于作業系統, 用于產生時基,維持作業系統的心跳,
2. SysTick 暫存器
SysTick—系統定時器有 4 個暫存器,簡要介紹如下,在使用 SysTick 產生定時的時候, 只需要配置前三個暫存器,最后一個校準暫存器不需要使用,
SysTick 暫存器匯總
| 暫存器名稱 | 暫存器描述 |
| CTRL | SysTick 控制及狀態暫存器 |
| LOAD | SysTick 重裝載數值暫存器 |
| VAL | SysTick 當前數值暫存器 |
| CALIB | SysTick 校準數值暫存器 |
下面列舉了每個暫存器的詳細描述:



![]()

3. SysTick 定時實驗
實驗目的:使用SysTick產生1s的時間基準,LED每隔1s閃爍一次
編程要點:
1.使用韌體庫編程,設定多載暫存器的值
uint32_t TimingDelay = 0;
/**
* @brief 啟動系統滴答定時器 SysTick
* @param 無
* @retval 無
*/
void SysTick_Init(void)
{
/* SystemFrequency / 1000 1ms 中斷一次
* SystemFrequency / 100000 10us 中斷一次
* SystemFrequency / 1000000 1us 中斷一次
*/
if (SysTick_Config(SystemCoreClock / 100000)) {
/* Capture error */
while (1);
}
}
/**
* @brief us 延時程式,10us 為一個單位
* @param
* @arg nTime: Delay_us( 1 ) 則實作的延時為 1 * 10us = 10us
* @retval 無
*/
void Delay_us(__IO uint32_t nTime)
{
TimingDelay = nTime;
while (TimingDelay != 0);
}
/**
* @brief 獲取節拍程式
* @param 無
* @retval 無
* @attention 在 SysTick 中斷函式 SysTick_Handler()呼叫
*/
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00) {
TimingDelay--;
}
}
2. 實作中斷服務函式 SysTick_Handler
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
3. 在main函式中實作LED延時亮滅
/* LED 埠初始化 */
LED_GPIO_Config();
/* 配置 SysTick 為 10us 中斷一次,時間到后觸發定時中斷,
*進入 stm32fxx_it.c 檔案的 SysTick_Handler 處理,通過數中斷次數計時
*/
SysTick_Init();
while (1) {
LED1_ON;
Delay_us(100000); // 100000 * 10us = 1000ms
LED1_OFF;
LED2_ON;
Delay_us(100000); // 100000 * 10us = 1000ms
LED2_OFF;
LED3_ON;
Delay_us(100000); // 100000 * 10us = 1000ms
LED3_OFF;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/252125.html
標籤:其他
下一篇:二維字串 hash
