1 引言
在AUTOSAR分層架構中,MCAL是最基礎的一層。由于該層直接和單片機打交道,在整個開發流程中往往最靠前,在PCB測試過程中也發揮著至關重要的作用。
本文以MCAL的串口模塊為例,分別講述UART手工和工具鏈編程的方法。對于MCAL的其它模塊,設計思路和步驟是類似的,可參照本文的要點進行開發。
2 基本概念
為表述方便,首先對本文中出現的概念或術語進行說明,文中黑體字為“官方定義”,紅體字加入了本人的理解。
2.1 MCAL
MCAL(Microcontroller Abstraction Layer)指微控制器抽象層,是實現不同硬件接口統一化的特殊層。通過微控制器抽象層可將硬件封裝起來, 避免上層軟件直接對微控制器的寄存器進行操作。微控制器抽象層包括微控制器驅動(Microcontroller Drivers)、存儲器驅動(MemoryDrivers)、通信驅動(Communication Drivers)以及I/O驅動(I/O Drivers)。
簡單來說,MCAL就是主控芯片(單片機)的外設驅動。
2.2 靜態代碼和動態代碼
靜態代碼(Static Code)指各模塊功能的具體實現代碼;動態代碼(Dynamic Code)指由配置工具根據相關配置信息生成的代碼,也稱為配置代碼。
在AUTOSAR應用過程中,靜態代碼實現了某模塊的全部功能,且其內容在工具鏈不更新的前提下是不會改變的。而具體用到該模塊的哪些功能以及用何種方式實現這些功能,是由用戶通過工具配置出來的,配置結果生成在動態代碼的程序文件中。
2.3 配置文檔和設計文檔
在工具鏈開發過程中,文檔的編寫顯得尤為重要。原因是各個功能塊都是用工具配置出來的且生成代碼量極其龐大,通過代碼研讀的方式分析查找問題不太現實,需要把整個工作過程記錄下來。在MCAL開發過程中最好輸出如下2個文檔。
設計文檔:記錄MCAL模塊的整個設計過程,包括MCAL相關模塊的配置、初始化函數的調用、功能具體實現和調試過程等。
配置文檔:作為設計文檔的一部分,聚焦MCAL本模塊配置的詳細步驟。
2.4 MCAL用戶手冊
MCAL用戶手冊(User Manual)作為MCAL開發過程中最重要的文檔,存在于“EB Tresos Studio”(MCAL配置工具)的安裝包中。
3 設計思路
下面著重講述手工方式和工具鏈方式設計主控芯片外設驅動在思路上的差別。
3.1 單片機驅動手工編程設計思路
單片機底層驅動手工編程的設計步驟如圖3-1所示。
圖3-1: 手寫代碼實現單片機外設驅動步驟
3.2 單片機驅動工具鏈開發設計思路
單片機底層驅動工具鏈開發的設計步驟如圖3-2所示。
圖3-2: 工具鏈開發實現單片機外設驅動步驟
3.3 注意事項
這里著重強調一點,在用工具鏈開發單片機外設驅動的過程中,千萬不要像傳統方法那樣研究單片機的寄存器和時序。AUTOSAR工程數據結構復雜,函數調用層級眾多,在短時間內將某個模塊的靜態代碼研究明白不太現實。從實例和配置項含義入手,再配合以局部改動和調試,往往能取得事半功倍的效果。
4 手寫代碼實現方法
用手工編程方式實現單片機UART模塊,主要包括初始化、中斷處理、數據收發等幾部分,收發數據往往以字節為單位進行,圖4-1和圖4-2為手工方式實現UART模塊的代碼段截圖。
圖4-1: UART手寫代碼截圖-寄存器配置
圖4-2: UART手寫代碼截圖-功能實現
5 AUTOSAR工具鏈實現方法
下面列出AUTOSAR工具鏈實現UART功能的步驟,這里將TC275的P14.10和P14.8用做UART的發送和接收管腳。
表5-1: 主控芯片和工具一覽表
序號 | 項 | 內容 |
1 | 主控芯片 | Infinean TC275 |
2 | MCAL工具 | EB Tresos Studio 16.0 |
3 | AUTOSAR工具 | ETAS ISOLAR-AB 4.0 |
4 | OS工具 | RTA-OS 5.6.3 |
5 | IDE | Hightec 4.9.2 |
5.1 Port模塊配置
首先需要配置參與串口通信的P14.8和P14.10,重點是將P14.10的功能配置為“ATX1”。
表5-2: P14.8參數配置
序號 | 配置項 | 配置值 | 說明 |
1 | PortPinId | 232 | 每個管腳唯一的ID號,不可配置 |
2 | PortPinSymbolicName | PORT_14_PIN_8 | 用戶為P14.8管腳定義的名字 |
3 | PortPinDirection | PORT_PIN_IN | 管腳用作輸入 |
4 | PortPinDirectionChangeable | NC | 因未使能相應API函數,不可配置 |
5 | PortPinInputCharacteristic | PORT_PIN_IN_NO_PULL | 無上下拉輸入 |
6 | PortPinInputHysteresis | FALSE | 不啟用滯后功能 |
7 | PortPinOutputCharacteristic | NC | 輸入管腳不可配置 |
8 | PortPinLevelValue | PORT_PIN_LEVEL_LOW | 管腳缺省值為0 |
9 | PortPinInitialMode | PORT_PIN_MODE_GPIO | 用作通用輸入輸出管腳 |
10 | PortPinModeChangeable | NC | 因未使能相應API函數,不可配置 |
11 | PortPinDriverStrength | NC | 輸入管腳不可配置 |
12 | PortPinPadLevel | PORT_PDR_CMOS_AUTOMOTIVE_LEVEL | 管腳電平級別:車輛電平 |
13 | PortPinAnalogInput | NC | 非特定管腳不可配置 |
14 | PortPinControllerSelect | NC | 非特定管腳不可配置 |
表5-3: P14.10參數配置
序號 | 配置項 | 配置值 | 說明 |
1 | PortPinId | 234 | 每個管腳唯一的ID號,不可配置 |
2 | PortPinSymbolicName | PORT_14_PIN_10 | 用戶為P14.10管腳定義的名字 |
3 | PortPinDirection | PORT_PIN_OUT | 管腳用作輸出 |
4 | PortPinDirectionChangeable | NC | 因未使能相應API函數,不可配置 |
5 | PortPinInputCharacteristic | NC | 輸出管腳不可配置 |
6 | PortPinInputHysteresis | NC | 輸出管腳不可配置 |
7 | PortPinOutputCharacteristic | PORT_PIN_OUT_PUSHPULL | 推挽輸出 |
8 | PortPinLevelValue | PORT_PIN_LEVEL_LOW | 管腳缺省值為0 |
9 | PortPinInitialMode | PORT_PIN_MODE_ALT4 | 可選輸出功能1:TOUT71 |
10 | PortPinModeChangeable | NC | 因未使能相應API函數,不可配置 |
11 | PortPinDriverStrength | PORT_CMOS_SPEED_GRADE1 | 驅動強度:CMOS速度等級1 |
12 | PortPinPadLevel | PORT_PDR_CMOS_AUTOMOTIVE_LEVEL | 管腳電平級別:車輛電平 |
13 | PortPinAnalogInput | NC | 非特定管腳不可配置 |
14 | PortPinControllerSelect | NC | 非特定管腳不可配置 |
5.2 Mcu模塊配置
Mcu配置分為AscLin和Clock兩部分。
5.2.1 ASCLIN配置
按照圖5-1和圖5-2所示將AscLin1配置為UART驅動。
圖5-1: MCU配置進入
圖5-2: ASCLIN配置
5.2.2 時鐘配置
按照圖5-3和圖5-4配置ASCLIN模塊的時鐘,本文示例配置為100MHz。
圖5-3: 時鐘配置進入
圖5-4: ASCLIN時鐘配置
5.3 Uart模塊配置
依次進行通用箱配置和UART集配置。
5.3.1 通用箱配置
下面介紹UART模塊通用(General)箱的配置情況,圖5-5為配置界面,表5-4為各項的配置參數和簡要說明。
圖5-5: UART模塊通用箱配置界面
表5-4: UART模塊通用箱參數配置
序號 | 配置項 | 配置值 | 說明 |
1 | Config Variant | VariantPostBuildSelectable | |
2 | Name | UartGeneral | 配置箱名稱 |
3 | UartDevErrorDetect | false | 開發錯誤檢測禁止 |
4 | UartIndex (0 -> 255) | 0 | Uart索引,必須為0 |
5 | UartVersionInfoApi | false | 版本信息API禁用 |
6 | UartDeInitApi | false | Uart反向初始化API禁用 |
7 | UartAbortReadApi | false | Uart中止接收API禁用 |
8 | UartAbortWriteApi | false | Uart中止發送API禁用 |
9 | UartPBFixedAddress | false | 配置參數集不存放固定地址 |
10 | UartDebugSupport | false | Uart調試功能禁用 |
11 | UartResetSfrAtInit | false | 禁止在Uart初始化前復位相關SFR的缺省值 |
12 | UartSleepEnable | true | 當收到MCU的休眠請求時ASCLIN模塊進入休眠狀態 |
13 | UartRunningInUser0Mode | false | |
14 | UartUserModeInitApiEnable | false | |
15 | UartUserModeDeInitApiEnable | false | |
16 | UartUserModeRuntimeApiEnable | false |
5.3.2 UART集配置
下面介紹Uart集(UartConfigSet)箱的配置情況,圖5-6為其配置界面。
圖5-6: Uart集配置界面
1.通用配置
圖5-7為Uart集通用(General)箱的配置界面,表5-5為各項的配置參數和簡要說明。
圖5-7: Uart集通用參數配置界面
表5-5: Uart集通用參數配置
序號 | 配置項 | 配置值 | 說明 |
1 | UartSysClockRef | /Mcu/Mcu/McuModuleConfiguration_0/McuClockSettingConfig_0/McuClockReferencePoint | Uart系統時鐘引用,MCU模塊配置值為100MHz |
2.Uart通道配置
圖5-8為Uart通道(UartChannel)箱的配置界面,表5-6為各項的配置參數和簡要說明。
圖5-8: Uart通道配置界面
表5-6:Uart0通道參數配置
序號 | 配置項 | 配置值 | 說明 |
1 | Name | UartChannel_0 | 配置箱名稱 |
2① | UartBaudRate | 19200 | Uart通信波特率 |
3 | UartHwUnit | ASCLIN1 | 硬件ASCLIN通道,使用P14.8(RXD)和P14.10(TXD)口 |
4 | UartChannelId | 0 | Uart通道ID,不可配置 |
5 | UartAutoCalcBaudParams | true | 自動波特率計算使能 |
6 | UartChanBaudNumerator | - | BRG寄存器的分子域,自動計算波特率時無需配置 |
7 | UartChanBaudDenominator | - | BRG寄存器的分母域,自動計算波特率時無需配置 |
8 | UartChanBaudPrescalar | - | BITCON寄存器的分頻域,自動計算波特率時無需配置 |
9 | UartChanBaudOverSampling | - | BITCON寄存器的采樣過密域,自動計算波特率時無需配置 |
10 | UartRxPinSelection | SELECT_DATALINE_D | Rx口選擇:P14.8為ASCLIN1的數據線D |
11 | UartDataLength | 8 | Uart數據長度 |
12 | UartStopBits | 1 | Uart停止位 |
13 | UartParityBit | NOPARITY | Uart奇偶校驗 |
14 | UartCTSEnable | false | CTS功能禁止 |
15 | UartCTSPolarity | - | CTS功能禁止時無需配置 |
16 | Name | UartNotification | 配置箱名稱 |
17 | UartTransmitNotifPtr | UartTransmitNotifPtr | 發送完畢的通知函數 |
18 | UartRecieveNotifPtr | UartReceiveNotifPtr | 接收到數據的通知函數 |
19 | UartAbortTransmitNotifPtr | NULL_PTR | 中止發送操作后調用 |
20 | UartAbortReceiveNotifPtr | NULL_PTR | 中止接收操作后調用 |
①波特率計算公式(fA= 100MHz)
5.3.3 版本配置
下面介紹Uart模塊版本(Published Information)箱的配置情況,圖5-9為配置界面,表5-7為各項的配置參數和簡要說明。
圖5-9: Uart模塊版本箱配置界面
表5-7: Uart模塊版本箱參數配置
序號 | 配置項 | 配置值 | 說明 |
1 | ArMajorVersion | 0 | Autosar主版本,不可配置 |
2 | ArMinorVersion | 0 | Autosar子版本,不可配置 |
3 | ArPatchVersion | 0 | Autosar補丁版本,不可配置 |
4 | SwMajorVersion | 1 | 軟件主版本,不可配置 |
5 | SwMinorVersion | 3 | 軟件子版本,不可配置 |
6 | SwPatchVersion | 0 | 軟件補丁版本,不可配置 |
7 | ModuleId | 255 | 模塊ID,不可配置 |
8 | VendorId | 17 | 供應商ID,不可配置 |
9 | VendorApiInfix | - | API中綴,不可配置 |
10 | Release | _TRICORE_TC275 | 發布,不可配置 |
5.4 Irq模塊配置
根據需要配置UART模塊的中斷類型和中斷類別,UART的中斷類型包括Tx中斷、Rx中斷和Err中斷;中斷類別分為一類中斷和二類中斷,兩者的區別和配置方法如表5-8所列。
表5-8: 中斷類別說明
事項 | 一類中斷 | 二類中斷 |
含義 | 中斷服務子程序直接響應 | 由操作系統接管 |
類別配置① | 在MCAL的Irq模塊配置為CAT1 | 在MCAL的Irq模塊配置為CAT23 |
優先級配置② | 在MCAL的Irq模塊中配置 | 在RTA-OS中配置,MCAL的Irq模塊寫0 |
應用③ | 通常用于與DMA配合的收發中斷 | 用于不需要與DMA配合的中斷 |
中斷初始化函數調用④ | 必須調用相應的中斷初始化函數 | 無需調用相應的中斷初始化函數 |
①配置的目的是為了打開Xxx_Irq.c中的相應宏,如圖5-10所示
圖5-10: 中斷服務子程序示例
②數值越大優先級越高
③與DMA配合的中斷,處理源(Irq
④中斷初始化函數的格式:Irq
5.4.1 MCAL中斷配置
按照圖5-11和圖5-12配置MCAL的Irq模塊,配置參數如表5-9所列,其余項使用缺省值。
圖5-11: AscLin中斷配置進入
圖5-12: AscLin中斷配置
表5-9: AscLin中斷參數配置
序號 | 配置項 | 配置值 | 說明 |
1 | IrqAscLin1TxCat | CAT23 | 選擇二類中斷 |
2 | IrqAscLin1RxCat | CAT23 | 選擇二類中斷 |
3 | IrqAscLin1ErrorCat | CAT23 | 選擇二類中斷 |
4 | IrqAscLin1TxPrio | 0 | 二類中斷優先級在RTA-OS中配置 |
5 | IrqAscLin1RxPrio | 0 | 二類中斷優先級在RTA-OS中配置 |
6 | IrqAscLin1ErrorPrio | 0 | 二類中斷優先級在RTA-OS中配置 |
7 | IrqAscLin1TxTos | CPU0 | 處理源為CPU0 |
8 | IrqAscLin1RxTos | CPU0 | 處理源為CPU0 |
7 | IrqAscLin1ErrTos | CPU0 | 處理源為CPU0 |
5.4.2 RTA-OS中斷配置
在RTA-OS環境下按照圖5-13配置表5-10列出的中斷。
圖5-13: OS中斷配置
表5-10: OS中斷配置參數
序號 | 名稱 | 類別 | 優先級 | 地址 |
1 | ASCLIN1EX_ISR | CATEGORY_2 | 37 | ASCLIN 1 Error (SRC_ASCLIN1ERR) |
2 | ASCLIN1RX_ISR | CATEGORY_2 | 38 | ASCLIN 1 Receive (SRC_ASCLIN1RX) |
3 | ASCLIN1TX_ISR | CATEGORY_2 | 39 | ASCLIN 1 Transmit (SRC_ASCLIN1TX) |
注意:上表中的“名稱”項非自行命名,須與Xxx_Irq.c中的名稱一致,否則編譯無法通過。
圖5-14: 中斷配置名稱示例
5.4.3 代碼生成
需在RTA-OS中生成OS代碼,再在ISOLAR-AB中進行抽取、BSW代碼生成、RTE代碼生成等操作。
5.5 初始化函數調用
UART模塊初始化函數調用在EcuM模塊中進行。
5.5.1 模塊配置
在ISOLAR-AB中按照圖5-15和圖5-16的步驟配置表5-11中的參數。
圖5-15: EcuM配置啟動
圖5-16: EcuM串口初始化配置
表5-11: Uart初始化參數配置
序號 | 配置項 | 配置值 | 說明 |
1 | ShortName | Uart | 配置箱名稱 |
2 | EcuMModuleID | Uart | 初始化模塊的短名稱 |
3 | EcuMModuleParameter | POSTBUILD_PTR | 函數原型和輸入參數定義 |
4 | EcuMModuleService | Init | 模塊初始化方式,按照這里配置的初始化函數調用方式為Uart_Init(&Uart_Config) |
5 | EcuMRbDriverInitCoreId | - | 指定驅動初始化被哪個核調用 |
6 | EcuMRbMonitoringCapable | - | 指定模塊不生成監控服務 |
7 | EcuMRbSequenceID | - | 生成的功能樁基于模塊配置的順序 |
8 | EcuMModuleRef | - | 模塊示例的外部引用,不配置EcuMModuleID時有效 |
5.5.2 代碼編寫
在程序文件中編寫如圖5-17所示的宏定義。
圖5-17: Uart初始化宏定義
5.6 調試代碼編寫
UART模塊常用的API函數如表5-12所列。
表5-12: UART模塊API函數功用
序號 | 函數名 | 輸入參數 | 輸出參數 | 說明 |
1 | Uart_Init | Uart配置集指針 | 無 | UART模塊初始化 |
2 | Uart_Read |
Channel:接收數據的Uart通道 MemPtr:接收數據存儲首地址 Size:準備接收的字節數 |
無 | UART接收 |
3 | Uart_Write |
Channel:發送數據的Uart通道 MemPtr:發送數據存儲空間首地址 Size:要發送的字節數 |
無 | UART發送 |
4 | UartTransmitNotifPtr | ErrorId:錯誤ID | 無 | UART發送完畢通知函數 |
5 | UartReceiveNotifPtr | ErrorId:錯誤ID | 無 | UART接收完畢通知函數 |
調試代碼的功用:將接收到的25字節數據發出,圖5-18為其主要代碼的截圖。
如果接收的數據少于25字節,只有在收全25字節后,才執行數據發送的操作;如果接收的數據多于25字節,只接收前25字節并發出。
圖5-18: UART收發調試核心代碼
審核編輯:劉清
-
微控制器
+關注
關注
48文章
7495瀏覽量
151082 -
單片機
+關注
關注
6032文章
44525瀏覽量
633224 -
AUTOSAR
+關注
關注
10文章
350瀏覽量
21481 -
Uart串口
+關注
關注
0文章
29瀏覽量
6799
原文標題:從手寫代碼到AUTOSAR工具鏈_MCAL應用篇
文章出處:【微信號:eng2mot,微信公眾號:汽車ECU開發】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論