目錄
GPT核心特性
GPT 計數器操作模式
?重啟模式
自由運行模式
GPT時鐘源
?GPT框圖
輸入捕獲:測量外部信號的高電平脈沖寬度
輸出比較:生成 1kHz PWM 波
GPT模塊外部引腳復用與功能映射表
GPT使用注意事項
GPT Memory Map
GPT寄存器
GPTx_CR寄存器
GPTx_PR寄存器
GPTx_SR寄存器
GPTx_IR寄存器
GPTx_OCR1寄存器
GPTx_ICR1寄存器
GPTx_CNT寄存器
前言:
通用定時器(GPT)是一種功能強大的硬件模塊,內置一個32位遞增計數器,用于記錄時鐘脈沖的數量,為定時和計數操作提供核心支持;
GPT具備輸入捕獲能力,能夠檢測外部引腳的電平變化(如上升沿、下降沿或雙邊沿),并在觸發時將當前的計數器值自動保存到專用寄存器中,方便后續讀取或處理;
GPT支持輸出比較功能,用戶可以預先設定一個目標數值,當計數器達到該值時,硬件會自動在指定引腳上產生信號(例如電平翻轉),可用于生成PWM波形或控制外部設備,此外,這一機制還會觸發中斷,讓軟件在中斷服務中執行定時任務,比如周期性數據采集或系統調度;
GPT核心特性
- 一個具備時鐘源選擇功能的 32 位向上計數器,計數范圍為(0 ~ 232-1),當時鐘源選擇內部高速時鐘,可用于高精度定時,若選則低速時鐘(32KHz RTC 時鐘)則用于低功耗場景;
- 兩個輸入捕獲通道,每個通道相互獨立,每個輸入捕獲通道對應一個外部引腳,可監測引腳的電平跳變(上升沿 / 下降沿 / 雙邊沿),?當引腳出現指定邊沿時,立即將當前計數器值自動保存到到捕獲寄存器,可以用于測量脈沖寬度(捕獲上升沿記錄
t1
,捕獲下降沿記錄t2
,脈寬 =?t2-t1
)與測量信號周期(連續捕獲兩個上升沿,周期 =?t2-t1
);- 三個輸出比較通道,每個通道相互獨立,每個通道預設一個比較值,當計數器遞增到該值時,觸發硬件動作,常見輸出模式為電平翻轉(匹配時引腳電平翻轉一次,用于生成單次脈沖)與?持續 PWM(周期由計數器溢出周期決定,占空比由比較值與周期的比值決定);
- 可配置為在低功耗模式和調試模式下保持工作狀態;
- 在捕獲事件、比較事件和計數器溢出事件發生時,可生成中斷;
- 計數器操作支持重啟模式或自由運行模式;
GPT 計數器操作模式
?重啟模式
當通過 GPT 控制寄存器?
GPT_CR
?配置為重啟模式,在重啟模式下,對于輸出比較通道1,當計數器達到比較值時?→?計數器會重置并從?0x00000000
?重新開始計數;對于輸出比較通道2與輸出比較通道3,計數器達到其比較值 → 計數器不會重置,繼續向上累加;
由于通道 1 的比較事件會強制重置計數器,如果通道 2與通道 3 的比較值 > 通道 1 的比較值?→ 計數器會在達到通道 2與通道3 的比較值?之前,先觸發通道 1 的比較事件 → 計數器被重置為?
0
?→ 通道 2/3 的比較事件永遠不會觸發;
注意事項:當對通道 1 的比較寄存器執行任何寫操作時,都會重置 GPT 計數器;
假設計數器正在運行,此時修改通道 1 的比較值:
- 若原比較值?
C_old
?較大(如?0x1000
),新值?C_new
?較小(如?0x0800
),且計數器已超過?C_new
(當前計數值?CNT > C_new
)→ 若不強制重置,C_new
?永遠不會觸發比較事件(因為計數器只會繼續遞增到?0xffffffff
);- 強制重置后,計數器從?
0
?開始,新的?C_new
?會在下次計數到?C_new
?時觸發事件 →?確保修改比較值后,新的定時邏輯能立即生效,避免邏輯漏洞;
應用場景:通道 1 控制基礎周期,通道 2與通道3 實現周期內的子事件;
- 通道 1 設定 "大周期"(1ms),讓計數器每 1ms 重啟 → 實現固定周期的主任務(數據上傳任務);
- 通道 2與通道3 設定 "大周期內的子時間點"(0.3ms、0.7ms)→ 觸發周期內的細分任務(多階段傳感器采集數據、多階段傳感器數據處理);
自由運行模式
當通過 GPT 控制寄存器?
GPT_CR
?配置為自由模式,在自由運行模式下,當所有 3 個比較通道發生比較事件時,計數器都不會重置,計數器會繼續遞增計數,直到達到?0xFFFFFFFF
,然后回繞(溢出)?到?0x00000000
?重新開始;
當計數器與通道的比較值相等時,觸發該通道的比較事件,三個比較通道(通道 1/2/3)共用一個32 位向上計數器,但是三個比較通道可設置不同的比較值,在同一個時間軸上獨立觸發事件;
應用場景:多事件并行調度,示例如下:
- 通道 1 比較值?
T1
?(T1=1000
) → 觸發傳感器采集任務;- 通道 2 比較值?
T2
?(T2=3000
) → 觸發檢查硬件狀態任務;- 通道 3 比較值?
T3
?(T3=5000
) → 觸發系統校準任務;
GPT時鐘源
- Crystal Oscillator:系統基準時鐘,典型頻率為24MHz;
- External Clock:外部時鐘,無固定頻率,可靈活配置;
- Peripheral Clock:系統外設總線時鐘,典型頻率為66MHz;
- Low Frequency Reference Clock:? 低頻參考時鐘,用于低功耗模式、RTC 實時時鐘,典型頻率為32.768KHz;
High Frequency Reference Clock:系統的高頻基準時鐘;
?GPT框圖
?
- Timer Counter 32-bit:32 位向上計數器;
- GPT_CAPTURE1:輸入捕獲引腳,用于檢測外部信號的邊沿(上升沿 / 下降沿);
- IM1 (Input Mode/Mask):輸入模式控制,配置捕獲的邊沿類型(上升沿、下降沿、雙邊沿)或使能 / 屏蔽捕獲;
- IF1 (Input Flag):輸入捕獲標志,當檢測到指定邊沿時置位,觸發將計數器值保存到輸入寄存器的機制;
- IF1IE (Input Capture Interrupt Enable):輸入捕獲中斷使能位,置?
1
?時,捕獲事件觸發處理器中斷;- Timer Input Reg 1 (32-bit):輸入捕獲寄存器,存儲捕獲時刻的計數器值;
- ?Counter Value BUS:用于實時傳輸當前計數器的計數值,一段連接?32 位定時器計數器,另一端連接?輸入捕獲寄存器和?輸出比較比較器;
- ROV (Roll-Over):計數器溢出標志,當?
Timer Counter
?從?0xFFFFFFFF
?回繞到?0
?時置位;- ROVIE (Roll-Over Interrupt Enable):溢出中斷使能位,置?
1
?時,溢出事件觸發處理器中斷;- FRR (Free-Run Restart):自由運行模式下的重啟控制,決定計數器是否重置;
- Timer Output Reg1 (32-bit):輸出比較寄存器,存儲預設的比較值;
- cmp (Comparator):比較器,持續對比?
Timer Counter
?值與?Timer Output Reg
?值,匹配時觸發事件;- OF1 (Output Flag):輸出比較標志,比較匹配時置位,觸發引腳動作或中斷;
- OF1IE (Output Compare Interrupt Enable):輸出比較中斷使能位,置?
1
?時,比較事件觸發處理器中斷;- OM1 (Output Mode):輸出模式控制,決定比較匹配時?
GPT_COMPARE1
?引腳的動作(如電平翻轉、置高、置低等);GPT_COMPARE1
?:輸出比較通道引腳?;
輸入捕獲:測量外部信號的高電平脈沖寬度
需求:測量?
GPT_CAPTURE1
?引腳上的高電平脈沖寬度,系統時鐘經預分頻后為?1MHz
(計數器每?1μs
?加?1
);
一 配置階段:
- 選擇時鐘源為?
ipg_clk=66MHz
,設置預分頻系數為 66(66MHz / 66?= 1MHz
,計數器每1μs
?遞增?1
);- 配置?
IM1
:由于需要測量高電平脈沖寬度,即上升沿開始、下降沿結束,因此選擇上升沿和下降沿捕獲;- 置位?
IF1IE
:使能輸入捕獲中斷,捕獲事件觸發中斷處理;二 捕獲上升沿(記錄起始時間):
- 外部信號在?
GPT_CAPTURE1
?引腳產生上升沿,sync
?同步后,IM1
?觸發?IF1
;Timer Input Reg 1
?鎖存當前計數器值(假設為?T1 = 1000
);- 若?
IF1IE
?使能,觸發中斷,軟件記錄?T1
(起始時間);三 捕獲下降沿(記錄結束時間):
- 外部信號在?
GPT_CAPTURE1
?引腳產生下降沿,sync
?同步后,IM1
?再次觸發?IF1
;Timer Input Reg 1
?鎖存當前計數器值(假設為?T2 = 1500
);- 觸發中斷,軟件計算脈沖寬度:
T2 - T1 = 500
(計數)→ 對應時間?500μs
(因?1
?計數 =?1μs
);
輸出比較:生成 1kHz PWM 波
需求:在?
GPT_COMPARE1
?引腳生成?1kHz
、占空比?50%
?的 PWM 波;分析:? 假設計數器時鐘?
1MHz
(周期?1μs
),則 PWM 周期需?1000μs
(1kHz
),占空比?50%
?即高電平?500μs
、低電平?500μs
,那么輸出比較寄存器的初始值設置為500;
一 配置階段:
- 選擇時鐘源為?
ipg_clk=66MHz
,設置預分頻系數為 66;- 配置?
OM1
:比較匹配時GPT_CAPTURE1
?引腳電平翻轉;- 初始化輸出比較寄存器(?
Timer Output Reg1
)?為?500
;- 置位?
OF1IE
:使能輸出比較中斷,用于更新下一次比較值;二 第一次比較匹配(上升沿):
- 計數器從?
0
?開始計數,達到?500
?時,cmp
?比較匹配,OF1
?置位;OM1
?控制?GPT_COMPARE1
?引腳電平翻轉(假設初始為低電平 → 高電平);- 若?
OF1IE
?使能,觸發中斷,軟件更新?Timer Output Reg1
?為?1000
;三 第二次比較匹配(下降沿):
- 計數器繼續計數到?
1000
,cmp
?再次匹配,OF1
?置位。OM1
?控制引腳電平翻轉(高電平?→ 低電平)。- 中斷中更新?
Timer Output Reg1
?為?1500
(下一個周期的高電平結束點);四 循環生成 PWM:
- 每次比較匹配時翻轉電平,并更新下一次比較值,持續循環 → 生成穩定的?
1kHz
、50%
?占空比 PWM 波;
GPT模塊外部引腳復用與功能映射表
時鐘引腳選取:首先檢查檢查是否需要以太網(ENET1)或 UART1 功能,若以太網和 UART1 都不用,任選;若其中一個需啟用,選另一個閑置的;然后將選取的引腳復用為GPT 時鐘引腳;
輸入捕獲引腳(
GPT1_CAPTURE1
)選取:優先選取GPIO1_IO00,由于GPIO1_IO00
?是獨立 GPIO,復用為捕獲功能時不影響其他外設;輸出比較引腳(
GPT1_COMPARE1
)選取:優先選取GPIO1_IO01,由于GPIO1_IO01
?是獨立 GPIO,復用為比較功能時不影響其他外設;
GPT使用注意事項
若 GPT 定時器被禁用(
EN=0
)?,則?計數器(Main Counter)?和?預分頻器(Prescaler Counter)?會凍結當前計數值(停止遞增,保持最后一次計數結果),此時,ENMOD
?位?決定:當?EN
?位重新置?1
(GPT 再次使能)時,計數器如何恢復計數:
- 若?
ENMOD=1
(重置模式):當 GPT 重新使能(EN=1
)時,主計數器和預分頻計數器會被強制重置為?0
(從頭開始計數);- 若?
ENMOD=0
(續傳模式):當 GPT 重新使能(EN=1
)時,主計數器和預分頻計數器會從凍結的計數值繼續遞增;
硬件復位:會將所有 GPT 寄存器重置為各自的默認復位值,除輸出比較寄存器(OCR1、OCR2、OCR3)?會被置為
0xFFFFFFFF
外,其余寄存器均恢復默認,而輸入捕獲寄存器復位值會被重置為?0x00000000
;
GPT Memory Map
GPT寄存器
GPTx_CR寄存器
bit[0]:?EN位,定時器使能位,
若配置為1
表示啟用 GPT 計數器,開始計數;若配置為0表示禁用計數器,凍結當前計數值;
bit[1]: ENMOD位,使能模式位,決定禁用后重新使能時的行為,若配置為1
表示重新使能;時,計數器重置為 0,若配置為0表示重新使能時,計數器從凍結值繼續遞增計數;bit[8:6]: CLKSRC位,時鐘源選擇位,用于配置 GPT 計數器的時鐘來源,若配置為000表示無時鐘輸入,配置為001表示時鐘源為ipg_clk,配置為010表示時鐘源為ipg_clk_highfreq,配置為011表示時鐘源為External Clock,配置為100表示時鐘源為ipg_clk_32k,配置為101表示時鐘源為ipg_clk_24M;
bit[9]:?FRR位,自由運行 / 重啟模式選擇位,若配置為
1
表示自由運行模式,若配置為0表示重啟模式;
bit[10]:?EN_24M位,24MHz 時鐘使能;bit[15]: SWR位,軟件復位控制位,寫 1 復位 GPT 定時器,復位后自動清0;
bit[17:16]: IM1位,輸入捕獲通道1模式控制位,用于配置?
GPT_CAPTURE1
?引腳的哪種跳變方式會觸發保存計數器值的動作,若配置為00表示禁用捕獲,若配置為01表示僅上升沿觸發,若配置為10表示僅下降沿觸發,若配置為11表示雙邊沿觸發;bit[22:20]: OM1位,輸出比較通道 1 的模式控制位,用于配置比較匹配時?
GPT_COMPARE1
引腳的具體動作,若配置為000表示輸出斷開即比較事件不影響引腳;若配置為001表示翻轉輸出即比較事件發生時,引腳電平翻轉;若配置為010表示清除輸出即比較事件發生時,引腳電平配置低電平;若配置為011表示置位輸出即比較事件發生時,引腳電平配置高電平;bit[29]: FO1位,強制輸出比較位,其作用為手動觸發輸出比較動作,若配置為1時立即執行?
OMn
?配置的輸出動作,但不置位狀態寄存器(GPTX_SR)比較事件標志位(OFn),寫1后自動清除;
GPTx_PR寄存器
bit[31:16]: 保留位
bit[15:12]:?PRESCALER24M位,當且僅當?時鐘源(CLK_SRC)選擇 24M 晶體時鐘?時生效,對 24MHz 輸入時鐘分頻;
bit[11:0]:?PRESCALER位,用于對?CLK_SRC 選擇的任意時鐘源?分頻,決定最終輸入計數器的時鐘頻率,其中分頻系數 = PRESCALER 值 + 1,如
PRESCALER = 0x001
則分頻系數為?2
GPTx_SR寄存器
bit[0]: OF1位,輸出比較通道 1 標志位,當計數器值匹配?
GPT_COMPARE1
?的比較值時置?1
;
bit[3]: IF1位,輸入捕獲通道 1 標志位,當?GPT_CAPTURE1
?引腳檢測到配置的邊沿跳變時置?1
;bit[5]: ROV位,計數器溢出標志位,無論計數器處于重啟模式還是自由運行模式,只有計數器真正達到?
0xFFFFFFFF
?時ROV位置?1
(當 32 位計數器從?0xFFFFFFFF
?回繞到?0
?時置?1
;
GPTx_IR寄存器
bit [0]:?OF1IE位,輸出比較通道 1 中斷使能,
0
表示禁用通道 1 的比較中斷(OF1
?標志置位不觸發中斷),1表示啟用通道 1 的比較中斷(OF1
?標志置位時觸發中斷);bit [3]:?IF1IE位,輸入捕獲通道 1 中斷使能,0 表示禁用通道 1 的捕獲中斷(
IF1
?標志置位不觸發中斷)?1
表示啟用通道 1 的捕獲中斷(IF1
?標志置位時觸發中斷);bit [5]: ROVIE位,計數器溢出中斷使能,?
0
表示禁用溢出中斷(即使?ROV
?標志置位,也不觸發中斷),?1
表示啟用溢出中斷(ROV
?標志置位時,觸發中斷);
GPTx_OCR1寄存器
輸出比較寄存器 1用于存儲?輸出比較通道 1(Output Compare Channel 1)的預設比較值?,當 GPT 的 32 位計數器(
GPT_CNT
)遞增到該值時,會觸發?輸出比較事件;
GPTx_ICR1寄存器
GPTx_ICR1 為只讀寄存器,專門用于保存?輸入捕獲通道 1(Input Capture Channel 1)最后一次捕獲事件發生時的計數器值;
GPTx_CNT寄存器
GPT 模塊的計數器寄存器GPTx_CNT 用于?存儲 GPT 模塊 32 位計數器的當前值,讀操作實時反映計數器當前值,不影響計數流程,寫操作會強制修改計數器值并且打斷當前計數流程;