0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關于CSEc安全引導和順序引導模式的問題

li1756686189 ? 來源:嵌入式MCU ? 作者:嵌入式MCU ? 2022-10-18 09:40 ? 次閱讀

1. 4kB EERAM上的CSEc密鑰和用戶數據

使用S32K148,將啟用CSE模塊進行安全引導。根據應用說明(“使用S32K148 FlexNVM存儲器”,AN12003,版本0,2017年7月),在第3.3節(jié)中,64 kB的FlexNVM用作閃存(EEPROM備份和密鑰存儲在一起),CSEc使用最多512字節(jié)的密鑰存儲,剩下的3.5 kB EERAM用于EEPROM和啟用CSEc。在這種用法中,用戶數據是否以某種方式通過覆蓋或刪除注冊密鑰而保留。簡而言之,記錄密鑰的512字節(jié)是隨機記錄在EERAM中,還是記錄在特定位置,如4KB FlexRAM的開始/結束位置?

-> 如果分配的CSEc空間為512B,則FlexRAM(EEPROM)中將無法訪問空間0x14000E00-0x14000FFF。對該區(qū)域的任何訪問都會生成總線故障異常。

2. 關于CSEc安全引導和順序引導模式的問題。

測量從復位引腳釋放到高電平的安全啟動時間,不同boot_SIZE和Clock時鐘對于安全啟動時間有所不同。當安全啟動開始啟動時(即CSEc正在計算CMAC),MCU內核保持在復位狀態(tài),復位引腳也保持在低電平狀態(tài),直到CMAC計算完成。

0d095fa4-4e17-11ed-a3b6-dac502259ad0.png

3. 實現 SHA256

在S32K1上面的CSEc 模塊支持 AES128 引擎,但不支持 SHA256。但是用戶可以參考如下代碼實現它。

https://github.com/ARMmbed/mbedtls/blob/v2.16.8/library/sha256.c

4. 當在 S32K146中使用 CSEc模塊的時候,程序訪問 CSE_PRAM 空間,在調試模式下它將進入異常中斷。

#define REG_WRITE32(address, value) ((*(volatile uint32*)(address))= (value))

#define CRYPTO_PRAM_HDR_ADDR32 (0x14001000u)

REG_WRITE32(CRYPTO_PRAM_HDR_ADDR32, u32CommandHeader);

0d3f2058-4e17-11ed-a3b6-dac502259ad0.png

上述代碼高亮部分表示寫入 PRAM命令,會導致程序進入異常中斷。

->通過檢查SIM_SDID[FEATURES]寄存器,判斷S32K芯片是否支持 CSEc。為了使能 CSEc 模塊,內存需要分區(qū)用于EEPROM,FTFC寄存器需要編程。

0da1ced8-4e17-11ed-a3b6-dac502259ad0.png

5.CSEC模塊PRAM格式

在應用筆記 AN5401中,有的是通過 PRAM 頁1讀取數據,而有的是通過 PRAM頁2輸出數據,這兩種方法有什么不同的嗎?

0dd48454-4e17-11ed-a3b6-dac502259ad0.png

0e079e2a-4e17-11ed-a3b6-dac502259ad0.png

-> 參考手冊里面的 CSEc命令

https://www.nxp.com/docs/en/reference-manual/S32K-RM.pdf

這是CMD_GET_ID命令的描述,可以在其中看到使用了哪些頁及其目的是什么:

0e7dac6e-4e17-11ed-a3b6-dac502259ad0.png

如下是 AN5401文檔中的參考代碼部分。

0ea5c19a-4e17-11ed-a3b6-dac502259ad0.png

6. CSEc不能恢復到工廠模式

通過 CSEC_DRV_DbgChal恢復到工廠模式失敗,返回"STATUS_SEC_KEY_WRITE_PROTECTED"。這里Keys不能被配置為寫保護,否則將不能被擦除。

https://www.nxp.com/docs/en/application-note/AN12130.pdf

0f325466-4e17-11ed-a3b6-dac502259ad0.png

7.S32K144閃存分區(qū)問題

