0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RA系列MCU自检代码使用介绍

RA生态工作室 2024-11-16 01:02 次阅读
wKgaomc6sIKACSq7AAETaiBuPXY834.png

本文以RA6 MCU为例,介绍如何使用自诊断软件对MCU进行自检。

1 使用的环境

wKgZomc6sbqAA60mAABneYOCJSw495.png

2 自检软件介绍

瑞萨提供了针对RA系列MCU的诊断软件,涵盖了对MCU的CPU core,ROMRAM的永久性故障诊断,CPU的斩断覆盖率达90%,RAM的诊断覆盖率达90%,ROM的诊断覆盖率达99%,满足SIL3的认证要求。本文档使用的自检软件包RTK0EF0090F60001SJ_Ver.1.01适用于cortex M4架构的RA6系列MCU。

2.1CPU诊断软件

CPU诊断软件通过采用主要基于指令的诊断方法来验证 CPU的正确功能,从而检测CPU内核的永久性硬件故障。针对处理器内核,有20项的测试内容。

wKgaomc6sbqAd2QnAATl-x7fIrg107.png

2.2CPU诊断软件API

void coreTest(uint8_t steps, const uint8_t forceFail, uint32_t *result),通过设置参数forceFail,可以实现故障注入从而返回错误。

wKgZomc6sbqAA8GqAAKMsAu3xho785.png

2.3RAM诊断软件

RAM诊断软件是检测MCU RAM内存,将要检测的内存大小MUTSize分成numberOfBUT块,那么每块内存大小就是MUTSize/numberOfBUT.调用RAM诊断API对每块内存进行检测,返回两个结果resultTestRam1和resultTestRam2,如果都为1,则表示检测通过,否则检测失败。

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

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

以上是诊断软件的介绍,详细的细节可以查阅诊断软件的用户手册。

3 RA6开发板测试

3.1 使用RASC创建基于IAR的FSP工程,点击Generate Project Content生成代码。

wKgZomc6scWABwuBAAColECAOHo758.pngwKgaomc6scaAYoRPAAElTsjRx-w894.png

3.2 打开新创建的IAR工程,从RTK0EF0090F60001SJ_Ver.1.01代码包中,拷贝自检代码添加到工程中src目录下。

wKgZomc6scWADaioAAC_GoPGJGU119.png

3.3工程设置

C/C++ Compiler->Preprocessor添加对应文件路径

wKgaomc6scaAXLGtAAF9CqSMYo0720.png

Assembler->Preprocessor添加对应文件路径

wKgaomc6scaABAluAAF-FGJy-3g853.png

3.4应用功能实现

编辑hal_entry.c文件,实现对CPU,RAM,ROM每隔0.5秒的循环检测,同时EK-RA6M4按下S1按钮,故障输入,从而实现CPU错误检测,红色led灯闪烁,参考ek_ra6m4_selftest样例程序。

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
    mcu
    +关注

    关注

    146

    文章

    17123

    浏览量

    350995
  • RAM
    RAM
    +关注

    关注

    8

    文章

    1368

    浏览量

    114647
  • 代码
    +关注

    关注

    30

    文章

    4779

    浏览量

    68525
