STM32 定時器家族龐大(SysTick、基礎/通用/高級定時器),掌握統一的時間計算公式與配置流程,能讓延時、PWM、輸入捕獲等應用一把抓準。本文梳理核心公式、時鐘源分佈、常見陷阱與工程化配置範本。
更新事件頻率 (Hz) = Timer_Clk / ((PSC + 1) × (ARR + 1))
Timer_Clk:定時器輸入時鐘頻率 (Hz)PSC:預分頻係數 (0~65535),TIM_PrescalerARR:自動重裝載值 (0~65535),TIM_Period1 / 更新頻率| 定時器 | 掛載總線 | 輸入時鐘 (SystemCoreClock=72MHz) |
|---|---|---|
| TIM1, TIM8 | APB2 | 72 MHz (若 APB2 預分頻=1 則 72M,=2 則 72M×2=144M*) |
| TIM2~7, TIM9~14 | APB1 | 36 MHz (APB1 最大 36M,若 APB1 預分頻=1 則 36M,=2 則 72M*) |
* 若 APB 預分頻 ≠ 1,定時器時鐘 = APB 時鐘 × 2(硬體特性)
// 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,防止編譯器優化導致死循環。
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 等周期性任務
}
}
| 目標頻率 | PSC | ARR | 公式驗證 |
|---|---|---|---|
| 1 kHz (1ms) | 7199 | 9 | 72M/7200/10 = 1k |
| 10 kHz | 7199 | 0 | 72M/7200/1 = 10k |
| 1 Hz (1s) | 35999 | 1999 | 72M/36000/2000 = 1 |
| 1 MHz | 0 | 71 | 72M/1/72 = 1M (PWM 高頻) |
TIM_ARRPreloadConfig(TIMx, ENABLE) 確保下一個更新事件生效,避免毛刺。Timer_Calc_PSC_ARR(target_hz, &psc, &arr) 工具函式,自動搜尋最佳組合(誤差最小、PSC/ARR 盡量平衡)。Timer_Resource 結構體,記錄時鐘源、中斷向量、DMA 通道等,避免衝突。精通定時器時間計算,是 STM32 從「跑通流程」邁向「時序精準可控」的分水嶺。