【 ATU NXP-S32K系列 】S32K bootloader 教學

S32K-Bootloader 教學 ( 基於 S32K148 )


1.  概述

1.1    功能描述

本範例將使用 S32DS for ARM 平台操作,由 S32K148_EVB 燒錄 bootloader 的程式

藉由 NXP 開發的 Java tool ,使用 UART 通訊將 APP 程式燒錄至 S32K148_EVB 相對應位址,APP 程式需先產生 S-record 燒錄檔來使用,最後燒錄不同 APP 程式,驗證相對應的功能是否可以 work ,確認燒錄成功。

2.   SDK 說明與使用

3.   Linker file 簡介

Linker file 為配置 Memory 重要文件,用來切割 flash & Ram ,定義名稱,使用Bootloader 功能的第一步,就是要針對 bootloader 需求來進行 Memory 的設置。下圖為使用 S32DS for ARM 平台,Linker file 資料位置



點選進入後,下圖框選的地方可以設置 heap & stack 的 size

 

這裡可以根據客戶 bootloader 需求來劃分 memory 位置,並且定義名稱。下圖為一般無 bootloader 功能配置 memory ,可以看到 m_text 將所有 flash 皆使用完畢。

 

這裡會說明兩種常見的 bootloader 配置,下圖為其中一種,應用在客戶 Application 程式 code size 太大時使用,缺點是只能離線更新。以下會說明如何配置此功能的 Linker file



先使用燒錄方式,將 bootloader 程式燒錄至 S32K MCU 中,Linker file 配置如下圖

 

以下為 Application code 的 Linker file 配置,flash 配置必須不能重疊 

 

下圖 bootloader 配置可實現比較多種應用,例如線上更新,在運作的狀態下,完成更新並跳轉程式,但是所需 memory 大小相對大 2 倍左右,根據客戶需求來討論 bootloader 架構

先使用燒錄方式,將 bootloader 程式燒錄至 S32K MCU 中,Linker file 配置如下圖
 

 

以下為 Application code 的 Linker file 配置,flash 配置必須不能重疊

 

 

4.  Bootloader 原理說明
如果需要完整章節內容與程式碼,請留言或聯絡 Michael.Gao@wpi-group.com 

4.1 Memory 配置

Memory 配置重點為不能重疊,code size 大小必須小於等於配置 address 的大小,根據客戶 bootloader 需求,使用 Linker file 配置符合客戶需求

4.2 flash 操作

4.3 Jump 指令

4.4 CRC check sum

4.5 bootloader 通訊接口

4.6 NXP bootloader 架構
 

5.  程式碼功能描述

5.1 功能概述

程式先將 UART 初始化,與 PC 端的 bootloader 進行 UART 通訊,UART 連線後,確認是否要更新,如果要更新,確認操作位址與 size 大小正確,先對 flash 進行 eraser 操作,之後驗證成功 eraser 後進行 flash program ,CRC 確認是否成功燒錄 ,最後將中斷以及 clock 設定 reset 後,跳轉至應用程式的 start address ,如果判斷不用更新,經過一段時間後,程式會直接跳轉至應用程式,如果客戶有其他需求,EEPROM 更新版本資訊,A,B code 判斷,新舊檔案選擇等等,可以在此架構下新增所需功能。

5.2 程式流程圖


6.  硬體接線圖

7.  相關 function 介紹

7.1  UART_Init

7.1.1 功能描述

設置字元長度,傳輸速率

指定錯誤回授、狀態回授的暫存器

Parity、stop bit 設定

7.1.2 函式原型

UART_Init ( const uart_instance_t * const instance , const uart_user_config_t *config )

7.1.3 參數

參數名稱

類型

描述

const instance

const uart_instance_t *

指定 UART 函式模塊

config

const uart_user_config_t *

設置 baud rate、字元長度、Parity、stop bit 設定……等等

 

7.1.4  return 值

STATUS_SUCCESS

STATUS_ERROR

STATUS_BUSY

STATUS_TIMEOUT

STATUS_UNSUPPORTED

7.1.5  範例

UART_Init(&uart_pal1_instance, &uart_pal1_Config0)



7.2  UART_SendData

7.2.1 功能描述

傳送資料

7.2.2 函式原型

UART_SendData ( const uart_instance_t * const instance , const uint8_t * txBuff , uint32_t txSize ) ;

 

7.2.3 參數

參數名稱

類型

描述

const instance

const uart_instance_t *

指定 UART 函式模塊

txBuff

const uint8_t

欲傳送的資料

txSize

uint32_t

傳送buffer的大小

 

7.2.4  return 值

     回傳STATUS_SUCCESS

7.2.5  範例

    UART_SendData ( &uart_pal1_instance , ( uint8_t* ) test_mode , 5 );

 

7.3  UART_ReceiveData

7.3.1 功能描述

接收資料

7.3.2 函式原型

UART_ReceiveData ( const uart_instance_t * const instance , uint8_t * rxBuff , uint32_t rxSize ) ;

 

7.3.3 參數

參數名稱

類型

描述

const instance

const uart_instance_t *

指定 UART 函式模塊

rxBuff

const uint8_t

欲接收資料的buffer

rxSize

uint32_t

接收buffer的大小

 

7.3.4  return 值

回傳 STATUS_SUCCESS

7.3.5  範例

UART_ReceiveData ( &uart_pal1_instance , (uint8_t*)rxBuff , 30 ) ;

 

7.4  flash program

7.4.1 功能描述

接收資料

7.4.2 函式原型

uint8_t comm_verify_phrase ( BootPhraseStruct *BP );

 

7.4.3 參數

參數名稱

類型

描述

BP

BootPhraseStruct *

S-record typle

資料 size

Address 矩陣

Data 矩陣

CRC 驗證碼

 

7.4.4  return 值

回傳 error 值

7.4.5  範例

comm_verify_phrase ( &BP );

 

7.5  Jump

跳轉程式

Void JumpToUserApplication ( unsigned int userSP,  unsigned int userStartup)

{

    /* Check if Entry address is erased and return if erased */

    if(userSP == 0xFFFFFFFF){

       return;

    }

    /* Set up stack pointer */

    __asm("msr msp, r0");

    __asm("msr psp, r0");

    /* Relocate vector table */

    S32_SCB->VTOR = (uint32_t)APP_START_ADDRESS;

    /* Jump to application PC (r1) */

    __asm("mov pc, r1");

}

8.   範例執行 ( 基於S32K148 )
如果需要完整章節內容與程式碼,請留言或聯絡 Michael.Gao@wpi-group.com 

8.1 程式燒錄 ( Program )
8.1.1 import S32K148 bootloader
8.2 UART 通訊
8.3 電腦端 Java tool 使用
8.4 驗證程式

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

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

評論