收藏 人收藏

    评论

    相关推荐

    瑞萨RA8系列高性能MCU开发上手体验

    大家好,我是痞子衡,是正经搞威廉希尔官方网站 的痞子。今天痞子衡给大家介绍的是瑞萨RA8系列高性能MCU开发上手体验。
    的头像 发表于 08-08 15:21 1434次阅读
    瑞萨<b class='flag-5'>RA</b>8<b class='flag-5'>系列</b>高性能<b class='flag-5'>MCU</b>开发上手体验

    构建RA MCU生态圈!RA MCU 生态1.0发布

    瑞萨电子联合深圳欣瑞利科技发起的RA生态工作室共同举办了RA MCU 生态1.0发布会。在发布会上,RA生态工作室正式发布了基于采用 Arm Cortex-M 内核的
    的头像 发表于 10-21 10:17 3257次阅读

    关于Renesas 32位RA系列MCU简介资料!

    瑞萨电子RA系列是基于Arm®Cortex®-M核心架构构建的新的32位MCU系列,瑞萨电子RA系列
    发表于 09-02 10:59

    康柏BIOS的自检报警音代码含义

    康柏BIOS的自检报警音代码含义
    发表于 08-30 09:35 21次下载

    RA MCU快速设计指南

    RA MCU快速设计指南
    发表于 11-07 19:50 0次下载
    <b class='flag-5'>RA</b> <b class='flag-5'>MCU</b>快速设计指南

    瑞萨RA系列MCU选型指南

    RA系列MCU产品基于Arm Cortex-M内核,与瑞萨自有内核RL78和RX系列一起,成为瑞萨MCU产品线齐头并进的三驾马车。
    发表于 11-08 13:51 2298次阅读

    RA2系列MCU IIC通信速率分析

    一、RA系列MCU简介 RA(Renesas Advanced)系列MCU是瑞萨于2019年10
    的头像 发表于 11-11 12:15 3130次阅读

    RA CLASS B认证函数库使用简介

    介绍 RA系列单片机是瑞萨推出的32位ARM单片机,在某些产品中需要通过安规认证,如IEC60730(CLASS B),芯片硬件本身已经通过IEC60730认证了,今天主要说RA芯片软
    的头像 发表于 01-18 12:25 1698次阅读

    RA MCU CAN和CANFD IP介绍

    瑞萨RA MCU(Renesas RA Microcontroller Unit)是一种高性能且多功能的微控制器单元,由瑞萨电子公司推出。它是基于ARM Cortex-M内核的先进微控制器系列
    的头像 发表于 07-28 12:15 1421次阅读
    <b class='flag-5'>RA</b> <b class='flag-5'>MCU</b> CAN和CANFD IP<b class='flag-5'>介绍</b>

    RA MCU CANFD在FSP中的配置详解

    在瑞萨RA系列MCU产品中,目前RA4E2、RA4T1、RA6E2、
    的头像 发表于 10-20 14:46 1333次阅读
    <b class='flag-5'>RA</b> <b class='flag-5'>MCU</b> CANFD在FSP中的配置详解

    RA MCU CAN和CANFD IP介绍

    瑞萨RA MCU(Renesas RA Microcontroller Unit)是一种高性能且多功能的微控制器单元,由瑞萨电子公司推出。它是基于ARM Cortex-M内核的先进微控制器系列
    的头像 发表于 12-26 08:06 655次阅读
    <b class='flag-5'>RA</b> <b class='flag-5'>MCU</b> CAN和CANFD IP<b class='flag-5'>介绍</b>

    32位MCU系列RA6E2入口线微控制器介绍

    电子发烧友网站提供《32位MCU系列RA6E2入口线微控制器介绍.pdf》资料免费下载
    发表于 02-21 10:25 0次下载
    32位<b class='flag-5'>MCU</b><b class='flag-5'>系列</b><b class='flag-5'>RA</b>6E2入口线微控制器<b class='flag-5'>介绍</b>

    瑞萨电子RA家族推出RA8系列高算力通用MCU

    瑞萨电子RA家族推出RA8系列高算力通用MCU,是业界首款基于Arm® Cortex®-M85(CM85)内核的32位MCU,主频高达480
    的头像 发表于 04-02 14:14 1427次阅读
    瑞萨电子<b class='flag-5'>RA</b>家族推出<b class='flag-5'>RA</b>8<b class='flag-5'>系列</b>高算力通用<b class='flag-5'>MCU</b>

    瑞萨RA MCU家族推出集成Arm® Cortex®-M23内核的全新RA0系列

    瑞萨RA MCU家族推出全新的RA0系列RA0E1产品组是入门级简易MCU,具有出色的成本效益
    的头像 发表于 04-10 14:32 1276次阅读
    瑞萨<b class='flag-5'>RA</b> <b class='flag-5'>MCU</b>家族推出集成Arm® Cortex®-M23内核的全新<b class='flag-5'>RA</b>0<b class='flag-5'>系列</b>

    RA系列MCU Self-Test软件包介绍

    下面介绍一下瑞萨自检软件套件。该软件包包括RA系列MCU诊断软件、安全手册、用户指南和功能安全证书。RA
    的头像 发表于 07-15 09:38 585次阅读
    <b class='flag-5'>RA</b><b class='flag-5'>系列</b><b class='flag-5'>MCU</b> Self-Test软件包<b class='flag-5'>介绍</b>