前言
周期中斷定時器 (Periodic Interrupt Timer, PIT) 模塊顧名思義,就是通過計時行為引發周期性中斷事件的觸發器。本文基於 S32K312 開發板實現延時功能,在此之前先簡單介紹下 PIT 的特性。
1. PIT 模塊特性
- 根據下圖查表可知,不同型號 S32K3 支持的 PIT 數量不同。最多有 4 組 PIT 模塊,每組有四路 PIT 通道,每路通道長度為 32-bit,其中 PIT_0 可鏈接兩路定時器並組成 64-bit lifetimer 生命定時器

- PIT 時鐘源為 AIPS_SLOW_CLK,其中 PIT_0 包含一路 RTI 時鐘源來自 SIRC_CLK(32KHz),可用於Standby模式下的系統喚醒。

- 可用於引發中斷和觸發DMA通道
- PIT 的每個通道都可獨立配置超時時限
- 如下圖所示,PIT 定時的時長由預裝載值決定,所有通道都是遞減計數方式,當計時器計數到0會觸發定時器中斷,自動重裝載值並立刻進入下一個周期。

2. PIT 驅動配置
- 在 S32K3 工程的驅動配置界面添加 PIT 組件

- 依次配置各個功能項
- 選擇 “GptChannelConfigSet” 選項卡
- 點擊“加號”按鈕添加定時器通道
- 選擇要配置的 PIT 實例,我們選用 PIT_0
- 如果需要啟用 Debug 模式下暫停的功能,那麼 “PitFreezeEnable” 項使能
- 選擇對應的定時器通道,我們選用通道 0
- 如果需要 64-bit 定時器的話,啟用 “ChainMode”,本文示例沒有用到
- “PitNotification” 設置該通道發生超時中斷時調用的回調函數
- 選擇 “PitChannelMode” 連續模式或者單次模式,兩種模式都可以,如果選擇單次模式,每次發生超時中斷時會自動關閉 PIT 通道,再次使用時需重新啟用該通道
- 選擇 “GptHwConfiguration” 選項卡,使能 PIT_0_CH_0 通道和中斷

- 在 IntCtrl_Ip 組件中添加 PIT 的中斷服務程序。
如果此處沒有配置,則必須在程序初始化時安裝 PIT 中斷處理函數。
- 更新源代碼,將會生成以下頭文件和源文件
- Pit_Ip_BOARD_InitPeripherals_PBcfg.h
- Pit_Ip_Cfg.h
- Pit_Cfg_Defines.h
- Pit_Ip_BOARD_InitPeripherals_PBcfg.c

- 下列驅動層文件也會自動添加到工程中
- RTD/src/Pit_Ip .c
- RTD/include/Pit_Ip.h
- RTD/include/Pit_Ip_Types.h
3. 延時函數實現
- 在 <main.c> 文件上方增加 “Pit_Ip.h” 和 “IntCtrl_Ip.h” 頭文件。
- 添加 PIT_0 實例的宏定義,方便函數調用。
- main 函數中添加 PIT 和 Interrupt 初始化語句,一定要最先初始化時鐘,再是其他外設。這裡也配置了一路 GPIO 用於控制開發板上的 LED,演示延時效果。

- 創建 PIT0_CH0 對應的回調函數,中斷事件發生時可以在此處分配任務。這裡的函數名要與 “PitNotification” 配置中的名稱保持一致。

- 完成上述的操作之後,PIT 定時器還沒有啟動。為了精確的使用延時函數,我們需要查看當前工程中 PIT 的時鐘源 AIPS_SLOW_CLK 頻率,可以打開圖形化配置界面在時鐘樹中找到,也可以在 “Clock_Ip_Cfg.c” 源文件中查看。

- 創建一個毫秒延時函數,為了降低庫函數運行延遲,我們直接把命令寫入寄存器。
如下圖所示,將預裝載值寫入 LDVAL,TCTRL的 TEN 置位開啟定時器,此時定時器開始遞減計數,循環檢測 TFLG 寄存器,當超時中斷髮生時 TIF 置位,關閉 PIT 定時器通道並清除掛起的中斷,完成一次延時操作。
我們工程中的 PIT0_CLK 是 30MHz,所以預裝載值:
count_timer = ( 30000000/1000) * delayMs = 30000 * delayMs
- 完成上述代碼的編寫之後,就可以在應用程序中使用了。
4. 參考文檔
[1] S32K3xx Reference Manual, Rev. 9, 07/2024, NXP
歡迎在博文下方留言評論,我們會及時回復您的問題。
如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com 作者:銀醬
更多資訊,請掃碼關注我們! 
評論