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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/99976.html
標籤:其他
