#include "tim4.h"void TIM4_Init(void)
{// 開啟時鐘RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // 使用 TIM4 的 GPIOB 時鐘// 配置 PB6 為浮空輸入 CNF 01 MODE 00GPIOB->CRL &= ~GPIO_CRL_MODE6;GPIOB->CRL &= ~GPIO_CRL_CNF6_1;GPIOB->CRL |= GPIO_CRL_CNF6_0; // 浮空輸入// 定時器時基部分// 預分頻71TIM4->PSC = 71;// 自動重裝載值 1000TIM4->ARR = 65535; // 65535 是最大值,計數到這個值后會重裝載// 向上計數TIM4->CR1 &= ~TIM_CR1_DIR;// TI1輸入選擇直通TIM4->CR2 &= ~TIM_CR2_TI1S; // 輸入濾波器TIM4->CCMR1 &= ~TIM_CCMR1_IC1F; // 無濾波// 配置邊沿檢測器極性上升沿觸發TIM4->CCER &= ~TIM_CCER_CC1P;// 配置邊沿檢測器極性下降沿觸發TIM4->CCER |= TIM_CCER_CC2P;// 選擇通道1的輸入映射為TI1 01TIM4->CCMR1 &= ~TIM_CCMR1_CC1S; // 清除 CC1S 位TIM4->CCMR1 |= TIM_CCMR1_CC1S_0; // 選擇通道2的輸入映射為TI1 10TIM4->CCMR1 |= TIM_CCMR1_CC2S; // 清除 CC2S 位TIM4->CCMR1 &= ~TIM_CCMR1_CC2S_0;// 預分頻器TIM4->CCMR1 &= ~TIM_CCMR1_IC1PSC; // 無預分頻TIM4->CCMR1 &= ~TIM_CCMR1_IC2PSC; // 無預分頻// 配置觸發輸入信號101TIM4->SMCR |= TIM_SMCR_TS; // 清除 TS 位TIM4->SMCR &= ~TIM_SMCR_TS_1; // 選擇觸發輸入為 TI1// 配置從模式為復位模式100TIM4->SMCR &= ~TIM_SMCR_SMS; // 清除 SMS 位TIM4->SMCR |= TIM_SMCR_SMS_2; // 設置為復位模式// 通道1輸入捕獲使能TIM4->CCER |= TIM_CCER_CC1E;// 通道2輸入捕獲使能TIM4->CCER |= TIM_CCER_CC2E;
}void TIM4_START(void)
{TIM4->CR1 |= TIM_CR1_CEN; // 啟動定時器
}void TIM4_STOP(void)
{TIM4->CR1 &= ~TIM_CR1_CEN;
}// 獲取 輸入 周期為ms
double TIM4_GETPWMCYCLE(void)
{return TIM4->CCR1 / 1000.0; // 假設計數器時鐘為 1MHz
}double TIM4_GETPWMFREQ(void)
{return 1000000.0 / TIM4->CCR1;
}double TIM4_GetDutyCycle(void)
{return (TIM4->CCR2 * 1.0) / TIM4->CCR1; // 假設 CCR2 是捕獲的高電平時間
}
定時器 TIM4 被配置為從模式復位模式(TIM_SMCR_SMS = 100
),并且觸發輸入選擇為 TI1(TIM_SMCR_TS
設置為 101)。
1. 復位模式的觸發機制
- 在復位模式下,計數器 (CNT) 會在檢測到指定的觸發輸入事件時立即清零。
TIM_SMCR_TS
被設置為 101,表示觸發輸入源是 TI1 的邊沿(上升沿或下降沿取決于TIM_CCER_CC1P
和TIM_CCER_CC2P
的極性配置)。TIM_CCER_CC1P = 0
(上升沿觸發),TIM_CCER_CC2P = 1
(下降沿觸發):- 通道 1 (CC1) 捕獲 TI1 的上升沿。
- 通道 2 (CC2) 捕獲 TI1 的下降沿。
2. 代碼中的配置
- 觸發輸入 TI1:
TIM_SMCR_TS = 101
選擇 TI1 作為觸發源。TI1 是輸入 PWM 信號的濾波和映射后的信號。 - 復位模式:
TIM_SMCR_SMS = 100
計數器會在 TI1 的上升沿觸發時復位。 - CNT 行為:計數器從 0 開始計數,當 TI1 檢測到上升沿時,CNT 會立即清零。
3. 高電平與復位的關系
- PWM 信號的高電平是從上升沿開始到下降沿結束。
- 在你的配置中,復位是由 TI1 的上升沿觸發的(因為
TIM_CCER_CC1P = 0
選擇上升沿)。這意味著:- 當 PWM 信號從低電平跳到高電平(上升沿發生)時,計數器 (CNT) 會被復位。
- 復位發生在高電平的開始時刻,而不是整個高電平期間。
- 之后,CNT 會從 0 開始計數,直到下一次觸發或達到 ARR。
4. 代碼中的捕獲邏輯
TIM4->CCR1
捕獲上升沿時間(高電平開始)。TIM4->CCR2
捕獲下降沿時間(高電平結束)。- 由于 CNT 在每次上升沿復位,
CCR1
總是記錄 0(或很小的值),CCR2
記錄高電平持續時間。