使用S32K144EVB-Q100和SDK3.0.0以及S32DS進行ARM調試。當使用OpenSDA工具調試閃存時,可以擦除閃存并完成分區(qū)閃存,但當使用J-Link調試閃存時無法再次擦除閃存和分區(qū)閃存,必須先使用類似J-Flash的工具擦除閃存。如何使用J-Link擦除閃存和分區(qū)閃存。是否有調試配置的任何設置?

->在使用SDK API對FlexNVM進行分區(qū)時,由于啟用了CSEc。

0f781316-4e17-11ed-a3b6-dac502259ad0.png

如果啟用CSEc,則無法通過命令“全部擦除”或其他FTFC命令擦除FlexNVM。如果要擦除FlexNVM,唯一的方法是使用CSEc命令將FlexNVM復位為出廠狀態(tài)。有關更多信息,請參閱AN5401。

https://www.nxp.com/webapp/Download?colCode=AN5401

https://www.nxp.com/webapp/Download?colCode=AN5401SW&docLang=en

#include "CSEc_functions.h"

#include "CSEc_macros.h"

#include "CSEc_keys.h"

uint32_t dbg_challenge_out[4] = {0,0,0,0};

int main(void)

{

uint16_t __attribute__((unused)) csec_error = 0; //1 means No Error

csec_error = INIT_RNG(); /* Initialize the Random Number Generator before generating challenge */

//To Erase all keys and reset the part to the factory state

csec_error = DBG_CHAL(dbg_challenge_out); /* Generate the Challenge */

csec_error = DBG_AUTH(dbg_challenge_out); /* Issue the Authorization */

while(1);

/* to avoid the warning message for GHS and IAR: statement is unreachable*/

#if defined (__ghs__)

#pragma ghs nowarning 111

#endif

#if defined (__ICCARM__)

#pragma diag_suppress=Pe111

#endif

return 0;

}

由于 CSEc 模塊所有密鑰都只能 CSEc 模塊管理,這樣才能確保密鑰安全的安全性。雖然密鑰實際存儲區(qū)域是在模擬 EEPROM 中,但由于這段區(qū)域是由 CSEc 管理并且對用戶是不可見的,所以也無法通過直接對 DFlash 編程的方式寫入密鑰。在量產時,可以使用一份專用于寫入密鑰的程序,通過先刷寫這份程序,等寫入密鑰后,再刷寫正式的應用程序即可。需要注意的時,兩份程序需要有一致的 D-Flash 分區(qū)策略。當然也可以通過診斷服務的方式加載密鑰。先脫機計算出密鑰的 M1~M5 值,然后通過診斷服務(如 2Eh服務)將 M1~M3 加載至 CSEc 模塊中,并通過 M4 和 M5 驗證是否加載成功。由于不能通過 M1~M3 值逆推算出密鑰值,所以這種方式也是安全的。由于使能 CSEc 模塊后,只能通過 CSEc 模塊的恢復命令(使用調試器也不行)才能擦除 D-Flash 數據并恢復 D-Flash 至出廠狀態(tài),所以如果在量產后需要再次擦除 D-Flash,或者重新對 D-Flash 進行分區(qū)等,可以在用戶代碼中加入相關程序,通過觸發(fā)這段程序來使用 CSEc 模塊的命令擦除 D-Flash。CSEc 模塊對 P-Flash的重新編程沒有影響。

7. 為CSEc操作分配密鑰大小后,需要按照AN5401 4.5中列出的步驟將閃存重置為出廠狀態(tài)。此外,還提供了一些連接/擦除/編程到S32K器件的提示。

