首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

STM32 定時器全解析:從基礎到進階的實戰指南

     編輯:關於C語言

STM32 定時器架構概覽

STM32 微控制器內建功能強大的定時器系統,共有 8 個 16 位元定時器,依功能分為三大類:基本定時器、通用定時器與高級定時器。理解它們的差異與適用場景,是掌握 STM32 定時應用的關鍵。

基本定時器(TIM6、TIM7)

TIM6 與 TIM7 為基本定時器,功能相對單純,主要用於產生 DAC 觸發訊號,或作為簡單的時間基準產生器。它們不具備輸入捕獲、輸出比較或 PWM 輸出功能,適合不需要複雜波形控制的定時任務。

通用定時器(TIM2、TIM3、TIM4、TIM5)

通用定時器是最常用的類型,除基本計時功能外,還支援以下進階應用:

  • 輸入捕獲/輸出比較: 可實現脈衝頻率測量、脈寬測量等功能
  • PWM 輸出/輸入: 支援多通道 PWM 輸出,可用於電機控制、LED 調光等
  • 外部時鐘模式: 可使用外部脈衝作為定時器時鐘源,實現外部事件計數
  • 編碼器介面: 直接連接旋轉編碼器,簡化位置/速度檢測電路

高級定時器(TIM1、TIM8)

高級定時器擁有通用定時器所有功能,並新增關鍵特性專為電機控制設計:

  • 互補 PWM 輸出與死區控制: 內建死區產生器,防止橋式驅動電路直通
  • 剎車輸入: 可快速關閉 PWM 輸出,保護功率元件
  • 三相/六步換相: 硬體支援無刷直流電機換相邏輯
  • 重複計數器: 可設定更新事件頻率,降低中斷負載

相比通用定時器,高級定時器多出 BRK(剎車)與 DTG(死區產生器)兩個硬體模組,這正是其核心優勢所在。

實戰:TIM3 定時中斷初始化完整範例

以 TIM3 為例,展示標準庫下的定時中斷配置流程:

void TIM3_Init(u16 arr, u16 psc) {
    TIM_TimeBaseInitTypeDef TIM_InitStruct;
    
    // 1. 開啟 TIM3 時鐘(掛載於 APB1 總線)
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    
    // 2. 時基單元配置
    TIM_InitStruct.TIM_Period = arr;              // 自動重裝載值 (ARR)
    TIM_InitStruct.TIM_Prescaler = psc;           // 預分頻值 (PSC)
    TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;  // 向上計數模式
    TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1;      // 時鐘分割:不分頻
    TIM_TimeBaseInit(TIM3, &TIM_InitStruct);
    
    // 3. 啟用更新中斷
    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
    
    // 4. 啟動定時器
    TIM_Cmd(TIM3, ENABLE);
}

void NVIC_Config(void) {
    NVIC_InitTypeDef NVIC_InitStruct;
    
    // 設定中斷優先級分組:1 位搶佔優先級,3 位子優先級
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    
    NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
}

void TIM3_IRQHandler(void) {
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {
        LED0 = ~LED0;  // 翻轉 LED 狀態
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  // 清除中斷標誌
    }
}

關鍵結構體參數詳解

typedef struct {
    u16 TIM_Period;        // ARR:自動重裝載值 (0x0000~0xFFFF)
    u16 TIM_Prescaler;     // PSC:預分頻係數 (0x0000~0xFFFF)
    u16 TIM_ClockDivision; // 時鐘分割:TDTS 取樣頻率設定
    u16 TIM_CounterMode;   // 計數模式選擇
} TIM_TimeBaseInitTypeDef;

計數模式選項:

  • TIM_CounterMode_Up:向上計數(0 → ARR)
  • TIM_CounterMode_Down:向下計數(ARR → 0)
  • TIM_CounterMode_CenterAligned1/2/3:中央對齊模式,適合 PWM 相位正確控制

時鐘分割選項:

  • TIM_CKD_DIV1:TDTS = Tck_tim(不分頻)
  • TIM_CKD_DIV2:TDTS = 2 × Tck_tim
  • TIM_CKD_DIV4:TDTS = 4 × Tck_tim

中斷源配置

TIM_ITConfig() 可啟用多種中斷源(可組合使用):

  • TIM_IT_Update:更新中斷(溢位/重裝載)
  • TIM_IT_CC1~CC4:捕獲/比較 1~4 中斷
  • TIM_IT_Trigger:觸發中斷

定時器頻率計算公式

輸出頻率 / 中斷頻率 = TIM_CLK / ((PSC + 1) × (ARR + 1))

其中 TIM_CLK 為定時器時鐘頻率(APB1 總線時鐘,通常為 36MHz 或 72MHz),PSC 為預分頻值,ARR 為自動重裝載值。

常見應用場景建議

應用場景推薦定時器關鍵功能
簡單延時/時間基準TIM6/TIM7基本定時、DAC 觸發
PWM 輸出/輸入捕獲TIM2~TIM5多通道 PWM、編碼器介面
BLDC/PMSM 電機控制TIM1/TIM8互補 PWM、死區、剎車、霍爾感測器介面
多通道同步 PWMTIM1 + TIM8主從模式同步

總結

STM32 定時器系統靈活強大,選型關鍵在於明確應用需求:基本定時用 TIM6/7,通用控制用 TIM2~5,電機驅動必選 TIM1/8。掌握時基單元配置、中斷處理與 NVIC 設定三大核心步驟,即可靈活驅動各類定時應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved