24bit 的向下遞減計數器,計數器每計數一次的時間是 1/SYSCLK,一般設置 SYSTICK 為168MHz(以STM32F407為例); 當重裝載數值寄存器的值遞減到0的時候,系統定時器就產生一次中斷,以此循環往復; 一般用于產生時基,維持系統心跳 CTRL 寄存器 bit[2] CLKSOURCE, 時鐘源選擇,0-AHB/8,1-AHB bit[1] TICKINIT, 1-SysTick倒計數到0時產生異常請求(即中斷) bit[0] ENABLE,1-使能 RELOAD 重裝載值寄存器 當計數到0時,重新裝載到數值寄存器的值 SysTick 屬于內核外設,跟普通外設的中斷優先級有些區別,并沒有搶占優先級和子優先級的說法; // System Tick Configuration, The function initializes the System Timer and its interrupt, and starts the System Tick Timer. // param [in] ticks Number of ticks between two interrupts. __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) { // 參數檢查,重載值最大是24位 if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL); } /* set reload register */ SysTick->LOAD = (uint32_t)(ticks - 1UL); NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* Load the SysTick Counter Value */ SysTick->VAL = 0UL; // 時鐘源選擇 AHB 168MHz,計數到0時產生中斷,使能系統定時器 SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; return (0UL); } SysTick 初始化函數 如下代碼,配置 ticks 為 SystemCoreClock / 1000,即 168K,即計數168K次時,產生一次中斷; 而計數一次的時間是:1/CLKAHB,即 1/168M 秒,所以計數168K次用時 1ms,意即 每ms產生一次 SysTick 中斷; 在 SysTick 中斷處理函數中可以累加經過的 毫秒值,從而達到記錄時間的目的;Systick 簡介
SysTick 寄存器講解
寄存器 功能 CTRL 控制及狀態寄存器 LOAD 重裝載數值寄存器 VAL 當前數值寄存器 CALIB 校準數值寄存器 bit[23~0] 低24位有效
VAL 當前數值寄存器
SysTick 配置庫函數
用庫函數編程時,我們只需要使用 SysTick_Config() 進行配置即可,函數如下,在 cm4.h 文件中:void SysTick_Init(void){
/* SystemFrequency / 1000 1ms中斷一次
* SystemFrequency / 100000 10us中斷一次
* SystemFrequency / 1000000 1us中斷一次
*/
if (SysTick_Config(SystemCoreClock / 1000))
{
/* Capture error */
while (1);
}}
延時函數 和 SysTick 中斷處理函數
static __IO u32 TimingDelay;void delay_ms(__IO u32 nTime){
TimingDelay = nTime;
while (TimingDelay != 0);}void TimingDelay_Decrement(void){
if (TimingDelay != 0x00)
{
TimingDelay--;
}}void SysTick_Handler(void){
TimingDelay_Decrement();}
上一篇:STM32學習(三)串口實驗
下一篇:stm32 freertos 任務不能調度(啟動)可能原因
推薦閱讀最新更新時間:2025-04-23 19:57