(https://www.nxp.com/docs/en/application-note/AN12130.pdf )

如果沒有按照正確的步驟在分配密鑰后擦除Flash,器件可能會被鎖定,并且無法解鎖。

如參考手冊所述,分區(qū)操作在整個產品周期中最好只執(zhí)行一次。

0fc7de1e-4e17-11ed-a3b6-dac502259ad0.png

104acafe-4e17-11ed-a3b6-dac502259ad0.png

可以通過DBG_CHAL 和 DBG_AUTH 銷毀分區(qū),不用擦除Flash。

105bae46-4e17-11ed-a3b6-dac502259ad0.png

當未分配CSEc時,沒有辦法在不擦除所有鍵的情況下刪除分區(qū)?因為只需要擦除數據Flash 以及Flash IFR。但是,一旦數據Flash 已經為EEPROM分區(qū),FTFC擦除Flash 塊命令就不能擦除數據Flash。

10be12e8-4e17-11ed-a3b6-dac502259ad0.png

運行DBG_CHAL和DBG_ AUTH命令會擦除所有密鑰,包括BOOT_MAC和BOOT_ MAC_KEY。在沒有這兩個參數的情況下,不會執(zhí)行安全引導過程,因此應用程序可以自由執(zhí)行,并且MCU 不會處于復位狀態(tài)。

DBG_CHAL/DBG_ AUTH即使在嚴格啟動模式處于活動狀態(tài)時也可以工作,假設所有密鑰都沒有寫保護。這不會鎖定 MCU。

成功執(zhí)行DBG_CHAL/DBG_ AUTH后,所有密鑰將被擦除,安全引導處于非活動狀態(tài)??梢允褂萌魏畏绞剑ù小⒉⑿?、嚴格順序)再次激活安全引導。

注意:對于嚴格順序模式,自動MAC計算是不可能的。在激活嚴格順序引導之前,必須計算并存儲BOOT_MAC。否則將鎖定器件。MAC可通過CSEc本身或PC離線計算。有關更多詳細信息和代碼示例,請參閱 AN5401。

8. 當執(zhí)行FLASH_DRV_DEFlashPartition 函數的時候, FTFx_FSTAT 是FTFx_FSTAT_ACCERR_MASK。

While((FTFC->FSTAT&FTFC_FSTAT_CCIF_MASK)==0U)

FTFC_FSTAT – 異常時,Flash狀態(tài)寄存器是 160, Flash Access Error
Flag 標志是 '1',但是正常狀態(tài)是 128。Flash已經分區(qū),有如下原因導致 ACCERR位被置位。

11020aac-4e17-11ed-a3b6-dac502259ad0.png

已通過分區(qū)命令啟用CSEc,則此時擦除所有塊命令將無效(它也應返回ACCERR)。是否加載了密鑰并不重要。一旦Flash 分區(qū),并且密鑰大小不是 0,則需要使用CMD_DBG_CHAL和CMD_ DBG_ AUTH命令來銷毀分區(qū)。為此,需要知道MASTER_ECU_KEY。如果尚未加載MASTER_ECU_KEY,則需要加載,然后可以使用CMD_DBG_CHAL和CMD_ DBG_ AUTH命令,別無選擇。可以檢查SIM模塊中的閃存配置寄存器1(FCFG1),查看器件是否已分區(qū)。

如果Flash已經分區(qū)、CSEc已經使能,FLASH_DRV_EraseAllBlock不能工作。唯一的方案是在了解MASTER_ECU_KEY的情況下使用DBG_CHAL 和 DBG_AUTH 命令恢復。

可以參考如下例子中的 eraseKeys()函數。S32DS.3.4S32DSsoftwareS32SDK_S32K1XX_RTM_4.0.2examplesS32K144driver_examplessystemcsec_keyconfig

11987294-4e17-11ed-a3b6-dac502259ad0.png

在HSRUN模式(112MHz下),CSEc (安全) 或者 EEPROM 擦寫將觸發(fā)錯誤標志。因為在這種情況下不允許同時使用。器件需要切回到 RUN模式(80 Mhz) 來執(zhí)行 CSEc(安全) 或者 EEPROM 寫/擦除。

11e238b6-4e17-11ed-a3b6-dac502259ad0.png

Flash 內存安全在 CSEc 和non-CSEc 器件上都支持,SIM_SDID[7]表示 CSEc 是否在器件上支持。CSEc 和non CSEc 用戶需要運行 PGMPART 命令來配置 KeySize。針對 non CSEc 用戶,Key Size 必須配置為 0。

