S32K1XX偵錯--S32K116的flash擦寫程式移植

2020-09-21 13:00:32

1、環境

  • S32DS IDE

2、背景

  • NXP官方出的開發工具 S32KDS提供了影象化設定工具PE(Processor Export),所有外設可以在介面中設定,然後自動生成程式碼。
  • 這樣雖然方便了點,但個人感覺對學習不是很有利。操作起來方便,但對底層接觸的就比較少,想看他底層部分,巢狀太多層,看起來很累。
  • 所以我參考他們的暫存器版的程式,自己編寫自己所需。但有些沒有暫存器版本,例如flash的擦寫部分就沒有參考程式,所以我只能參考PE生成的程式進行移植。

3、偵錯過程

  • 先找個官方基礎例程,作為基礎移植工程。

  • 移植過程還是用原來官方程式的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