SemiDrive E3 SSDK boot_core 示例介紹

一、    概述

       本文主要介紹 SemiDrive E3 SSDK boot_core 示例,示例主要實現的功能為 sf core boot 其他 core。使用的為 debug 模式調試,所有核的代碼均使用 IAR 的 download and debug 功能下載在 ram 中運行。

硬體設備:E3640 GATEWAY 開發板

軟體包:SSDK PTG3.0

 
二、    代碼下載及 demo 介紹

使用 SemiDrive support 系統上的 SSDK Builder,選擇型號 E3640 和示例 app_demo/boot_core 生成參考代碼。

首先將撥碼開關撥至 1110 模式,上電後進入調試模式。

        打開 sf 文件夾下的 IAR 工程,編譯後點擊 download and debug,下載鏡像至 E3 gateway 開發板,並點擊 go 啟動調試,此時串口中會列印 log “Welcome to E3 BootCore Demo, this is core SF”。

 

圖 2.1 SF 核程序運行界面

 

         然後依次打開 SP0、SP1、SX0 和 SX1 的 IAR 工程,編譯後點擊 download and debug,下載鏡像至 E3 gateway 開發板,並點擊 go 啟動調試,此時串口會分別列印 log,“SP0 Boot By SF”、“SP1 Boot By SF”、“SX0 Boot By SF” 和 “SX1 Boot By SF”,最後會列印 log “SSDK E3 BootCore Demo Success” 表示示例成功運行。

 
圖 2.2 運行成功 log

 

三、    代碼解析

3.1 SF 程序流程

        首先進行初始化,復位 VIC1 模塊、初始化 clock 時鐘、VIC1 中斷、Pinmux 配置和串口號等,並列印歡迎信息。

使用 sp_split_mode(true); 將 SP 設置為 split 模式,SP0 和 SP1 作為兩個核使用。

        使用 sdrv_rstgen_write_general(&reset_general_reg_test, BOOT_SP0_FLAG); 將通用寄存器中 SP0 標誌位即第 0 位,設置為 1。然後使用 sdrv_core_remap(SDRV_REMAP_SP0, SP0_MEM_BASE) 跳轉到 SP0 核的地址,如果未跳轉成功,則 reset SP0 core。成功跳轉後,進入 while 循環,讀取通用寄存器的第 0 位,判斷是否為 0 。因為 SP0 核的程序在成功啟動後,會將通用寄存器的第 0 位清 0。

        SP0 成功啟動跳出 while 循環後,下一步 boot SP1,與 SP0 的步驟一致,sdrv_rstgen_write_general(); 將通用寄存器的第 1 位設置為 1。然後使用 sdrv_core_remap() 跳轉到 SP1 核的地址,未成功則 reset SP1 core。成功跳轉後,進入 while 循環,讀取通用寄存器的第 1 位,判斷是否為 0。在 SP1 核的程序成功啟動後,SP1 程序會將通用寄存器的第 1 位清 0,從而 SF 核程序跳出 while 循環。

SX0 和 SX1 的部分與 SP0 和 SP1 的部分一致,等到所有的核啟動後,則列印 demo 運行成功 log。

SF 核的代碼流程圖如下:

圖 3.1 SF core 程序流程圖


3.2 SP0/SP1/SX0/SX1 程序流程

SP0、SP1、SX0 和 SX1 的代碼邏輯一致,以 SP0 core 代碼為例進行解析。

       首先進行初始化,復位 VIC2、初始化 VIC2 中斷和串口。然後通過讀取通用寄存器中 SP0 標誌位,即第 0 位是否為 1,來判斷是否是由 SF 核啟動的 SP0 程序,如果是則列印 “SP0 Boot By SF”的 log,然後再將通用寄存器 第 0 位設置為 0,之後進去 for 死循環。

SX0 核的代碼流程圖如下:


圖 3.2 SX0 核代碼流程圖


四、    拓展分析

4.1 lock step 和 split

        示例中配置了 sp_split_mode() 和 sx_split_mode() 兩個 API,用於配置 SP 和 SX 是作為 lock_step 還是 split 使用,作為鎖步核時,程序只需要下載一份。

 

4.2 通用寄存器

        參考 TRM 的13.4 Reset Generator 章節,AP 域和 Safety 域均有 8 個 32 位的 通用寄存器,寄存器名稱為 GENERAL_REGn,offset 為 0x2004。

        示例中使用的是 id 為 2 的通用寄存器,根據 boot_core.h 中的宏定義,可以看到將 bit0 作為 SP0 的標誌位,bit1 作為 SP1 的標誌位,bit2 作為 SX0 的標誌位,bit3 作為 SX1 的標誌位。

        通用寄存器在 global reset 和看門狗復位的情況下都不會丟失。所以可以作為 OTA 升級的標誌位,在 APP 中置位其中一個 bit,復位後在 bootloader 中判斷是否升級。

 

4.3 Memory Map

參考 TRM 的 4.1 Memory Map 章節,E3640 的 IRAM 地址為 0x400000 至 0x7FFFFF。

       工程中分配的SF地址範圍為 0x404000 至 0x5FFFFF,SX0 的地址範圍為 0x600000 至 0x67FFFF,SX1 的地址範圍為 0x680000 至 0x6FFFFF,SP0 的地址範圍為 0x700000 至 0x77FFFF,SP1 的地址範圍為 0x780000 至 0x7FFFFF。

SF 的起始地址為 0x404000 的原因,是因為需要預留 16K 字節大小的空間給 ROM 程序使用。

        每個核的地址範圍可以通過修改 IAR 工程的 link 腳本(.icf) 文件內的定義。默認的配置僅為參考配置,可以根據實際使用需求來修改,不同的核地址空間不重複即可。

 

五、    參考文檔

  • 《SemiDrive_E3_SSDK_User_Guide》
  • 《E3400_E3600_MCU_TRM》
  • 《AppNote_E3_Boot_and_OTA》


歡迎在博文下方留言評論,我們會及時回復您的問題。

如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com   
作者:Eason Wang / 王寅森


更多資訊,請掃碼關注我們!



★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論