整個 EEERAM的空間是減小,為了存儲用戶 Keys的需要。用戶密鑰空間實際上成為EEERAM中的不可尋址空間。針對具有 CSEc或者沒有 CSEc的器件,如果 Key size為0,則CSEc_PRAM訪問是不允許的。Keysize為零時,是普通EEPROM分區(qū)么,直接mass erase就恢復了。通過操作 FLASH_DRV_EraseAllBlockUnsecure函數恢復,或者硬件將Reset引腳短接,然后通過JLINK等外部工具擦除MCU內部的 Flash。

11ff99f6-4e17-11ed-a3b6-dac502259ad0.png

1342cf7c-4e17-11ed-a3b6-dac502259ad0.png

如果S32K146板默認存在分區(qū),通過判斷(SIM->FCFG1[FEATURE])確定分區(qū),如果要使用新的分區(qū)操作,需要擦除舊的分區(qū),如果不擦,在調試CSEc init_rng或者erase all key的時候會進入defaultISR中斷,可以通過上述mass erase方式恢復(keysize為零的情況)。然后重新分區(qū)使能 CSEc模塊,操作初始化隨機數以及加解密,預置秘鑰操作。

程序分區(qū)命令準備FlexNVM塊用作數據閃存、模擬EEPROM備份或兩者的組合,并初始化FlexRAM。程序分區(qū)命令不能從Flash 啟動,因為在程序分區(qū)命令執(zhí)行期間無法訪問Flash 資源。與程序分區(qū)命令的執(zhí)行相關的更改在下次復位后生效。在啟動其他FTFC和CSEc命令之前,預計將為新器件運行程序分區(qū)命令。

注意:雖然FlexNVM可以用不同分區(qū),但其目的是在給定應用程序的整個生命周期中使用一次分區(qū)選擇。FlexNVM分區(qū)代碼選擇影響器件的耐久性和數據保留特性。中斷程序分區(qū)操作(由于斷電、復位、電源超出指定的操作范圍或任何其他原因)會使分區(qū)代碼處于不確定狀態(tài)。用戶必須采取適當的應對措施,以防止程序分區(qū)操作中斷時數據丟失。

對于未啟用CSEc的部件,Flash KeySize的數量必須配置為2'b00。對于啟用CSEc的器件,Flash密鑰的數量是用戶可配置的,但該空間將假設存在MASTER_ECU_KEY、BOOT_MAC_KEY和BOOT_ MAC(如果啟用了任何密鑰),因此將占用可用20個密鑰槽空間中的3個密鑰槽。這導致在1到17個用戶keys的范圍內留下鍵槽。對于未啟用CSEc的部件,密鑰分配必須設置為零密鑰(2'b00),否則該命令將返回錯誤。

注:對于具有CSEc的器件,一旦分配了Flash密鑰(無論是否初始化),SHE規(guī)范中不帶認證將不能擦除Flash 密鑰的要求將適用。這意味著在擦除數據Flash(所有Flash 密鑰都備份在數據Flash中的模擬EEPROM中)之前,必須運行并通過身份驗證(DBG_CHAL和DBG_ AUTH)命令(刪除所有 Flash密鑰)。因此,擦除所有塊和擦除所有塊解鎖將不起作用,如果所選塊/扇區(qū)包括存儲密鑰,則擦除Flash 塊或扇區(qū)也不起作用。此外,如果任何 Flash密鑰受寫保護,則無法擦除/刪除它們,因此無法擦除數據 Flash,身份驗證過程也不會通過。

9. 在S32DS環(huán)境下,使用如下 RTM3.0.0的example flash_partitioning_s32k144的例子,在debug RAM下運行就可以擦除以前老的 EEPROM分區(qū)。(如果keysize為零,沒有使用 CSEc的情況下)

/* Including needed modules to compile this module/procedure */

#include "Cpu.h"

#include "clockMan1.h"

#include "Flash.h"

volatile int exit_code = 0;

/* User includes (#include below this line is not maintained by Processor Expert) */

#include

#include

/* Declare a FLASH config struct which initialized by FlashInit, and will be used by all flash operations */

flash_ssd_config_t flashSSDConfig;

/* Data source for program operation */

#define BUFFER_SIZE 0x100u /* Size of data source */

#define FLASH_TARGET1

uint8_t sourceBuffer[BUFFER_SIZE];

/* Function declarations */

void CCIF_Handler(void);

