![wKgaomc6sIKACSq7AAETaiBuPXY834.png](https://file1.elecfans.com/web2/M00/0C/B5/wKgaomc6sIKACSq7AAETaiBuPXY834.png)
本文以RA6 MCU為例,介紹如何使用自診斷軟件對MCU進行自檢。
1 使用的環境
![wKgZomc6sbqAA60mAABneYOCJSw495.png](https://file1.elecfans.com/web2/M00/0B/D6/wKgZomc6sbqAA60mAABneYOCJSw495.png)
2 自檢軟件介紹
瑞薩提供了針對RA系列MCU的診斷軟件,涵蓋了對MCU的CPU core,ROM,RAM的永久性故障診斷,CPU的斬斷覆蓋率達90%,RAM的診斷覆蓋率達90%,ROM的診斷覆蓋率達99%,滿足SIL3的認證要求。本文檔使用的自檢軟件包RTK0EF0090F60001SJ_Ver.1.01適用于cortex M4架構的RA6系列MCU。
2.1CPU診斷軟件
CPU診斷軟件通過采用主要基于指令的診斷方法來驗證 CPU的正確功能,從而檢測CPU內核的永久性硬件故障。針對處理器內核,有20項的測試內容。
![wKgaomc6sbqAd2QnAATl-x7fIrg107.png](https://file1.elecfans.com/web2/M00/0C/B5/wKgaomc6sbqAd2QnAATl-x7fIrg107.png)
2.2CPU診斷軟件API
void coreTest(uint8_t steps, const uint8_t forceFail, uint32_t *result),通過設置參數forceFail,可以實現故障注入從而返回錯誤。
![wKgZomc6sbqAA8GqAAKMsAu3xho785.png](https://file1.elecfans.com/web2/M00/0B/D6/wKgZomc6sbqAA8GqAAKMsAu3xho785.png)
2.3RAM診斷軟件
RAM診斷軟件是檢測MCU RAM內存,將要檢測的內存大小MUTSize分成numberOfBUT塊,那么每塊內存大小就是MUTSize/numberOfBUT.調用RAM診斷API對每塊內存進行檢測,返回兩個結果resultTestRam1和resultTestRam2,如果都為1,則表示檢測通過,否則檢測失敗。
![wKgaomc6sbqAUWvvAAD3VWRFrYs299.png](https://file1.elecfans.com/web2/M00/0C/B5/wKgaomc6sbqAUWvvAAD3VWRFrYs299.png)
2.4RAM診斷軟件API
void testRAM(unsigned int index, unsigned int selectAlgorithm, unsigned int destructive),參數 selectAlgorithm是設置RAM自檢算法,支持Extended March C-和WALPAT兩種算法,參數destructive是設置RAM自檢模式,0表示非破壞性模式,需要使用新buffer保存被檢RAM區的數據做備份,1表示po破壞性檢測,該模式會模式會清楚RAM區數據初始化為0。
![wKgZomc6sbuATNbZAAHuM_-Bzpg742.png](https://file1.elecfans.com/web2/M00/0B/D6/wKgZomc6sbuATNbZAAHuM_-Bzpg742.png)
2.5ROM診斷軟件
RAM診斷軟件是檢測MCU ROM,通過選定ROM起始地址和終止地址來確認檢測的內存塊范圍,調用ROM診斷軟件API對ROM內存塊進行相應CRC計算,返回值與參考checksum(由IAR鏈接器預先計算產生)進行比較,如果不一致,則表示有錯誤。
2.5ROM診斷軟件
RAM診斷軟件是檢測MCU ROM,通過選定ROM起始地址和終止地址來確認檢測的內存塊范圍,調用ROM診斷軟件API對ROM內存塊進行相應CRC計算,返回值與參考checksum(由IAR鏈接器預先計算產生)進行比較,如果不一致,則表示有錯誤。
2.6ROM診斷軟件API
void crcHwSetup(unsigned int crc)
uint16_t crcComputation(unsigned int checksumBegin,unsigned int checksumEnd,unsigned int incrMode)
![wKgaomc6sbuAcaDJAAI4fniIFRE710.png](https://file1.elecfans.com/web2/M00/0C/B5/wKgaomc6sbuAcaDJAAI4fniIFRE710.png)
以上是診斷軟件的介紹,詳細的細節可以查閱診斷軟件的用戶手冊。
3 RA6開發板測試
3.1 使用RASC創建基于IAR的FSP工程,點擊Generate Project Content生成代碼。
![wKgZomc6scWABwuBAAColECAOHo758.png](https://file1.elecfans.com/web2/M00/0B/D6/wKgZomc6scWABwuBAAColECAOHo758.png)
![wKgaomc6scaAYoRPAAElTsjRx-w894.png](https://file1.elecfans.com/web2/M00/0C/B5/wKgaomc6scaAYoRPAAElTsjRx-w894.png)
3.2 打開新創建的IAR工程,從RTK0EF0090F60001SJ_Ver.1.01代碼包中,拷貝自檢代碼添加到工程中src目錄下。
![wKgZomc6scWADaioAAC_GoPGJGU119.png](https://file1.elecfans.com/web2/M00/0B/D6/wKgZomc6scWADaioAAC_GoPGJGU119.png)
3.3工程設置
C/C++ Compiler->Preprocessor添加對應文件路徑
![wKgaomc6scaAXLGtAAF9CqSMYo0720.png](https://file1.elecfans.com/web2/M00/0C/B5/wKgaomc6scaAXLGtAAF9CqSMYo0720.png)
Assembler->Preprocessor添加對應文件路徑
![wKgaomc6scaABAluAAF-FGJy-3g853.png](https://file1.elecfans.com/web2/M00/0C/B5/wKgaomc6scaABAluAAF-FGJy-3g853.png)
3.4應用功能實現
編輯hal_entry.c文件,實現對CPU,RAM,ROM每隔0.5秒的循環檢測,同時EK-RA6M4按下S1按鈕,故障輸入,從而實現CPU錯誤檢測,紅色led燈閃爍,參考ek_ra6m4_selftest樣例程序。
![wKgZomc6scaAVPTwAABkpYkohuE491.png](https://file1.elecfans.com/web2/M00/0B/D6/wKgZomc6scaAVPTwAABkpYkohuE491.png)
1.主函數入口代碼: void hal_entry(void) { /* TODO: add your own code here */ uint32_t ver; uint8_t cnt = 0;
ver = R_CPU_Diag_GetVersion(); // printf("CPU diag software version = %d.%02d\n",ver >>16u,ver & 0xFFFF);
ver = R_RAM_Diag_GetVersion(); // printf("RAM diag software version = %d.%02d\n",ver >>16u,ver & 0xFFFF);
ver = R_ROM_Diag_GetVersion(); // printf("ROM diag software version = %d.%02d\n",ver >>16u,ver & 0xFFFF); /* Setup Registers */ setup_diag(); /* Holds level to set for pins */ bsp_io_level_t pin_level = BSP_IO_LEVEL_LOW;
while(1) { int32_t result = 0; cnt = cnt % 3; /* Blue LED blinks */ led_change(0, pin_level);
/* Diagnostic */ switch (cnt) { case 0: result = cpu_test_sample(); break; case 1: result = ram_test_sample(); break; case 2: result = rom_test_sample(); break; } cnt++;
if (0 == result)
{ /* Red LED lights off */ led_change(2, BSP_IO_LEVEL_LOW); }else{ /* Red LED lights up */ led_change(2, BSP_IO_LEVEL_HIGH); } /* Toggle level for next write */ if (BSP_IO_LEVEL_LOW == pin_level)
{ pin_level = BSP_IO_LEVEL_HIGH; } else { pin_level = BSP_IO_LEVEL_LOW; } /* Delay (500ms) */ R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); } #if BSP_TZ_SECURE_BUILD /* Enter non-secure code */ R_BSP_NonSecureEnter(); #endif }
2. cpu_test_sample()函數實現了CPU TEST代碼:
/*********************************************************************************************************************** * CPU TEST **********************************************************************************************************************
/ int32_t cpu_test_sample(void) { uint32_t forceFail = 1; /* Force fail:Disable */ int32_t result; uint32_t index; /* Check SW 'S1' */ if (R_PFS->PORT[0].PIN[5].PmnPFS_b.PIDR == 0) { forceFail = 0; asm("NOP"); } else{ asm("NOP"); } for (index = 0; index <= CPU_DIAG_MAX_INDEX; index++) { result = 0; R_CPU_Diag(index, forceFail, &result); if (result != 1) { return -1; } } return 0; }?
3. ram_test_sample()函數實現了RAM TEST代碼: /*********************************************************************************************************************** * RAM TEST **********************************************************************************************************************/ #include "r_ram_diag.h" int32_t ram_test_sample(void) { uint32_t area = 0; uint32_t index; uint32_t algorithm = RAM_ALG_MARCHC; uint32_t destructive; for (index = 0; index < numberOfBUT0; index++) { if (index == 0) { /* Buffer block */ destructive = RAM_MEM_DT; } else { destructive = RAM_MEM_NDT; } /* Call API */ R_RAM_Diag(area, index, algorithm, destructive); /* Check API result */ if ( (RramResult1 != 1) || (RramResult2 != 1) ) { return -1; } } return 0; }?
4.rom_test_sample()函數實現了ROM TEST代碼: /*********************************************************************************************************************** * ROM TEST **********************************************************************************************************************/ #define NUM_OB_ROM_BLOCK (2) #define CHECKSUM_BLOCK_ADDRESS (0x00003000) /* Area where the expected CRC checksum values of each ROM block are aggregated. */ __root const uint16_t expChecksum[NUM_OB_ROM_BLOCK] @ CHECKSUM_BLOCK_ADDRESS; int32_t rom_test_sample(void) { uint32_t start;
uint32_t end; uint32_t mode; uint16_t calChecksum; /* ROM Test: Block0 (4KB) */ start = 0x00001000; end = 0x00001FFF; mode = 0; calChecksum = R_ROM_Diag(start, end, mode); if (calChecksum != expChecksum[0])
{ return -1; } /* ROM Test: Block1 (4KB, 4time-wise split) */ /* Block1, Group1 (1KB) */ start = 0x00002000; end = 0x000023FF;
mode = 0; calChecksum = R_ROM_Diag(start, end, mode); /* Block1, Group2 (1KB) */ start = 0x00002400; end = 0x000027FF; mode = 1;
calChecksum = R_ROM_Diag(start, end, mode); /* Block1, Group3 (1KB) */ start = 0x00002800; end = 0x00002BFF;
calChecksum = R_ROM_Diag(start, end, mode); /* Block1, Group4 (1KB) */ start = 0x00002C00; end = 0x00002FFF; calChecksum = R_ROM_Diag(start, end, mode); if (calChecksum != expChecksum[1]) { return -1; } return 0; }
如您在使用瑞薩MCU/MPU產品中有任何問題,可識別下方二維碼或復制網址到瀏覽器中打開,進入瑞薩技術論壇尋找答案或獲取在線技術支持。
https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/
-
mcu
+關注
關注
146文章
17317瀏覽量
352640 -
RAM
+關注
關注
8文章
1369瀏覽量
115002 -
代碼
+關注
關注
30文章
4825瀏覽量
69046
發布評論請先 登錄
相關推薦
構建RA MCU生態圈!RA MCU 生態1.0發布
瑞薩RA系列MCU選型指南
RA CLASS B認證函數庫使用簡介
RA MCU CAN和CANFD IP介紹
![<b class='flag-5'>RA</b> <b class='flag-5'>MCU</b> CAN和CANFD IP<b class='flag-5'>介紹</b>](https://file1.elecfans.com/web2/M00/8E/8C/wKgaomTHxvOABfPAAAADbu4X9Ec396.gif)
RA MCU CAN和CANFD IP介紹
![<b class='flag-5'>RA</b> <b class='flag-5'>MCU</b> CAN和CANFD IP<b class='flag-5'>介紹</b>](https://file1.elecfans.com/web2/M00/BB/1B/wKgZomWXtb6ACk_NAAARMuEl9ZA261.png)
評論