【S32K 進階之旅】 使用 S32K3 PIT 定時器實現 delay 延時功能

關鍵字 :S32K3PIT 定時器delay 延時led開發板

前言

       周期中斷定時器 (Periodic Interrupt Timer, PIT) 模塊顧名思義,就是通過計時行為引發周期性中斷事件的觸發器。本文基於 S32K312 開發板實現延時功能,在此之前先簡單介紹下 PIT 的特性。

1. PIT 模塊特性

  • 根據下圖查表可知,不同型號 S32K3 支持的 PIT 數量不同。最多有 4 組 PIT 模塊,每組有四路 PIT 通道,每路通道長度為 32-bit,其中 PIT_0 可鏈接兩路定時器並組成 64-bit lifetimer 生命定時器

 【S32K 進階之旅】 使用 S32K3 PIT 定時器實現 delay 延時功能

  • PIT 時鐘源為 AIPS_SLOW_CLK,其中 PIT_0 包含一路 RTI 時鐘源來自 SIRC_CLK(32KHz),可用於Standby模式下的系統喚醒。
【S32K 進階之旅】 使用 S32K3 PIT 定時器實現 delay 延時功能

  • 可用於引發中斷和觸發DMA通道
  • PIT 的每個通道都可獨立配置超時時限
  • 如下圖所示,PIT 定時的時長由預裝載值決定,所有通道都是遞減計數方式,當計時器計數到0會觸發定時器中斷,自動重裝載值並立刻進入下一個周期。
【S32K 進階之旅】 使用 S32K3 PIT 定時器實現 delay 延時功能

 
2. PIT 驅動配置

  • S32K3 工程的驅動配置界面添加 PIT 組件

 【S32K 進階之旅】 使用 S32K3 PIT 定時器實現 delay 延時功能

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

 【S32K 進階之旅】 使用 S32K3 PIT 定時器實現 delay 延時功能

【S32K 進階之旅】 使用 S32K3 PIT 定時器實現 delay 延時功能 

  • IntCtrl_Ip 組件中添加 PIT 的中斷服務程序。

如果此處沒有配置,則必須在程序初始化時安裝 PIT 中斷處理函數。

【S32K 進階之旅】 使用 S32K3 PIT 定時器實現 delay 延時功能 

  • 更新源代碼,將會生成以下頭文件和源文件
  • Pit_Ip_BOARD_InitPeripherals_PBcfg.h
  • Pit_Ip_Cfg.h
  • Pit_Cfg_Defines.h
  • Pit_Ip_BOARD_InitPeripherals_PBcfg.c

 【S32K 進階之旅】 使用 S32K3 PIT 定時器實現 delay 延時功能


  • 下列驅動層文件也會自動添加到工程中
  • 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 實例的宏定義,方便函數調用。

【S32K 進階之旅】 使用 S32K3 PIT 定時器實現 delay 延時功能 

  • main 函數中添加 PIT 和 Interrupt 初始化語句,一定要最先初始化時鐘,再是其他外設。這裡也配置了一路 GPIO 用於控制開發板上的 LED,演示延時效果。

 【S32K 進階之旅】 使用 S32K3 PIT 定時器實現 delay 延時功能

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

 

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

【S32K 進階之旅】 使用 S32K3 PIT 定時器實現 delay 延時功能 
【S32K 進階之旅】 使用 S32K3 PIT 定時器實現 delay 延時功能

  • 創建一個毫秒延時函數,為了降低庫函數運行延遲,我們直接把命令寫入寄存器。

       如下圖所示,將預裝載值寫入 LDVAL,TCTRL的 TEN 置位開啟定時器,此時定時器開始遞減計數,循環檢測 TFLG 寄存器,當超時中斷髮生時 TIF 置位,關閉 PIT 定時器通道並清除掛起的中斷,完成一次延時操作。

我們工程中的 PIT0_CLK 是 30MHz,所以預裝載值:

count_timer = ( 30000000/1000) * delayMs = 30000 * delayMs

【S32K 進階之旅】 使用 S32K3 PIT 定時器實現 delay 延時功能

  • 完成上述代碼的編寫之後,就可以在應用程序中使用了。

4. 參考文檔

[1] S32K3xx Reference Manual, Rev. 9, 07/2024, NXP




歡迎在博文下方留言評論,我們會及時回復您的問題。

如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com   
作者:銀醬

更多資訊,請掃碼關注我們!
 

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論