/* If target is flash, insert this macro to locate callback function into RAM */

void CCIF_Callback(void)

int main(void)

{

/* Write your local variable definition here */

status_t ret; /* Store the driver APIs return code */

uint32_t address;

uint32_t size;

uint32_t failAddr;

uint32_t i;

flash_callback_t pCallBack;

#if (FEATURE_FLS_HAS_PROGRAM_PHRASE_CMD == 1u)

#ifndef FLASH_TARGET

uint8_t unsecure_key[FTFx_PHRASE_SIZE] = {0xFFu, 0xFFu, 0xFFu, 0xFFu, 0xFEu, 0xFFu, 0xFFu, 0xFFu};

#endif

#else /* FEATURE_FLASH_HAS_PROGRAM_LONGWORD_CMD */

uint8_t unsecure_key[FTFx_LONGWORD_SIZE] = {0xFEu, 0xFFu, 0xFFu, 0xFFu};

#endif /* FEATURE_FLS_HAS_PROGRAM_PHRASE_CMD */

/*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/

#ifdef PEX_RTOS_INIT

PEX_RTOS_INIT(); /* Initialization of the selected RTOS. Macro is defined by the RTOS component. */

#endif

/*** End of Processor Expert internal initialization. ***/

CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT,

g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);

CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT);

/* Init source data */

for (i = 0u; i < BUFFER_SIZE; i++)

{

sourceBuffer[i] = i;

}

/* Disable cache to ensure that all flash operations will take effect instantly,

* this is device dependent */

#ifndef FLASH_TARGET

#ifdef S32K144_SERIES

MSCM->OCMDR[0u] |= MSCM_OCMDR_OCM1(0x3u);

MSCM->OCMDR[1u] |= MSCM_OCMDR_OCM1(0x3u);

#endif /* S32K144_SERIES */

#endif /* FLASH_TARGET */

/* Install interrupt for Flash Command Complete event */

INT_SYS_InstallHandler(FTFC_IRQn, CCIF_Handler, (isr_t*) 0);

INT_SYS_EnableIRQ(FTFC_IRQn);

/* Enable global interrupt */

INT_SYS_EnableIRQGlobal();

/* Always initialize the driver before calling other functions */

ret = FLASH_DRV_Init(&Flash_InitConfig0, &flashSSDConfig);

DEV_ASSERT(STATUS_SUCCESS == ret);

#if ((FEATURE_FLS_HAS_FLEX_NVM == 1u) & (FEATURE_FLS_HAS_FLEX_RAM == 1u))

/* Config FlexRAM as EEPROM if it is currently used as traditional RAM */

if (flashSSDConfig.EEESize == 0u)

{

#ifndef FLASH_TARGET

/* First, erase all Flash blocks if code is placed in RAM to ensure

* the IFR region is blank before partitioning FLexNVM and FlexRAM */

ret = FLASH_DRV_EraseAllBlock(&flashSSDConfig);

DEV_ASSERT(STATUS_SUCCESS == ret);

/* Verify the erase operation at margin level value of 1 */

ret = FLASH_DRV_VerifyAllBlock(&flashSSDConfig, 1u);

DEV_ASSERT(STATUS_SUCCESS == ret);

/* Reprogram secure byte in Flash configuration field */

#if (FEATURE_FLS_HAS_PROGRAM_PHRASE_CMD == 1u)

address = 0x408u;

size = FTFx_PHRASE_SIZE;

#else /* FEATURE_FLASH_HAS_PROGRAM_LONGWORD_CMD == 1u */

address = 0x40Cu;

size = FTFx_LONGWORD_SIZE;

#endif /* FEATURE_FLS_HAS_PROGRAM_PHRASE_CMD */

ret = FLASH_DRV_Program(&flashSSDConfig, address, size, unsecure_key);

DEV_ASSERT(STATUS_SUCCESS == ret);

#endif /* FLASH_TARGET */

/* Configure FlexRAM as EEPROM and FlexNVM as EEPROM backup region,

* DEFlashPartition will be failed if the IFR region isn't blank.

* Refer to the device document for valid EEPROM Data Size Code

* and FlexNVM Partition Code. For example on S32K144:

* - EEEDataSizeCode = 0x02u: EEPROM size = 4 Kbytes

* - DEPartitionCode = 0x08u: EEPROM backup size = 64 Kbytes */

ret = FLASH_DRV_DEFlashPartition(&flashSSDConfig, 0x02u, 0x08u, 0x0u, false, true);

DEV_ASSERT(STATUS_SUCCESS == ret);

/* Re-initialize the driver to update the new EEPROM configuration */

ret = FLASH_DRV_Init(&Flash_InitConfig0, &flashSSDConfig);

DEV_ASSERT(STATUS_SUCCESS == ret);

/* Make FlexRAM available for EEPROM */

ret = FLASH_DRV_SetFlexRamFunction(&flashSSDConfig, EEE_ENABLE, 0x00u, NULL);

DEV_ASSERT(STATUS_SUCCESS == ret);

}

