計框架)
SysTick 是 Cortex-M 內(nèi)核提供的24 位向下計數(shù)定時器。配置好計數(shù)周期后硬件周期性請求中斷CPU 進入SysTick_Handler()我們在其中實現(xiàn)軟件計時。1. 設(shè)計思路先確定中斷周期再累計次數(shù)以“LED 每隔 1 秒翻轉(zhuǎn)一次”為例SysTick 每 1 ms 中斷一次 ↓ 軟件計數(shù)加 1 ↓ 主程序發(fā)現(xiàn)經(jīng)過 1000 ms ↓ 翻轉(zhuǎn) LED這樣中斷只負責(zé)提供時間基準主程序負責(zé)具體任務(wù)。2. 如何計算中斷周期選擇 HCLK 作為 SysTick 時鐘時ticks HCLK頻率 × 期望周期秒 LOAD ticks - 1 中斷周期 (LOAD 1) / HCLK頻率假設(shè) HCLK 為 168 MHz需要每 1 ms 中斷一次ticks 168,000,000 × 0.001 168000 LOAD 167999使用庫函數(shù)SysTick_Config(SystemCoreClock / 1000U);常用配置配置參數(shù)中斷周期SystemCoreClock / 10001 msSystemCoreClock / 10000010 μsSystemCoreClock / 10000001 μs前提是SystemCoreClock與實際 HCLK 一致不能整除時存在取整誤差。3. 初始化配置了什么SysTick_Config(ticks)主要完成以下操作SysTick-LOAD ticks - 1U; // 設(shè)置計數(shù)周期 SysTick-VAL 0U; // 清除當(dāng)前計數(shù)值 // 設(shè)置中斷優(yōu)先級 NVIC_SetPriority(SysTick_IRQn, 15U); // 選擇時鐘、允許中斷、啟動計數(shù)器 SysTick-CTRL SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;CTRL的低三位分別控制位設(shè)置為 1 的作用CLKSOURCE第 2 位選擇 HCLKTICKINT第 1 位允許計數(shù)到 0 時請求中斷ENABLE第 0 位啟動計數(shù)器選擇 HCLK 不會改變 HCLK 的頻率系統(tǒng)時鐘需要提前配置。4. 推薦框架中斷計時主循環(huán)處理任務(wù)下面以 STM32F407 為例。假設(shè)工程已經(jīng)提供時鐘配置、LED 初始化和翻轉(zhuǎn)函數(shù)并由本示例獨立使用 SysTick。#include stm32f4xx.h static volatile uint32_t system_ms 0; // 初始化每 1 ms 請求一次中斷 void SysTick_Init(void) { if (SysTick_Config(SystemCoreClock / 1000U) ! 0U) { while (1) { // 配置參數(shù)超出范圍 } } } // 中斷只更新時間 void SysTick_Handler(void) { system_ms; } int main(void) { SystemClock_Config(); LED_GPIO_Config(); SysTick_Init(); uint32_t last_ms system_ms; while (1) { uint32_t now system_ms; if ((uint32_t)(now - last_ms) 1000U) { last_ms now; LED_Toggle(); // 使用工程實際的 LED 翻轉(zhuǎn)函數(shù) } // 這里可以繼續(xù)處理其他任務(wù) } }這個框架沒有空循環(huán)等待延時主程序可以繼續(xù)執(zhí)行其他任務(wù)。LED 每秒翻轉(zhuǎn)一次完整亮滅周期約為 2 秒。5. 必須記住的重點硬件計數(shù)和軟件計數(shù)不同LOAD決定一次中斷隔多久system_ms累計中斷次數(shù)。LOAD ticks - 1計算周期時使用LOAD 1。共享計時變量使用volatile保證主程序讀取中斷更新后的值。中斷函數(shù)保持簡短更新時間或置標志具體任務(wù)放在主循環(huán)。不要在中斷里等待 SysTick 延時如果 SysTick 無法搶占當(dāng)前中斷可能一直等待。周期按需求選擇LED 等毫秒級任務(wù)使用 1 ms 節(jié)拍即可過于頻繁的中斷會增加 CPU 開銷。24 位限制ticks最大為22?168 MHz 下最大單次周期約 99.86 ms更長時間用軟件累計。HAL 工程注意已有 SysTick通常已經(jīng)用于 1 ms 系統(tǒng)節(jié)拍應(yīng)在現(xiàn)有框架中擴展并保留HAL_IncTick()等必要處理。