01
簡介
MCAL:微控制器抽象層;位于BSW層中的最下層;
MCAL細分,可將驅動分為:微控制器驅動、存儲器驅動、通信驅動、IO驅動:
02
MCAL的配置(EB-Tresos)
1.PORT
我理解的PORT:MCAL層中的IO驅動組中的pin腳總體配置:
Port就是芯片上的每個pin腳,可以配置成DIO ADC PWM ICU等單引腳的功能,也能配置成CAN的TX或者RX、SPI的MOSI等等其他1功能的單個pin腳功能;
總之,PORT就是芯片上的具體的某個引腳。
配置如下:
PortPinId:邏輯上的Id值,從1遞增 PinId:對應[芯片XX]芯片手冊的pin引腳ID,根據(jù)實際使用選擇對應的pin引腳 Mux:選擇PortPin用作哪個功能,最多八個,選擇復用的功能需要查看TRM來選擇 InputSelect:根據(jù)實際pin使用功能決定輸入選擇;比如Port用作IO Input 則選擇SEL_NONE;比如用作CANFD1_Rx,則選擇對應的CANFD1_Rx(參考[芯片XX]_Procesor_TRM_Rev_00.06_For_xxx.pdf的IO Control/PINCTRL_SAFETY/Input Source Select) PadSetting:需要根據(jù)該Port用作的功能進行選擇,如果是GPIO則選擇PAD_SETTING_DEFAULT,如果是CAN則選擇PAD_SETTING_CAN;有些pin比較特殊,建議沿用之前的配置。 OpenDrain:是否啟用開漏,選擇是啟用。 PortPinModeChangeable:是否啟用在APP中更改PortPin的模式,一些特定場合會用到。 PortPinDirection: Port的方向,輸入:PORT_PIN_IN, 輸出:PORT_PIN_OUT PortPinDirectionChangeable:是否可以在程序運行過程中改變PortPin的方向(輸入,輸出)。 PortPinLevelValue:設置PortPin的初始化,只對Outout有效 PortPinInitialMode:不需要配置
2.DIO
DIO一共分為五組,如下圖所示:
Dio沒什么好配置的,只需要按照對應的ChannelId 更改下Name就好了。
3.ADC
[芯片XX]只有一個ADC內(nèi)含8個通道,最大支持12位精度(8,10,12);
AdcPrescale: [公司]的[芯片XX]是填的199, BaseClock = 400MHz ,基于400MHz進行分頻。
AdcLogicalChannelId:邏輯通道從0遞增 AdcPhysicalChannelId:物理通道和邏輯通道保持一致,否則數(shù)據(jù)讀取不正確 AdcChannelResolution:選擇ADC的采樣精度8/10/12 AdcSampleFrequency(Hz):通道的采樣頻率,ADC一共八個通道,代碼中配置每個通道采樣兩次(MCAL暫時不能配置),內(nèi)部FIFO的WaterLevel=64,按照配置中的800Hz來算(1/800hz*16)*64=5ms
image-20240107211227399
AdcGroupConversionMode:配置連續(xù)采樣和單次采樣,目前[芯片XX]只支持連續(xù)采樣 AdcGroupTriggsrc:ADC_TRIGG_SRS_SW:由軟件API調(diào)用促發(fā)的組 ADC_TRIGG_SRC_HW:由硬件觸發(fā)的組 AdcNotification:[芯片XX]ADC采樣必須使用中斷模式,所以配置一個Notification進行數(shù)據(jù)處理。
4.CAN
4.1 CAN-General
VirtualCanEnable:指定CAN消息是否由(SDPE)半驅動器包引擎路由。如果啟用,所有的CAN驅動程序將由SDPE處理 CanDevErroDetect:指定是否在每個API中啟用錯誤檢測 CanIndec:對于[芯片XX]系列CAN驅動,該參數(shù)應該始終是0 CanLPduReceiveCalloutFunction:當收到幀時調(diào)用用戶回調(diào)函數(shù) CanMainFunctionBusoffPeriod:指定調(diào)用Can_MainFunction_BusOff的周期 CanMainFunctionWakeupPeriod:指定調(diào)用Can_MainFunction_Wakeup的周期 CanMainFunctionModePeriod:指定調(diào)用Can_MainFunction_Mode的周期 CanMultiplexedTransmission:是否支持多路傳輸,多路傳輸用于防止傳輸幀時的優(yōu)先級反轉 CanTimeoutDuration:指定阻塞功能的超時時間,例如模塊的enable/disable, freeze/unfreeze在控制器的初始化,注意:目前不支持此配置 CanVersionInfoApi:指定是否支持Can_GetVersionInfo函數(shù) CanSupportTTCANRef:[芯片XX]系列不支持TTCAN,因此不使用此配置。
CanControllerActivation:Channel配置信息必須勾選此處才會生效 CanControlledId:需和DaVinci中的ControlledId保持一致,不一致時,實際通信過程中CAN通道以DaVinci中的配置為準,會導致通道開啟錯誤,進而無法通信的問題。 CanControllerBaseAddress:要和CanControllerInstance保持一致,BaseAddress參考TRM手冊。 例如:CAN1 0xF0030000 CAN 2 0xF0040000 CAN 3 0xF0050000… CanRxProcessing:INTERRUPT/POLLING CanTxProcessing:INTERRUPT/POLLING CanWakeupFunctionalityAPI:沒驗證過該功能 CanWakeupProcessing:INTERRUPT/POLLING CanWakeupSupport:沒驗證過該功能 CanIndividualRxMaskEnable:勾選啟用Rxfiltermask功能 CanControllerDefaultBaudrate:需要現(xiàn)在CanControllerBaudrateConfig配置波特率,然后才能選擇 CanCpuClockRef:Clock時鐘選擇24M
在 CanControllerBaudrateConfig 選項卡中配置CAN的波特率和采樣點等。 CanControllerBaudRate:直接填寫期望的波特率,在驅動中會自動進行分頻計算 CanControllerBaudRateConfigID:ID從0開始遞增 CanControllerPropSeg:廣播同步段 CanControllerSeg1:同步緩沖段1 CanControllerSeg2:同步緩沖段2 CanControllerSyncJumpWidth:同步跳轉段。 Note:采樣點值的確定需根據(jù)客戶的輸入來確定,采樣點計算方法: (1+CanControllerPropSeg+CanControllerSeg1)/(1+CanControllerPropSeg+CanControllerSeg1+CanControllerSeg2)*100%=采樣點 在計算采樣點參數(shù)時要注意這四個參數(shù)的關系,具體請參考百度或者J1939定義,否則EB不能生成代碼。
CanMessageBufferRegionName:選擇CAN_MB_REGION_0/CAN_MB_REGION_1,每個region有256byte CanMessageBufferRegionSize:選擇CAN_MB_8_BYTES_PAYLOAD/CAN_MB_16_BYTES_PAYLOAD/CAN_MB_32_BYTES_PAYLOAD/CAN_MB_64_BYTES_PAYLOAD,每個region大小512byte,選擇CAN_MB_8_BYTES_PAYLOAD一共可以接收512/(8+8)=32幀報文。如果配置成CAN_MB_32_BYTES_PAYLOAD一共可以接收512/(32+8)=12
4.2 CAN-CanHardwareObject
在CanHardwareObject對CAN信號進行配置,該處配置需和DaVinci cfg的CanHardwareObject保持一致,否則協(xié)議棧處理會出現(xiàn)信號錯位的問題。此處先講解如何配置,然后再詳細講解如何和DaVinci cfg里的保持一致。
此處以一個Tx信號為例: CanHandleType:BASIC/FULL CanHwObjectCount:配置成Tx并選擇BASIC,配置決定該HTH可以使用幾個MailBoxs,此處配置為32,第一個Region全部用作了發(fā)送 CanIdType:STANDARD/EXTENDED/MIXED CanObjectId:需要和DaVinciCFG里面的保持一致 CanObjectType:TRANSMIT/RECEIVE CanControllerRef:該信號屬于哪路Cantroller就選哪路 CanMessageBufferRegionRef:選擇使用哪一個BufferRegion,一定要注意每個Region最多配置32個8Byte的報文
5.SPI
SpiMaxChannel:與SpiChannel選項卡配置的Channel值保持一致 SpiMaxJob:與SpiJob選項卡配置的Jobs值保持一致 SpiMaxSequence:與SpiSequence選項卡配置的Sequence值保持一致 SpiChannelBuffersAllowed:0:1B,1:EB,2:IB&EB SpiLevelDelivered:0:1B , 1: EB , 2: IB&EB
SpiCsSelection:CS_VIA_PERIPHERAL_ENGINE/CS_VIA_GPIO選擇SPI_SS或者GPIO作為CS,選擇CS_VIA_PERIPHERAL_ENGINE在SpiCsPin處選擇Port的配置,選擇CS_VIA_GPIO在SpiCsViaGpio處選擇Dio的配置 SpiHwUnit:CSIB1-CSIB8對應SPI0-SPI7
6.MCU
McuClockReferencePointFrequency:期望的Clock頻率和McuClockDefaultClock保持一致 McuClockDefaultClock:選項有MCU_CLOCK_UART_80M/MCU_CLOCK_TIMER_HIGH_FREQUENCY_400M/MCU_CLOCK_TIMER_LOW_FREQUENCY_24M/MCU_CLOCK_12C_133_3M/MCU_CLOCK_CANFD_80M/MCU_CLOCK_PWM_400M/MCU_CLOCK_PWM_EXT
我們使用了哪些外設模塊就需要在此處Enable它,否則會導致該模塊工作不正?;蛘叱跏蓟惓?。
如果勾選了外設,則該外設只能由SECURE Doamin訪問和使用,SAFETY Domain失去該模塊的使用權限。
配置Mcu_InitRamSection的大小和寫入值。(該截圖里的值和[公司]的配置是一樣的)。
7.Gpt
在[芯片XX] SOC 處理器中GPT模塊配置的時鐘是可以給其他模塊使用的,例如在現(xiàn)有的項目開發(fā)中,Gpt有用作Os Timer, System timer ,和電源芯片定時喂狗中斷等。
對于ICU模塊來說只能使用GPT的配置作為時鐘源。
[芯片XX]一共有8個Timer, 每個Timer有6個Channel,這6個Channel共享一個Timer時鐘源和分頻,換句話說,在APP中同一個Timer中最后生效的時鐘源和分頻是被最后一個初始化的Channel決定的。
6個Channel分別是:GPT_HW_TIMER_G0/GPT_HW_TIMER_G1/GPT_HW_LOCAL_A/GPT_HW_LOCAL_B/GPT_HW_LOCAL_C/GPT_HW_LOCAL_D, A/B/C/D共享一個中斷號,G0/1共享一個中斷號。支持使用同一個Timer的不能Channel,即使中斷號共享[芯片XX]會自動識別到底是哪一個Chnnale觸發(fā)的中斷,進而去調(diào)用你所配置的Notification.
Gpt基礎配置,選擇是否Enable某些功能和函數(shù)。
GptHwModule:[芯片XX]一共有8個Timer,每個Timer有6個Channel,這6個Channel 共享一個Timer時鐘源和分頻,換句話說,在APP中同一個Timer中最后生效的時鐘源和分頻是被最后一個初始化的Channel決定的,更詳細的介紹請參考[芯片XX]官方文檔。 GptHwModuleChannel:GPT_HW_TIMER_G0…GPT_HW_LOCAL_D GptChannelMode:Channel模式GPT_CH_MODE_CONTINUOUS/GPT_CH_MODE_ONESHOT Note:只有Local A/B/C/D可以配置成One shot模式 GptChannelTickFrequency:配置期望的頻率,和GptChannelClkSrcRef保持一致 GptChannelTickValueMax:配置該GPT channel 最大的Ticks值產(chǎn)生中斷或者其他 GptChannelClkSrcRef:選擇GPT的時鐘源
GptClockReference: 選擇GPT可以選擇配置的時鐘源,只能選擇已經(jīng)在MCU模塊配置好的時鐘。
8.ICU
對于ICU模塊來說只能使用GPT的配置作為時鐘源
ICU基礎配置,選擇是否Enable某些功能和函數(shù).
9.PWM
[芯片XX] 一共有8個PWM模塊,每個pwm模塊有四個子Channel,分別是A/B/C/D,四個子Channel共享同一個溢出值,所以子Channel的周期都一樣的,占空比可以單獨控制。更詳細的可以參考官方文檔。
PWM基礎配置,選擇是否Enable某些功能和函數(shù)
PwmIndex:暫時用不到
PwmHwModule:PWM_MODULE1/PWM_MODULE2/…/PWM_MODULE8 PwmPeriodDefault:設置PWM默認周期,我們通常在這里配置為0,如果配置成其他值且默認占空比也有配置,則初始化之后會立即輸出PWM波 PwmMcuClockReferencePoint:Pwm的時鐘源選擇,只能選擇在Mcu模塊中已存在的配置,目前只能選擇400MHz PwmModuleFrequency:不可修改 PwmHwModulePrescaler:Pwm的分頻系數(shù) 400MHz/(PwmHwModulePrescaler+1)=期望頻率
PwmSubChannelId: 子ChannelID 0/1/2/3
DutycycleDefault: 默認占空比,通常配置為0x0
Polarity: Pwm的極性,根據(jù)項目需求配置
IdleState: Pwm空閑狀態(tài),通常與Polarity相反。
03
項目實踐
1.說明:
項目實踐中,MCAL需要配置兩個新增功能,pwm和icu輸入捕獲。
功能描述:增加LSS8_EN(E12) / DI_AC_Wake(J4)PWM通道
(1)配置一個pin腳,讓其輸出pwm波形
(2)配置一個pin腳,讓其捕獲一個pwm波形
查看PinMap表格:
如圖excel-PinMap表格描述了單片機中的兩個引腳功能:
第一個:CPIO_C10引腳,配置成MIUX6的功能PWM3_CH2,Output模式的引腳,要輸出信號,【功能描述】里的內(nèi)容可以配置引腳名稱時用。
第二個:GPIO_H3引腳,輸入信號,使用的功能是MUX3,即TIM7_CH1,做輸入捕獲的功能。
3.配置第一個功能:PWM輸出
(1)配置PORT
找到GPIO_C10 ,配置名稱為DO_LSS8_Driver (截圖示例為新建一個port)
根據(jù)【PinMap】文檔中介紹的pin腳功能:配置。
(2)配置DIO
因為這個引腳十一輸出的引腳 所以需要配置DIO (相當于GPIO 輸出高電平或者低電平)
image-20240107212653255
根據(jù)【PinMap】文檔 ,查看MUX_0 = GPIO.IO58 ,配置IO58。
(3)配置PWM
引腳輸出高電平的波形配置成PWM波形(有占空比 周期等參數(shù)的波形)
先配置模塊,該芯片有8個PWM模塊,每個模塊有4個channel.
新增一個pwm模塊(即第三個pwm模塊) ,命名為PWMChannel_3 ,配置相關參數(shù)。
再配置子通道channel:
如上,完成【PinMap】文檔中的PWM3CH2的配置。
(4)配置MCU
添加PWM3的使能
如上,完成對引腳GPIO_C10的配置。
4.配置第二個功能:ICU輸入捕獲
(1)配置PORT
如【PinMap】文檔,找到GPIO_H3 ,配置如下:
(2)配置DIO
(3)配置GPT
需要用到時鐘驅動(【PinMap文檔中的MUX功能】) MUC3 = TIM7_CH1
【+】新增 ,配置如下:
(4)配置ICU
配置完成,生成代碼即可。生成的代碼是MCAL動態(tài)配置文件。
項目中,MCAL靜態(tài)庫和動態(tài)配置文件通常在不同路徑下:
SDK包:BSWShareUtilesG9_SDK: 工程件:BSWShareUtilesMicroSarStatic_G9:BSW層除MCAL外的其他模塊代碼:BsmWCanIFDem等 DavinCi配置生成代碼:CustomerConfigSourceMicroSarConfig:bsw層除mcal外的其他模塊的PBCfg.c和LCfg.c(例如Ea_Cfg.cOS_xxx_Cfg.c等等) MCAL靜態(tài)庫:BSWShareUtilesMCALStatic_G9:adc.hadc.c...MCAL層的驅動文件 MCAL動態(tài)配置文件:CustomerConfigSourceMcalConfig:Adc_PBCfg.cPort_Cfg.cPwm_Cfg.
審核編輯:黃飛
-
微控制器
+關注
關注
48文章
7565瀏覽量
151572 -
存儲器
+關注
關注
38文章
7507瀏覽量
163951 -
CAN
+關注
關注
57文章
2756瀏覽量
463871 -
AUTOSAR
+關注
關注
10文章
362瀏覽量
21618 -
IO驅動
+關注
關注
0文章
3瀏覽量
3656
原文標題:一網(wǎng)打盡AUTOSAR MCAL模塊
文章出處:【微信號:談思實驗室,微信公眾號:談思實驗室】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論