else /* FLexRAM is already configured as EEPROM */

{

ret = FLASH_DRV_EraseAllBlockUnsecure(&flashSSDConfig);

DEV_ASSERT(STATUS_SUCCESS == ret);

/* Re-initialize the driver to update the new EEPROM configuration */

ret = FLASH_DRV_Init(&Flash_InitConfig0, &flashSSDConfig);

DEV_ASSERT(STATUS_SUCCESS == ret);

}

#endif /* (FEATURE_FLS_HAS_FLEX_NVM == 1u) & (FEATURE_FLS_HAS_FLEX_RAM == 1u) */

/* Set callback function before a long time consuming flash operation

* (ex: erasing) to let the application code do other tasks while flash

* in operation. In this case we use it to enable interrupt for

* Flash Command Complete event */

pCallBack = (flash_callback_t)CCIF_Callback;

flashSSDConfig.CallBack = pCallBack;

/* Erase the last PFlash sector */

address = FEATURE_FLS_PF_BLOCK_SIZE - FEATURE_FLS_PF_BLOCK_SECTOR_SIZE;

size = FEATURE_FLS_PF_BLOCK_SECTOR_SIZE;

ret = FLASH_DRV_EraseSector(&flashSSDConfig, address, size);

DEV_ASSERT(STATUS_SUCCESS == ret);

/* Disable Callback */

flashSSDConfig.CallBack = NULL_CALLBACK;

/* Verify the erase operation at margin level value of 1, user read */

ret = FLASH_DRV_VerifySection(&flashSSDConfig, address, size / FTFx_DPHRASE_SIZE, 1u);

DEV_ASSERT(STATUS_SUCCESS == ret);

/* Write some data to the erased PFlash sector */

size = BUFFER_SIZE;

ret = FLASH_DRV_Program(&flashSSDConfig, address, size, sourceBuffer);

DEV_ASSERT(STATUS_SUCCESS == ret);

/* Verify the program operation at margin level value of 1, user margin */

ret = FLASH_DRV_ProgramCheck(&flashSSDConfig, address, size, sourceBuffer, &failAddr, 1u);

DEV_ASSERT(STATUS_SUCCESS == ret);

/* Try to write data to EEPROM if FlexRAM is configured as EEPROM */

if (flashSSDConfig.EEESize != 0u)

{

address = flashSSDConfig.EERAMBase;

size = sizeof(uint32_t);

ret = FLASH_DRV_EEEWrite(&flashSSDConfig, address, size, sourceBuffer);

DEV_ASSERT(STATUS_SUCCESS == ret);

/* Verify the written data */

if (*((uint32_t *)sourceBuffer) != *((uint32_t *)address))

{

/* Failed to write data to EEPROM */

exit_code = 1u;

return exit_code;

}

/* Try to update one byte in an EEPROM address which isn't aligned */

address = flashSSDConfig.EERAMBase + 1u;

size = sizeof(uint8_t);

sourceBuffer[0u] = 0xFFu;

ret = FLASH_DRV_EEEWrite(&flashSSDConfig, address, size, sourceBuffer);

DEV_ASSERT(STATUS_SUCCESS == ret);

/* Then verify */

if (sourceBuffer[0u] != *((uint8_t *)address))

{

/* Failed to update data to EEPROM */

exit_code = 1u;

return exit_code;

}

}

