一、簡介
目前在支持客戶搭建 NXP HVBMS 環境的過程中,客戶有時會遇到“Freemaster 無法檢索到正確的埠並顯示實時數據”的問題。所以這裡將簡單介紹一下 Freemaster 驅動安裝過程中一些關鍵的點。
二、安裝流程
用戶可以先通過 Automotive Software Package Manager | NXP Semiconductors 鏈接下載對應的安裝捆綁包(S32K344 或 S32K358)。

安裝對應安裝順序將 S32K3 以及 BMS 的 SDK 安裝完畢之後,用戶需要進入 “S32K3_S32_FreeMaster_1_2_1_RTM”將 SDK “com.nxp.s32ds.s32k3.sdk.freemaster.v_3.0.repository_1.0.0.202308041202.zip ”通過 S32DS 的“Help --> Install New Software”安裝。這樣可以保證“FREEMASTER_S32K344_3.0.0_PATH ”路徑建立起來,以便後續引用。
緊接著,需要便可以將 SDK 安裝完畢之後的源文件以及頭文件(位於..\S32DS.3.5\S32DS\software\FreeMASTER_S32K3_v3.0\src)鏈接到工程中,並且將 template 文件夾中的 Freemaster 配置頭文件複製到工程中。

之後就是在工程屬性設置中將“src/common”、“src/drivers/dreg/S32K”、“src/platforms/gen32le”以及“freemaster_cfg.h 所在到的文件夾”全部添加進 include 路徑:

上述步驟完成後就是調整 main.c 中的內容,首先確保 "freemaster.h" 等文件有被 include。
/* Including FreeMASTER Driver */
#include "freemaster.h"
#include "freemaster_cfg.h"
#include "freemaster_s32k3xx_lpuart.h"
這裡需要結合 S32K3 具體的資源進行調整,舉個例子,如果我使用的是 LPUART0:
/* Initialize the UART driver */
Uart_Init(NULL_PTR);
/* Initialize FreeMASTER */
FMSTR_SerialSetBaseAddress((FMSTR_ADDR)IP_LPUART_0_BASE);
FMSTR_Init();
由於 S32K3 配置中斷,將 “freemaster_s32k3xx_lpuart.h”中定義的 FMSTR_SerialIsr 添加至 LPUART interrupt handler 中:
/**************************************************************************//*!
*
* @brief Process FreeMASTER serial interrupt (call this function from SCI ISR)
*
******************************************************************************/
void FMSTR_SerialIsr()
{
/* process incoming or just transmitted byte */
#if (FMSTR_LONG_INTR) || (FMSTR_SHORT_INTR)
FMSTR_ProcessSerial();
#endif
}
#else /* !(FMSTR_DISABLE) */
/* Empty API functions when FMSTR_DISABLE is set */
void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base)
{
FMSTR_UNUSED(base);
}
void FMSTR_SerialIsr()
{
}
#endif /* !(FMSTR_DISABLE) */

接著在“freemaster_cfg.h”中需要啟用中斷。
//! Select interrupt or poll-driven serial communication
#define FMSTR_LONG_INTR 0 // Complete message processing in interrupt
#define FMSTR_SHORT_INTR 1 // Queuing done in interrupt
#define FMSTR_POLL_DRIVEN 0 // No interrupt needed, polling only
最後在 main loop 中調用 FMSTR_Poll(); 即可。
/* FreeMaster Poll state keep can comm */
case FREEMASTER_COM:
FMSTR_Poll();
break;

三、參考文檔
[1] FreeMASTER_1.2.1_RTM_S32K3_Release_Notes.pdf
[2] FreeMASTER_UG.pdf
[3] BMS_SWInstalationGuide_Bring-up_2024.01.pdf
評論