Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

STM32 定時器時間計算全攻略:從 SysTick 到通用定時器 TIMx 參數配置

編輯:Linux 教學

STM32 定時器家族龐大(SysTick、基礎/通用/高級定時器),掌握統一的時間計算公式與配置流程,能讓延時、PWM、輸入捕獲等應用一把抓準。本文梳理核心公式、時鐘源分佈、常見陷阱與工程化配置範本。

核心計算公式(通用定時器 TIM2~TIM7、TIM9~TIM14)

更新事件頻率 (Hz) = Timer_Clk / ((PSC + 1) × (ARR + 1))

  • Timer_Clk:定時器輸入時鐘頻率 (Hz)
  • PSC:預分頻係數 (0~65535),TIM_Prescaler
  • ARR:自動重裝載值 (0~65535),TIM_Period
  • 更新事件週期 (s) = 1 / 更新頻率

時鐘源分佈(以 STM32F103 為例)

定時器掛載總線輸入時鐘 (SystemCoreClock=72MHz)
TIM1, TIM8APB272 MHz (若 APB2 預分頻=1 則 72M,=2 則 72M×2=144M*)
TIM2~7, TIM9~14APB136 MHz (APB1 最大 36M,若 APB1 預分頻=1 則 36M,=2 則 72M*)

* 若 APB 預分頻 ≠ 1,定時器時鐘 = APB 時鐘 × 2(硬體特性)

SysTick:系統心跳最簡配置

// 1ms 系統節拍 (SystemCoreClock = 72MHz)
if (SysTick_Config(SystemCoreClock / 1000)) { while(1); } // 錯誤處理

// 中斷服務程式
volatile uint32_t ms_ticks = 0;
void SysTick_Handler(void) { ms_ticks++; }

// 延時函式
void Delay_ms(uint32_t ms) {
    uint32_t start = ms_ticks;
    while ((ms_ticks - start) < ms);
}

⚠️ ms_ticks 必須聲明 volatile,防止編譯器優化導致死循環。

通用定時器 TIM3 1ms 中斷完整範例

void TIM3_Config_1ms(void) {
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    TIM_TimeBaseInitTypeDef t;
    t.TIM_Prescaler = 7199;      // 72MHz/(7199+1) = 10kHz
    t.TIM_Period = 9;            // 10kHz/(9+1) = 1kHz → 1ms
    t.TIM_CounterMode = TIM_CounterMode_Up;
    t.TIM_ClockDivision = TIM_CKD_DIV1;
    t.TIM_RepetitionCounter = 0; // 必須顯式清 0,避免上電隨機值導致中斷間隔失控
    TIM_TimeBaseInit(TIM3, &t);

    TIM_ClearFlag(TIM3, TIM_FLAG_Update);
    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
    TIM_Cmd(TIM3, ENABLE);
}

// NVIC 配置
NVIC_InitTypeDef n;
n.NVIC_IRQChannel = TIM3_IRQn;
n.NVIC_IRQChannelPreemptionPriority = 1;
n.NVIC_IRQChannelSubPriority = 1;
n.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&n);

// ISR
void TIM3_IRQHandler(void) {
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
        // 翻轉 LED 等周期性任務
    }
}

常見配置組合速查表(72MHz 系統)

目標頻率PSCARR公式驗證
1 kHz (1ms)7199972M/7200/10 = 1k
10 kHz7199072M/7200/1 = 10k
1 Hz (1s)35999199972M/36000/2000 = 1
1 MHz07172M/1/72 = 1M (PWM 高頻)

避坑指南

  • 🔴 RepetitionCounter (RCR) 未初始化:上電隨機值導致中斷間隔變為 N 倍,必須設 0(除非刻意做重複計數)。
  • 🔴 APB 預分頻改變未同步更新 Timer_Clk:修改 RCC 配置後重新計算 PSC/ARR。
  • 🔴 ARR 設 0 導致計數器不工作:Up 計數模式下 ARR ≥ 1 才會產生更新事件。
  • 🟡 PSC/ARR 修改未啟用預裝載:TIM_ARRPreloadConfig(TIMx, ENABLE) 確保下一個更新事件生效,避免毛刺。

工程化建議

  1. 封裝 Timer_Calc_PSC_ARR(target_hz, &psc, &arr) 工具函式,自動搜尋最佳組合(誤差最小、PSC/ARR 盡量平衡)。
  2. 定時器資源統一管理:建立 Timer_Resource 結構體,記錄時鐘源、中斷向量、DMA 通道等,避免衝突。
  3. 關鍵時序(如電機控制環)採用高級定時器 TIM1/8,具備死區插入、互補輸出、斷路輸入等硬體保護。

精通定時器時間計算,是 STM32 從「跑通流程」邁向「時序精準可控」的分水嶺。

Copyright © Windows教程網 All Rights Reserved