else

{

#if (FEATURE_FLS_HAS_FLEX_NVM == 1u)

/* Erase a sector in DFlash */

address = flashSSDConfig.DFlashBase;

size = FEATURE_FLS_DF_BLOCK_SECTOR_SIZE;

ret = FLASH_DRV_EraseSector(&flashSSDConfig, address, size);

DEV_ASSERT(STATUS_SUCCESS == ret);

/* Verify the erase operation at margin level value of 1, user read */

ret = FLASH_DRV_VerifySection(&flashSSDConfig, address, size / FTFx_PHRASE_SIZE, 1u);

DEV_ASSERT(STATUS_SUCCESS == ret);

/* Write some data to the erased DFlash sector */

address = flashSSDConfig.DFlashBase;

size = BUFFER_SIZE;

ret = FLASH_DRV_Program(&flashSSDConfig, address, size, sourceBuffer);

DEV_ASSERT(STATUS_SUCCESS == ret);

/* Verify the program operation at margin level value of 1, user margin */

ret = FLASH_DRV_ProgramCheck(&flashSSDConfig, address, size, sourceBuffer, &failAddr, 1u);

DEV_ASSERT(STATUS_SUCCESS == ret);

#endif /* FEATURE_FLS_HAS_FLEX_NVM */

}

#ifdef PEX_RTOS_START

PEX_RTOS_START(); /* Startup of the selected RTOS. Macro is defined by the RTOS component. */

#endif

for(;;) {

if(exit_code != 0) {

break;

}

}

return exit_code;

/*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/

} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/

void CCIF_Handler(void)

{

/* Disable Flash Command Complete interrupt */

FTFx_FCNFG &= (~FTFx_FCNFG_CCIE_MASK);

return;

}

void CCIF_Callback(void)

{

/* Enable interrupt for Flash Command Complete */

if ((FTFx_FCNFG & FTFx_FCNFG_CCIE_MASK) == 0u)

{

FTFx_FCNFG |= FTFx_FCNFG_CCIE_MASK;

}

}

1381295c-4e17-11ed-a3b6-dac502259ad0.png

運行調試模式,停止,然后再次運行會進入FLASH_DRV_EraseAllBlockUnsecure,關于 Flash組件配置如下。

13cd49b8-4e17-11ed-a3b6-dac502259ad0.png

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    16802

    瀏覽量

    349361
  • 寄存器
    +關注

    關注

    31

    文章

    5271

    瀏覽量

    119651
  • SHA256
    +關注

    關注

    0

    文章

    5

    瀏覽量

    10011
  • EERAM
    +關注

    關注

    0

    文章

    9

    瀏覽量

    4546

原文標題:S32K CSEc

