先找個官方基礎例程,作為基礎移植工程。
移植過程還是用原來官方程式的Project_Settings資料夾下 S32K116_16_flash.ld、S32K116_16_ram.ld、startup_S32K116.S、system_S32K116.c,後面需要關注到這幾個檔案
設定好外設,實現定時器,串列埠功能等之後(確保功能實現,說明移植相對沒問題),就開始移植PE生成程式flash_partitioning_s32k116的flash_driver.c,flash_driver.h兩個檔案。對應新增頭函數,對應初始化,呼叫兩個檔案所提供的函數。程式如下:
/* Disable the global interrupt */
INT_SYS_DisableIRQGlobal();
ret = FLASH_DRV_EraseSector(&flashSSDConfig, APP_PFLASH_START_ADDR, flashSSDConfig.PFlashSize - APP_PFLASH_START_ADDR);
/* Enable the global interrupt*/
INT_SYS_EnableIRQGlobal();
上面對應的APP_PFLASH_START_ADDR是我打算存放app程式的開始地址,INT_SYS_DisableIRQGlobal與INT_SYS_EnableIRQGlobal是開啟和關閉全域性中斷,其他引數可以參考原PE生成程式
執行起來,發現程式卡死,跳轉到DefaultISR,解決方法可以參考以下連結:S32K1XX偵錯–程式跑飛到DefaultISR
解決了DefaultISR問題,又出現跳轉到HardFault問題,解決方法可以參考以下連結:S32K1XX偵錯–快速定位HardFault
定位到是FLASH_DRV_CommandSequence函數的問題,多次查詢後,發現是相應的函數內容沒有從flash拷貝到RAM,程式跑起來跳轉過去,相當於跳轉到了一個空函數,所以出現HardFault
這時考慮到可能是連結以及啟動程式問題,於是打算大幹一場,處理移植問題(操作之前還是很有必要備份程式)。
準備開始替換Project_Settings資料夾下的幾個檔案,到PE所生成的程式flash_partitioning_s32k116處去找,從對應檔案處把內容全選複製過來,到現有程式全選貼上(因為有些檔案命名可能不一樣,但目的是一樣的),然後編譯
編譯過程中,可能還會有報錯,比如某些引數未定義,例如init_data_bss未定義,這個在startup.c和startup.h中有定義,再從PE處移植過來即可
可能還會有其他問題,再移植新增即可。
另附參考所提到的兩個連結:
[1]. S32K1XX偵錯–程式跑飛到DefaultISR
[2]. S32K1XX偵錯–快速定位HardFault