一、目的
已知客戶問題:基於 SSDK3.0 使用 sleep_gpio_wakeup demo 可以正常休眠喚醒,將 sleep_gpio_wakeup demo 中休眠喚醒相關的代碼移植到 XIP 的 sf demo 工程中,可以休眠但是無法正常喚醒。板卡:E3104。代碼:
圖 (1)
串口:
圖 (2)
要做什麼:將 sleep_gpio_wakeup 中休眠喚醒相關代碼移植到 XIP 的 sf demo 工程中,並解決問題。
二、過程
過程(板卡:E3210):
1. 跑通 E3210 Sleep_gpio_wakeup demo:
1.1、使用 JLINK 下載鏡像到 e3_176_ref 開發板,並啟動調試;撥碼 1110,選擇 flashloader 下載。
1.2、本 Demo 執行完成後,因為晶片進入休眠模式,此時 Jlink 會斷開連接,此時不要嘗試重新鏈接;撥碼 0000,log 列印 enter sleep。
1.3、撥動 GPIO_A0 撥碼開關,產生上升沿脈衝,喚醒晶片;撥碼 1000,喚醒成功。
圖 (1)
1.4 然後使用 Jlink attach 上晶片, 確認晶片已被喚醒 project->attach to runing targe
圖 (2)
udelay.h 放在頭文件里;middleware 中加入 udelay.c 文件;路徑:D:\Semidrive\train\internaltrain\ssdktrain\ssdktrain\project\E3_RTG3.0\ssdk\middleware\udelay
圖 (3)
debug 後一直循環,一直列印 SSDK E3 Sleep gpio wakeup Demo Success!
圖 (4)
單步執行,還在死循環里,單次列印 SSDK E3 Sleep gpio wakeup Demo Success。確認晶片已被喚醒。
2. 跑通 xip demo:
2.1 使用 JLINK 連接到開發板,撥碼到 0b1110 調試模式啟動開發板(或者 0b0000,保證此時 Jlink 可以連接即可。)
2.2 打開 sf XIP 工程,並編譯;
2.3 打開 bootloader 工程並切換到 FlashDebug 配置;
0)點擊編譯,此時 IAR 會把 SFS + bootloader 程序 + sf XIP 程序整體編譯為一個 elf 文件;
路徑:D:\Semidrive\train\internaltrain\ssdktrain\ssdktrain\project\E3_3.0\ssdk\boards\e3_176_ref\app_demo\xip\bootloader\IAR\FlashDebug\Exe
1)點擊 Erase memory 先擦除 flash(推薦但非必須);
2)點擊 Download active application 按鈕,IAR flashloader 下載上述 elf 到 flash 中;
圖 (5)
3)以 0b0000 模式啟動開發板,UART 列印輸出;
SSDK E3 Bootloader Success!
SSDK E3 XIP Demo, SF Boot Success;
圖 (6)
2.4 將bootloade r工程切換到 Debug 配置,點擊 Download and Debug 按鈕,即可對 bootloader 工程進行調試(此時由於沒有配置 flashloader, download and Debug 僅下載 bootloader 程序至 iram)
2.5 在 bootloade r程序啟動 sf 之後, 打開 sf 的 XIP 程序
選擇 Attach to Running Target, attach 到 sf 的 XIP 程序進行調試;此步後移植代碼;
圖 (7)
反覆啟動,串口列印如圖。
2.6 如果需要修改 sf 的 XIP 程序,可以直接使用 debug and download 進行下載調試。移植代碼的過程即修改到 sf 的 XIP 程序,修改後直接使用 debug and download 下載調試。
3. 移植E3210 Sleep_gpio_wakeup demo 的休眠喚醒代碼到 xip 的 sf demo:
xip sf 重新移植代碼後 down and debug,此時撥碼仍是 0000,在 flash 中啟動,已經 attach 到 sf 的 xip 程序;
圖 (8)
逐句移植;加入調用到的頭文件;頭文件相關見附件(1);將 power_cfg.c 與 pinmux_cfg.c 重新配置,並加入到 IDE boards 文件下;根據錯誤提示,將 IDE drives 加入和 sleep_sleep_gpio_wakeup 一樣的 source 文件:
Add sdrv_power.c 40個錯誤;
Add sdrv_power_core_context.c 37個錯誤;
Add sdrv_pmu.c 19 個錯誤;
Add sdrv_scr.c 19 個錯誤;
Add sdrv_smc.c 無錯誤;
圖 (9)
此時 down and debug 後無錯誤,進入 debug,點擊 run,串口列印進入睡眠;
圖 (10)
使 GPIO_A0 上升沿脈衝,沒有喚醒成功,串口保持原樣。復現問題。完整 sf 代碼見附件(2)。
4. 解決問題
將原廠釋放的 E3-SSDK-PTG3.0-NewFeature-6753543-Hibernate 進行解壓縮,我們來大致了解一下此 patch 中的相關思路:
- E3104/E3106/E3205/E3206 XIP 模式支持 Hibernate 睡眠喚醒。
2)上述四款晶片在 sf 下電時會將 XSPI 模塊(Flash 控制器)同時下電,而 XIP 模式運行依賴 XSPI。因此需要把睡眠喚醒後的初始化相關代碼放到 IRAM 里,XSPI 重新初始化完成後,再 XIP運行。
4.1 將 patch 中 new 文件夾中的文件覆蓋 E3_SSDK_PTG3.0/ssdk 對應的路徑,通過 IAR 編譯。
patch 內提供了 e3_176_ref/app_demo/power-xip (E3104/E3106/E3106)和 e3_144_ref/app_demo/power-xip(E3205)兩個board的demo,測試這兩個 demo 運行正常即可,運行方法參考 demo 目錄下的 readme.txt。
我們來觀察一下 “new”文件夾中的內容:
圖 (11)
boards->
圖 (12)
devices->
圖 (13)
remap->
圖 (14)
依次替換至 ssdk3.0;注意 power-xip 要更改名稱為 xip。
5. 證明問題已解決:
5.1 使用 JLINK 連接到開發板,撥碼到 0b1110 調試模式啟動開發板(或者 0b0000,保證此時 Jlink 可以連接即可);
5.2 打開 bootloader 工程,使用 Debug 配置進行編譯;
5.3 打開 wakeuploader 工程,使用 Debug 配置進行編譯;
5.4 打開 sf 工程,使用 FlashDebug 配置進行編譯
0)點擊編譯,此時 IAR 會把 SFS + bootloader + sf + wakeuploader 整體編譯為一個 elf 文件;
1)點擊 Erase memory 先擦除 flash(推薦但非必須);
2)點擊 Download active application 按鈕,IAR flashloader 下載上述 elf 到 flash 中;
3)以 0b0000 模式啟動開發板,UART 列印輸出;SSDK E3 Bootloader Success!然後執行 APP 程序,立刻進入休眠
4)撥動 BOOT_PIN1 (GPIO_A0) 喚醒,UART 列印輸出:SSDK E3 Hib gpio wakeup Demo Success!
圖 (15)
圖 (16)
附件:
頭文件相關附件(1):
power_cfg.h:
圖 (17)
power_cfg.c:
圖 (18)
pinmux_cfg.h:
圖 (19)
圖 (20)
完整 sf 代碼附件(2):
圖 (21)
三、 參考資料:
《SemiDrive_E3_SSDK_User_Guide_Rev01.04》
《AppNote_E3_Boot_and_OTA_Rev01.06》
歡迎在博文下方留言評論,我們會及時回復您的問題。如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com
作者:Rita Liu / 劉倩
評論