文章出處:【微信號:嵌入式 MCU,微信公眾號:嵌入式 MCU】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    PSOC 5安全引導程序怎么實現

    我想在PSoC 5上實現一個安全引導加載程序。我的意思是,應用程序接收新的二進制文件,將其存儲在MCU的閃存中,并且只有在上傳完成后,才將控制轉移到替換現有應用程序并重新啟動MCU的加載器。這有
    發(fā)表于 11-13 15:15

    引導模式

    "BOOT MODE“中的4位都是1,引導到FLASH,是不是就是表示程序是燒到flash里了,掉電不會消失。
    發(fā)表于 12-04 11:14

    正確的RCW/PBI引導順序是什么?

    (不是 RCW)。第一個 PBI 命令 - 加載 RCW(字節(jié) 00 00 10 80)。所以實際上在上電復位后,服務處理器首先執(zhí)行 PBI 命令,第一個 PBI 命令是加載 RCW。這與用戶手冊中的描述相矛盾。正確的 RCW/PBI 引導順序是什么?
    發(fā)表于 03-29 08:57

    iMXRT MCU是否能夠支持安全引導加載程序實施?

    收到固件升級請求,它會跳回安全引導加載程序。但在執(zhí)行固件升級請求之前,安全引導加載程序應檢查固件升級請求是否真實。重要的是如何?我們仍在努力弄清楚如何去做。非常感謝任何
    發(fā)表于 04-03 08:12

    S32k342 的引導模式標頭結構和引導模式標頭位置在哪里?

    嗨,對于 NXPs32k342,我需要引導模式標頭結構和引導模式標頭位置來配置引導加載程序的內存組織塊,那個特定的啟動軟件和
    發(fā)表于 04-17 06:51

    Arm CryptoCell-312生成和驗證安全引導安全調試證書鏈指南

    安全引導安全調試是CryptoCell(CC)引導服務的基本功能。 安全引導
    發(fā)表于 08-24 06:09

    OS引導記錄手冊

    OS引導記錄手冊:1、PC引導流程42、DOS核心引導流程分析53、DOS引導區(qū)代碼分析  94、Windows 引導流程&nbs
    發(fā)表于 09-26 18:49 ?9次下載

    TMS320x280x DSP引導ROM參考指南

    關于本手冊 此參考指南適用于存儲在TMS320x280x系列處理器的片上引導ROM中的代碼和數據,其中包括280x系列中所有基于快閃、基于ROM和基于RAM的器件。 引導ROM在出廠時已設定好
    發(fā)表于 02-24 23:07 ?37次下載

    TI C2000 引導模式原理的理解

    在使用C2000的時候,經常遇到工程師說芯片仿真能夠運行,但是單機跑卻不能跑起來;或者在調試時,復位芯片run,發(fā)現程序不能跑起來。這其中的原因主要是沒有了解C2000的引導模式設置。另外當我們想通過其他方式去引導芯片啟動的時候
    發(fā)表于 04-26 12:41 ?6385次閱讀
    TI C2000 <b class='flag-5'>引導</b><b class='flag-5'>模式</b>原理的理解

    UEFI+GPT、Legacy+MBR引導模式介紹及引導修復教程

    UEFI+GPT、Legacy+MBR引導模式介紹及引導修復教程
    發(fā)表于 09-07 14:32 ?18次下載
    UEFI+GPT、Legacy+MBR<b class='flag-5'>引導</b><b class='flag-5'>模式</b>介紹及<b class='flag-5'>引導</b>修復教程

    通過安全引導安全下載認證保護IoT設備

    討論惡意攻擊如何感染當今許多IoT設備或基于微控制器的設備中普遍存在的嵌入式固件。您將會了解到攻擊者利用設備內部漏洞的途徑,以及通過安全引導和下載驗證產品固件真實性和完整性的重要性。關于安全
    的頭像 發(fā)表于 10-10 03:06 ?3272次閱讀

    wolfBoot安全引導加載程序

      wolfBoot 安全引導加載程序 1.7.1 版在開源 GPLv2 許可下可用,可從www.wolfssl.com/download下載。wolfSSL 還在Github 上提供了許多 wolfBoot 示例。
    發(fā)表于 06-27 11:30 ?1176次閱讀

    C2000上電引導模式解析

    在使用C2000的時候,經常遇到工程師說芯片仿真能夠運行,但是單機跑卻不能跑起來;或者在調試時,復位芯片?>?run,發(fā)現程序不能跑起來。這其中的原因主要是沒有了解C2000的引導模式設置
    的頭像 發(fā)表于 04-11 09:44 ?1545次閱讀
    C2000上電<b class='flag-5'>引導</b><b class='flag-5'>模式</b>解析

    安全引導的作用和原理是什么

    安全引導可用于保證系統的完整性,防止系統中重要鏡像文件被破壞或替換。 一般情況下,安全引導需要保護 ? 系統的BootLoader鏡像文件、 ? TEE鏡像文件、 ? Linux內核鏡
    的頭像 發(fā)表于 11-07 15:21 ?1096次閱讀

    ARMv7安全引導的過程

    對于安全引導功能的實現和驗證過程各家芯片公司的方案都不一樣,這是由該芯片的啟動流程以及啟動所需鏡像文件來決定的,但都會遵循鏈式驗簽啟動的原則。 ARMv7架構并沒有使用ATF,系統的啟動流程與以前
    的頭像 發(fā)表于 11-07 15:25 ?707次閱讀
    ARMv7<b class='flag-5'>安全</b><b class='flag-5'>引導</b>的過程