AUTOSAR OCU驅動程序詳解
目錄
- 1. 概述
- 1.1 OCU驅動程序簡介
- 1.2 功能概述
- 2. OCU驅動程序架構
- 2.1 架構圖
- 2.2 層次結構
- 3. OCU驅動程序組件設計
- 3.1 組件圖
- 3.2 接口定義
- 4. OCU驅動程序狀態管理
- 4.1 狀態圖
- 4.2 狀態轉換
- 5. OCU驅動程序數據結構
- 5.1 配置類圖
- 5.2 數據類型定義
- 6. OCU驅動程序使用流程
- 6.1 序列圖
- 6.2 調用流程
- 7. 總結
1. 概述
1.1 OCU驅動程序簡介
OCU(Output Compare Unit,輸出比較單元)驅動程序是AUTOSAR標準中MCAL(微控制器抽象層)的一部分,提供了對微控制器中輸出比較單元的抽象接口。OCU驅動程序使上層軟件能夠使用標準化的API訪問硬件輸出比較功能,無需關心具體的硬件細節。
1.2 功能概述
根據AUTOSAR規范文檔,OCU驅動程序提供以下核心功能:
- 比較值控制:允許設置絕對或相對閾值,與自由運行計數器進行比較
- 通道管理:支持啟動和停止OCU通道,控制計數器運行
- 通知機制:在計數器值等于閾值時提供通知回調
- 引腳控制:管理輸出引腳狀態,配置比較匹配時的動作
- 計數器讀取:提供讀取自由運行計數器當前值的接口
OCU通道由自由運行計數器、比較閾值和比較匹配動作組成。當計數器值等于閾值時,會執行配置的比較匹配動作,如修改輸出引腳狀態或觸發通知回調。
2. OCU驅動程序架構
2.1 架構圖
下圖展示了OCU驅動程序在AUTOSAR架構中的位置和與其他模塊的關系:
2.2 層次結構
根據架構圖和源文檔,OCU驅動程序位于AUTOSAR架構的MCAL層,其層次結構如下:
應用層:
- 應用軟件組件:實現特定的應用功能,通過RTE使用OCU驅動提供的服務。
RTE層:
- 運行時環境:連接應用層和基礎軟件層,提供標準化的通信機制。
BSW層:
- ECU抽象層:對BSW功能提供抽象接口,屏蔽硬件細節。
- MCAL層:包含OCU驅動程序,直接與硬件交互。
- OCU驅動程序:提供對OCU硬件的訪問接口。
- 其他MCAL模塊:如DIO、PORT等,與OCU驅動協作。
- 服務層:提供系統服務,用于配置和初始化模塊。
硬件層:
- MCU硬件:微控制器硬件平臺。
- OCU硬件單元:實現計數器、比較器和輸出功能的硬件單元。
OCU驅動程序的關鍵職責包括:
- 初始化和配置OCU通道
- 啟動/停止通道
- 設置閾值和讀取計數器值
- 配置輸出引腳行為
- 通知上層應用比較匹配事件
OCU硬件單元的功能包括:
- 自由運行計數器
- 比較閾值
- 比較匹配動作
- 輸出引腳控制
3. OCU驅動程序組件設計
3.1 組件圖
以下組件圖展示了OCU驅動程序的內部結構和接口設計:
3.2 接口定義
OCU驅動程序包含以下主要功能模塊和接口:
初始化模塊:
- Ocu_Init:初始化OCU驅動程序,設置硬件寄存器和內部數據結構。
- Ocu_DeInit:反初始化OCU驅動程序,復位硬件和內部狀態。
通道控制模塊:
- Ocu_StartChannel:啟動指定的OCU通道,允許計數器運行。
- Ocu_StopChannel:停止指定的OCU通道,禁止計數器運行。
- Ocu_SetPinState:設置通道關聯的輸出引腳狀態(高/低電平)。
- Ocu_SetPinAction:配置比較匹配時輸出引腳的動作(置高/置低/翻轉/禁用)。
通知管理模塊:
- Ocu_EnableNotification:啟用指定通道的比較匹配通知回調。
- Ocu_DisableNotification:禁用指定通道的比較匹配通知回調。
- 通知處理:內部組件,負責處理比較匹配事件并調用回調函數。
計數器管理模塊:
- Ocu_GetCounter:讀取指定通道計數器的當前值。
- Ocu_SetAbsoluteThreshold:設置絕對比較閾值。
- Ocu_SetRelativeThreshold:設置相對比較閾值(相對于當前計數器值或當前閾值)。
配置管理模塊:
- 通道配置:管理OCU通道的配置數據。
- 靜態配置:存儲來自配置工具的靜態配置參數。
這些接口符合AUTOSAR標準,提供了對OCU硬件功能的完整訪問。配置參數包括通道ID、計數器最大值、計數器頻率/分辨率、默認閾值、通知函數、輸出引腳配置和硬件通道分配等。
根據源文檔中的SRS_Ocu_00006,OCU驅動程序提供當計數器值等于閾值時的通知功能。通知僅在以下條件滿足時觸發:
- 通知功能已配置(非空指針)
- 通知功能已啟用
根據SRS_Ocu_00012,OCU驅動程序還提供設置比較匹配時引腳動作的功能,可能的動作值包括OCU_HIGH、OCU_LOW、OCU_TOGGLE和OCU_DISABLE。
4. OCU驅動程序狀態管理
4.1 狀態圖
下圖展示了OCU驅動程序通道的狀態轉換:
4.2 狀態轉換
OCU驅動程序使用狀態機管理其生命周期和功能狀態。主要狀態和轉換包括:
未初始化狀態 (UNINIT):
- 驅動程序尚未初始化,無法使用任何功能。
- 通過調用
Ocu_Init()
函數轉換到初始化完成狀態。
初始化完成狀態 (INITIALIZED):
- 驅動程序已初始化,可以使用其功能。
- 通過調用
Ocu_DeInit()
函數返回到未初始化狀態。 - 初始化后的特點:
- 所有通道處于停止狀態
- 所有通知被禁用
- 輸出引腳設置為默認狀態
在初始化完成狀態下,通道和通知有各自的子狀態:
通道子狀態:
- 通道停止狀態 (IDLE):通道未運行,不會觸發比較匹配。
- 通過調用
Ocu_StartChannel()
轉換到通道運行狀態。
- 通過調用
- 通道運行狀態 (RUNNING):通道正在運行,可以觸發比較匹配。
- 通過調用
Ocu_StopChannel()
返回到通道停止狀態。 - 在此狀態下可以:
- 讀取計數器值 (Ocu_GetCounter)
- 設置閾值 (Ocu_SetAbsoluteThreshold/Ocu_SetRelativeThreshold)
- 設置引腳狀態 (Ocu_SetPinState)
- 設置比較匹配動作 (Ocu_SetPinAction)
- 通過調用
通知子狀態:
- 通知關閉狀態 (NOTIFICATION_DISABLED):不會觸發通知回調。
- 通過調用
Ocu_EnableNotification()
轉換到通知開啟狀態。
- 通過調用
- 通知開啟狀態 (NOTIFICATION_ENABLED):可以觸發通知回調。
- 通過調用
Ocu_DisableNotification()
返回到通知關閉狀態。 - 當通知開啟且通道運行時:
- 在計數器值等于閾值時
- 觸發配置的通知回調函數
- 通過調用
根據源文檔的SRS_Ocu_00004,初始化OCU驅動程序后,所有通知都應該被禁用,所有通道都應該被停止。如果通道有關聯的輸出引腳,該引腳將被設置為配置中定義的默認值。
根據SRS_Ocu_00007,OCU驅動程序允許在運行時啟用/禁用通知,以防止調用不需要的通知(中斷),并允許在軟件執行流中選擇何時觸發第一個或下一個通知。
5. OCU驅動程序數據結構
5.1 配置類圖
下圖展示了OCU驅動程序的配置數據結構:
5.2 數據類型定義
OCU驅動程序定義了以下主要數據類型和結構:
頂層配置結構 (Ocu_ConfigType):
- 包含所有通道配置的容器結構。
- 屬性:
- ChannelConfigs:指向通道配置數組的指針。
- NumberOfChannels:配置的通道數量。
通道配置結構 (Ocu_ChannelConfigType):
- 定義每個OCU通道的特性。
- 屬性:
- ChannelId:通道的唯一標識符。
- CounterMaxValue:計數器的最大值。
- DefaultThreshold:閾值的默認值。
- HwChannel:分配的硬件通道。
- NotificationEnable:通知啟用狀態。
- NotificationCallback:通知回調函數。
- DefaultPinAction:比較匹配時的默認引腳動作。
- DefaultPinState:輸出引腳的默認狀態。
- CountDirection:計數方向(向上/向下)。
- CountResolution:計數器分辨率。
- HwSpecificConfig:指向硬件特定配置的指針。
引腳狀態類型 (Ocu_PinStateType):
- 定義輸出引腳的可能狀態。
- 值:
- OCU_LOW:低電平。
- OCU_HIGH:高電平。
引腳動作類型 (Ocu_PinActionType):
- 定義比較匹配時的可能引腳動作。
- 值:
- OCU_SET_LOW:設置為低電平。
- OCU_SET_HIGH:設置為高電平。
- OCU_TOGGLE:翻轉當前狀態。
- OCU_DISABLE:禁用動作。
計數方向類型 (Ocu_CountDirectionType):
- 定義計數器的計數方向。
- 值:
- OCU_COUNT_UP:向上計數。
- OCU_COUNT_DOWN:向下計數。
通知類型 (Ocu_NotifyType):
- 通知回調函數的類型定義。
- 當比較匹配發生時調用的函數指針。
硬件特定配置 (Ocu_HwSpecificConfig):
- 包含MCU特定的配置參數。
- 屬性:
- ClockSetting:時鐘設置。
- DmaEnable:DMA啟用狀態。
- HwResourceId:硬件資源ID。
- PinSelectionValue:引腳選擇值。
- 其他硬件特定配置:取決于具體MCU。
OCU驅動程序接口定義了以下API函數:
- Ocu_Init:初始化驅動程序。
- Ocu_DeInit:反初始化驅動程序。
- Ocu_StartChannel:啟動通道。
- Ocu_StopChannel:停止通道。
- Ocu_SetPinState:設置引腳狀態。
- Ocu_SetPinAction:設置比較匹配時的引腳動作。
- Ocu_GetCounter:獲取計數器值。
- Ocu_SetAbsoluteThreshold:設置絕對閾值。
- Ocu_SetRelativeThreshold:設置相對閾值。
- Ocu_EnableNotification:啟用通知。
- Ocu_DisableNotification:禁用通知。
根據源文檔的SRS_Ocu_00002,OCU驅動程序支持以下基本靜態配置:計數器最大值、計數分辨率/頻率、通知函數、閾值默認值、分配的硬件通道、通道符號名/ID、計數方向、輸出信號和默認輸出電平、硬件資源ID以及硬件觸發事件。
6. OCU驅動程序使用流程
6.1 序列圖
下圖展示了OCU驅動程序的典型使用序列:
6.2 調用流程
OCU驅動程序的使用流程可以分為以下幾個階段:
初始化階段:
- 應用軟件調用
Ocu_Init(配置參數)
初始化OCU驅動程序。 - OCU驅動程序初始化硬件寄存器和內部數據結構。
- 初始化完成后,所有通道停止,所有通知禁用,輸出引腳設置為默認狀態。
通道配置階段:
- 應用軟件調用
Ocu_SetPinState(通道ID, OCU_HIGH/OCU_LOW)
設置輸出引腳狀態。 - 應用軟件調用
Ocu_SetPinAction(通道ID, OCU_SET_HIGH/OCU_SET_LOW/OCU_TOGGLE)
配置比較匹配時的引腳動作。 - 應用軟件調用
Ocu_SetAbsoluteThreshold(通道ID, 閾值)
設置比較閾值。 - 應用軟件調用
Ocu_EnableNotification(通道ID)
啟用通知回調。
通道啟動階段:
- 應用軟件調用
Ocu_StartChannel(通道ID)
啟動通道。 - OCU驅動程序啟動計數器。
運行階段:
- 當計數器值等于閾值時,OCU硬件觸發比較匹配事件。
- OCU驅動程序執行配置的引腳動作并調用通知回調(如果已啟用)。
- 應用軟件可以調用
Ocu_GetCounter(通道ID)
讀取當前計數器值。 - 應用軟件可以調用
Ocu_SetRelativeThreshold(通道ID, 增量值)
設置新的相對閾值。
停止階段:
- 應用軟件調用
Ocu_StopChannel(通道ID)
停止通道。 - 應用軟件調用
Ocu_DisableNotification(通道ID)
禁用通知回調。
去初始化階段:
- 應用軟件調用
Ocu_DeInit()
去初始化OCU驅動程序。 - OCU驅動程序復位硬件寄存器和內部數據結構。
根據源文檔中的各項需求,這個使用流程完全符合AUTOSAR OCU驅動程序的設計規范。
/* OCU驅動程序使用示例 */
#include "Ocu.h"/* 通知回調函數 */
void MyOcuNotification(void)
{/* 處理比較匹配事件 *//* 例如:更新PWM占空比、觸發采樣等 */
}void ApplicationTask(void)
{Std_ReturnType result;uint8 channelId = OCU_CHANNEL_0;Ocu_ValueType counterValue;/* 1. 初始化OCU驅動程序 */result = Ocu_Init(&OcuConfigData);if (result != E_OK) {/* 處理錯誤 */return;}/* 2. 配置OCU通道 */Ocu_SetPinState(channelId, OCU_HIGH);Ocu_SetPinAction(channelId, OCU_TOGGLE);Ocu_SetAbsoluteThreshold(channelId, 1000); /* 設置比較閾值為1000 */Ocu_EnableNotification(channelId); /* 啟用通知回調 *//* 3. 啟動OCU通道 */result = Ocu_StartChannel(channelId);if (result != E_OK) {/* 處理錯誤 */return;}/* 4. 運行階段 *//* ... 應用邏輯 ... *//* 讀取當前計數器值 */counterValue = Ocu_GetCounter(channelId);/* 設置新的相對閾值(當前閾值 + 500) */Ocu_SetRelativeThreshold(channelId, 500);/* ... 更多應用邏輯 ... *//* 5. 停止OCU通道 */Ocu_StopChannel(channelId);Ocu_DisableNotification(channelId);/* 6. 去初始化OCU驅動程序 */Ocu_DeInit();
}
7. 總結
AUTOSAR OCU驅動程序提供了對微控制器輸出比較單元的標準化訪問接口,使上層軟件能夠以統一的方式使用輸出比較功能,而無需關心硬件細節。它的主要特點包括:
- 標準化接口:符合AUTOSAR標準,提供一致的API。
- 硬件抽象:屏蔽不同微控制器之間的硬件差異。
- 靈活配置:支持多種配置選項,適應不同應用需求。
- 狀態管理:提供清晰的狀態轉換和錯誤處理。
- 低資源占用:高效使用系統資源。
OCU驅動程序可用于多種應用場景,包括:
- 精確定時控制:如PWM生成、脈沖寬度測量等。
- 事件觸發:在特定時刻觸發動作或通知。
- 波形生成:通過控制輸出引腳生成特定波形。
- 傳感器接口:配合傳感器實現精確計時和測量。
7. 總結
AUTOSAR OCU驅動程序提供了對微控制器輸出比較單元的標準化訪問接口,使上層軟件能夠以統一的方式使用輸出比較功能,而無需關心硬件細節。它的主要特點包括:
- 標準化接口:符合AUTOSAR標準,提供一致的API。
- 硬件抽象:屏蔽不同微控制器之間的硬件差異。
- 靈活配置:支持多種配置選項,適應不同應用需求。
- 狀態管理:提供清晰的狀態轉換和錯誤處理。
- 低資源占用:高效使用系統資源。
OCU驅動程序可用于多種應用場景,包括:
- 精確定時控制:如PWM生成、脈沖寬度測量等。
- 事件觸發:在特定時刻觸發動作或通知。
- 波形生成:通過控制輸出引腳生成特定波形。
- 傳感器接口:配合傳感器實現精確計時和測量。
通過本文對OCU驅動程序架構、組件設計、狀態管理、數據結構和使用流程的詳細分析,開發者可以更好地理解和使用AUTOSAR OCU驅動程序,為基于AUTOSAR標準的汽車電子系統開發提供支持。