概念
GPT,全稱General Purpose Timer,就是個通用定時器,取的名字奇怪了點。定時器是一定要的,要么提供給BSW去使用,要么提供給OS去使用。
配置
General
GptDeinitApi控制接口Gpt_DeInit是否啟用
GptEnableDisableNotificationApi控制接口Gpt_EnableNotification和Gpt_DisableNotification是否啟用。
GptTimeElapsedApi控制接口Gpt_GetTimeElapsed是否啟用
GptTimeRemainingApi控制接口Gpt_GetTimeRemaining是否啟用
GptTimeElapsedApi控制接口Gpt_GetTimeElapsed是否啟用
GptTimeRemainingApi控制接口Gpt_GetTimeRemaining是否啟用
GptVersionInfoApi控制接口Gpt_GetVersionInfo是否啟用
GptWakeupFunctionalityApi控制喚醒相關功能接口接口Gpt_SetMode, Gpt_EnableWakeup,Gpt_DisableWakeup和Gpt_Cbk_CheckWakeup()是否啟用。
這里介紹一下定時器喚醒機制:如果硬件支持并啟用,內部硬件計時器可以作為喚醒源,如果一個通道作為喚醒源,就不能用來做其他的用途。
GptDevErrorDetect開發者錯誤檢測是PORT_DEV_ERROR_DETECT宏定義的開關,新人可以勾選,它能幫你檢查出一些開發階段的錯誤。老手一般不打開,因為會影響到代碼的執行效率。
GptReportWakeupSource控制喚醒源報告是否啟用
GptEnableDualClockMode在模式轉換時啟用預分頻器設置,一般用不上。
GptEnablePit64啟用pit 64位功能,PIT就是Periodic Interrupt Timer周期中斷定時器,PIT64就是一個大點的PIT計時器,能容納更大的tick數據,因為芯片只有32位,所以分開高32位和低32位傳回來。
?
GptClockReferencePoint
這里就是在GPT模塊里面創建個時鐘引用,本身不創建任何東西,只是把MCU模塊里面配置的時鐘引用過來,作為一個基準時鐘,給到GptChannelConfigSet里面的定時器去用。
GptChannelConfigSet
GptChannelConfiguration里面的才是主要的配置,每個容器就是一個通用定時器。
?
GptChannelId自己排序的號
GptHwChannel物理通用定時器通道,可以選STM(System Timer Module系統時鐘模塊)/GTM(Generic Timer Module通用定時器模塊)/PIT(Periodic Interrupt Timer周期中斷定時器)之類的。
?
- STM(系統時鐘模塊):適用于系統級任務,如系統心跳或任務調度,通常與系統時鐘直接相關。
- GTM(通用定時器模塊):適合需要多種功能的場景,如PWM生成、輸入捕捉和比較輸出,靈活性高。
- PIT(周期中斷定時器):專為生成周期性中斷設計,適合需要定期執行任務的情況。
GptChannelMode定時器超時之后的行為,也就是連續計時還是一次性計時。
GptChannelTickFrequency指定定時器的頻率,單位為Hz。最大不能大于下面引用的GptClockReferencePoint引用的MCU時鐘,下面稱為“引用的MCU時鐘”。
對于STM,引用的MCU時鐘除以定時器頻率小于等于256。
對于RTC,引用的MCU時鐘除以定時器頻率只能是32或512或16384。
其他通道改這個配置值是不起作用的。
GptFreezeEnable勾選之后不能在代碼運行的時候修改硬件通道。
GptEnableWakeup使能通道喚醒功能
GptNotification通用定時器的回調函數,這個函數要自己實現,動態代碼只會生成個定義,不會實現出來。
GptChannelClkSrcRef選擇GptClockReferencePoint里面的引用,這個引用后面會再引用到MCU的時鐘源。具體GPT的時鐘基礎就是引用的MCU頻率,在Gpt_StartTimer接口里面設置超時時間,到達超時時間就會調用回調函數。
GptWakeupSourceRef喚醒源,從ECU狀態管理器里面獲取。
GptDisableEcumWakeupSourceNotification通過調用EcuM_CheckWakeup接口啟用/禁用EcuM通知
靜態代碼
Gpt_CheckWakeup檢查支持喚醒的GPT通道是否是喚醒事件的源,并調用ECU狀態管理器服務EcuM_SetWakeupEvent,用于有效的GPT通道喚醒事件。在調用Gpt_Cbk_CheckWakeup之前,需要初始化驅動程序。
Gpt_DeInit逆初始化接口,根據硬件通道是STM/PIT/GTM/PIT1類型來操作對應的寄存器。譬如硬件通道是STM類型的,就操作STM_CR寄存器失能定時器、分頻數設置為0,操作STM_CCR寄存器失能STM通道里面跟定時器相關的配置,操作STM_CMP寄存器將比較器里面的值清零,操作STM_CIR寄存器清除中斷標志位。最后,無論是什么類型的硬件通道,都會把通道狀態進行重置,模式設置為普通,回調函數指針清空。
Gpt_DisableWakeup禁用單個GPT通道的喚醒中斷調用。實際上就是調用Gpt_LLD_DisableWakeup接口,根據硬件通道類型去失能對應通道的中斷,入參是物理通道ID,需要在動態代碼里面復制。
Gpt_EnableNotification開啟單個GPT通道的喚醒中斷調用,操作Gpt_DisableWakeup相反。
Gpt_GetTimeElapsed獲取從開始計時或重新開始計時到現在的tick,實際上是調用Gpt_LLD_GetTimeElapsed接口獲取當前tick返回。
Gpt_GetTimeRemaining獲取現在到超時之間的tick,實際上是調用Gpt_LLD_GetTimeRemaining接口獲取當前tick和超時tick進行相減后返回。
Gpt_GetVersionInfo獲取版本信息,需要傳入一個Std_VersionInfoType類型的結構體指針,接口會把版本信息賦值到傳入的結構體里面。
Gpt_Init初始化的時候需要調用,入參是Gpt_ConfigType類型的結構體指針,接口會把入參的結構體或者Gpt_InitConfigPC結構體里面的內容賦值給全局結構體Gpt_Cfg_Ptr,這個結構體會在Gpt_LLD_SetSleepMode等GPT相關的操作函數里面使用到。
Gpt_SetMode設置GPT的模式,只有GPT_MODE_NORMAL和GPT_MODE_SLEEP可以選。如果是GPT_MODE_NORMAL,調用Gpt_LLD_SetNormalMode接口,有回調函數就使能回調函數,使能定時器。如果是GPT_MODE_SLEEP,調用Gpt_LLD_SetSleepMode,停止定時器并失能,有回調函數失能回調函數。并且在執行過程中調用Gpt_Schm_ProtectResource和Gpt_Schm_UnprotectResource保護GPT的執行。
Gpt_StartTimer啟動定時器,入參為GPT通道和超時值,單位為tick。先調用Gpt_LLD_CheckStartTimeoutValue檢查超時值是否合理,再調用Gpt_LLD_StartTimer開始計時。并且在執行過程中調用Gpt_Schm_ProtectResource和Gpt_Schm_UnprotectResource保護GPT的執行。
Gpt_StopTimer停止定時器,調用Gpt_LLD_StopTimer暫停計時。并且在執行過程中調用Gpt_Schm_ProtectResource和Gpt_Schm_UnprotectResource保護GPT的執行。
Gpt_DisableNotification失能定時器函數回調機制。
Gpt_DisableNotification_Pit64失能Pit64的回調機制,其實就是清除PIT1_TCTRL寄存器。并且在執行過程中調用Gpt_Schm_ProtectResource和Gpt_Schm_UnprotectResource保護GPT的執行。
介紹到這里,需要注意一件事情,就是啟動定時器之前,如果有回調函數,就要先使能回調機制。暫停定時器的時候,如果有回調函數,就要失能回調機制,放在暫停定時器的前還是后都可以。
Gpt_EnableNotification_Pit64使能Pit64的回調機制
Gpt_EnableWakeup_Pit64使能PIT64的喚醒功能
Gpt_GetTimeElapsed_Pit64獲取PIT64從開始計時或重新開始計時到現在的tick
Gpt_GetTimeRemaining_Pit64獲取PIT64計時器離超時還有多久的tick
Gpt_StartTimer_Pit64啟動PIT64計時器
Gpt_StopTimer_Pit64暫停PIT64計時器
動態代碼
GPT_GTM_TOMx_CH_y_ISR_USED,其中x和y都是可變的數字,當你選擇的GPT通道為GTM的,就會出現這類定義,這類定義會將動態代碼里面的ISR(Gpt_TOM_x_CHy_CHz_ISR);接口編譯進來,其中xyz都是可變數字。其實就是開啟一個TOM的中斷,并且把該接口實現,該接口本質上就是調用Gpt_Gtm_LLD_ProcessInterrupt接口執行產生中斷時候的動作,譬如重載、調用回調函數之類的。
其他的GTM和STM、PIT也類似。
Gpt_InitChannelPC_1數組里面有每一個GPT的初始配置信息,用來給Gpt_Init初始化的。
?
?
?