精华内容
下载资源
问答
  • RH850/D1L/D1M组。用户手册:硬件。瑞萨RH850系列微控制器
  • RH850RH850/F1L)例程开发参考,可用于瑞萨单片机开发 开发环境是CS+,下载可直接使用
  • RH850 F1H 示例代码,可以学习基础系统构建方法。
  • website for get 瑞萨RH850F1x开发板和瑞萨E1仿真器 1、简介 本文介绍了RH850 FCL的使用以及相关的经验技巧,使用的环境如下 MCU:瑞萨RH850F1K 型号:R7F701557 编译器:IAR for RH850 编译器版本:IAR Embeded ...

    博主联系方式:QQ:1256153255 ,email:1256153255@qq.com

    website for get 瑞萨RH850F1x开发板和瑞萨E1仿真器

    1、简介

    本文介绍了RH850 FCL的使用以及相关的经验技巧,使用的环境如下
    MCU:瑞萨RH850F1K
    型号:R7F701557
    在这里插入图片描述
    编译器:IAR for RH850
    在这里插入图片描述
    编译器版本:IAR Embeded Workbench for Renesas RH850 V2.10.1
    IAR Embeded Workbench shared components V8.1.1.5550
    在这里插入图片描述
    仿真器:瑞萨E1仿真器
    在这里插入图片描述
    Flash烧录软件:Renesas Flash Programmer V3.08
    在这里插入图片描述
    FCL库版本:RENESAS_FCL_RH850_T01_V2.13

    瑞萨的资料本身就少,而有讲解FCL的文章更是少之又少,搜索了FCL的资料,找来找去也就那几篇介绍的,而且大家用的还是瑞萨自己的CS+编译器,用的MCU系列也不是F1K的,所以看了很多遍都无济于事。
    介于以上,自己就根据FCL库的官方介绍文档(RH850 Family Code Flash Library)一点点的摸索,这篇文档前后看了不下5遍,最终还是成功地将FCL移植到自己的开发板上了。

    2、R7F701557资源介绍

    既然在移植中使用的开发板芯片时R7F701557,那么就必须对R7F701557的片上资源(主要时ROM和RAM)有个明确的了解,查询芯片的用户手册得到
    在这里插入图片描述
    也就是说R7F701557的ROM:1MBytes RAM:64KBytes,地址范围分别如下。
    在这里插入图片描述在这里插入图片描述

    3、Section配置

    有前辈在blog中这样写到Section的配置
    在这里插入图片描述
    在这里插入图片描述
    这样的配置方法都是在CS+中操作的,那么我用的IAR是否已经将这些Section配置好了?如果配置好了,那么在那里配置的?如果没有配置好,那么怎么配置?

    首先从.map文件入手,看看是否已经有这些section了,查找之后确实有

    File name:*.map
    "ROM1ST", part 1 of 2:                          0x2ba2
      FCL_LIBRARY                            0x1f8  0x28b0  <Block>
        R_FCL_CODE_ROM                       0x1f8   0x2c4  <Block>
          R_FCL_CODE_ROM      ro code        0x1f8   0x228  r_fcl_user_if.o [1]
          R_FCL_CODE_ROM      ro code        0x420    0x9c  r_fcl_hw_access_asm.o [1]
        R_FCL_CODE_USRINT                    0x4bc     0x0  <Block>
          R_FCL_CODE_USRINT   ro code        0x4bc     0x0  r_fcl_hw_access_asm.o [1]
        R_FCL_CODE_USR                       0x4bc   0x1e0  <Block>
          R_FCL_CODE_USR      ro code        0x4bc   0x15a  fcl_ctrl.o [1]
          R_FCL_CODE_USR      ro code        0x618    0x84  fcl_user.o [1]
          R_FCL_CODE_USR      ro code        0x69c     0x0  r_fcl_hw_access_asm.o [1]
        R_FCL_CODE_RAM                       0x69c  0x1508  <Block>
          R_FCL_CODE_RAM      ro code        0x69c  0x13ac  r_fcl_hw_access.o [1]
          R_FCL_CODE_RAM      ro code       0x1a48    0x98  r_fcl_hw_access_asm.o [1]
          R_FCL_CODE_RAM      ro code       0x1ae0    0xc4  r_fcl_user_if.o [1]
        R_FCL_CODE_ROMRAM                   0x1ba4   0xeb4  <Block>
          R_FCL_CODE_ROMRAM   ro code       0x1ba4   0xb9a  r_fcl_hw_access.o [1]
          R_FCL_CODE_ROMRAM   ro code       0x2740   0x318  r_fcl_user_if.o [1]
          R_FCL_CODE_ROMRAM   ro code       0x2a58     0x0  r_fcl_hw_access_asm.o [1]
        R_FCL_CODE_RAM_EX_PROT
                                            0x2a58    0x50  <Block>
          R_FCL_CODE_RAM_EX_PROT
    
    File name:*.map
    "LOC1ST":                                       0x8000
      FCL_RAM_BLOCK_FCL_RESERVED
                                       0xfebe'0000  0x8000  <Block>
        FCL_RESERVED          uninit   0xfebe'0000  0x8000  main.o [1]
                                     - 0xfebe'8000  0x8000
    
    "RAM1ST":                                         0x80
      FCL_RAM_BLOCK_R_FCL_DATA
                                       0xfede'8000    0x80  <Block>
        R_FCL_DATA            uninit   0xfede'8000    0x80  r_fcl_user_if.o [1]
                                     - 0xfede'8080    0x80
    

    既然有这些section,那么是在哪里定义的呢?请看这两份文件layout.icf和lnkr7f701557.icf,这可是工程自带的,这两个文件里边应该是有猫腻的。关于.icf文件有看不懂的童鞋,请自行百度,此处不详述。
    在layout.icf中有这样两段定义

    File name:layout.icf
    define block FCL_RAM_BLOCK_FCL_RESERVED with fixed order, alignment=4 { rw section FCL_RESERVED };
    define block FCL_RAM_BLOCK_R_FCL_DATA with fixed order, alignment=4 { rw data section R_FCL_DATA };
    
    
    keep { section FCL_RESERVED };
    
    define block R_FCL_CODE_ROM with alignment=4 {ro code section R_FCL_CODE_ROM};
    define block R_FCL_CODE_USRINT with alignment=4 {ro code section R_FCL_CODE_USRINT};
    define block R_FCL_CODE_USR with alignment=4 {ro code section R_FCL_CODE_USR};
    define block R_FCL_CODE_RAM with alignment=4 {ro code section R_FCL_CODE_RAM};
    define block R_FCL_CODE_ROMRAM with alignment=4 {ro code section R_FCL_CODE_ROMRAM};
    define block R_FCL_CODE_RAM_EX_PROT with alignment=4 {ro code section R_FCL_CODE_RAM_EX_PROT};
    
    define block FCL_LIBRARY with fixed order, alignment=4  { ro section R_FCL_CONST,
                                                             block R_FCL_CODE_ROM,
                                                             block R_FCL_CODE_USRINT,
                                                             block R_FCL_CODE_USR,
                                                             block R_FCL_CODE_RAM,
                                                             block R_FCL_CODE_ROMRAM,
                                                             block R_FCL_CODE_RAM_EX_PROT
                                                            };
    

    既然有了section的定义,那么每个section分配的地址空间又是在哪儿定义的?继续找,找到这里

    File name:layout.icf
    "ROM1ST":place in ROM_1ST_region
    { 
      block CALLT,
      block TRAP,
      block FETRAP,
      block HVTRAP,
      ro,
      block FCL_LIBRARY,
      block .syscalltable,
      block .hvcalltable,
      block ROM_BLOCK
    };
    尤其要注意这里的FCL_LIBRARY
    

    也就是说,那些R_FCL_CODE_*的block都是属于FCL_LIBRARY这个大的block,而FCL_LIBRARY这个block属于ROM1ST,而ROM1ST又是place in ROM_1ST_region。那么ROM_1ST_region在哪儿定义的?继续找,发现layout.icf中没有了,那就去lnkr7f701557.icf中找找看,结果还真找到了

    File name:lnkrr7f701557.icf
    define region ROM_1ST_region = mem:[from 0x00000000 to 0x000FFFFF];      // <code default>  Code FLASH
    

    至此也就明白了,FCL_LIBRARY下的block是在哪儿定义的,以及是在哪儿分配的地址空间。

    OK,找完了ROM的section,还有两个在RAM中的section(R_FCL_DATA和FCL_RESERVED)也是同样的方法找

    File name:layout.icf
    "LOC1ST":place at start of LOC_1ST_region { block FCL_RAM_BLOCK_FCL_RESERVED };
    "LOC1ST":place in LOC_1ST_region
    { 
      rw section LOCAL1_RAM*
    };
    
    File name:lnkrr7f701557.icf
    define exported symbol _LOC_1ST_BEG = 0xFEBE0000;
    define exported symbol _LOC_1ST_END = 0xFEBEFFFF;
    define region LOC_1ST_region = mem:[from _LOC_1ST_BEG to _LOC_1ST_END];  // LOCAL1_RAM      Local RAM for PE1
    

    很好,也找完了。

    4、文件修改

    fcl_descriptor.h

    #define FCL_CPU_FREQUENCY_MHZ  (80)                          /*!< CPU frequency in MHz */
    #define FCL_AUTHENTICATION_ID {0xFFFFFFFF, \
                                   0xFFFFFFFF, \
                                   0xFFFFFFFF, \
                                   0xFFFFFFFF}                    /*!< 128Bit authentication ID */
    #define FCL_RAM_ADDRESS        0xFEDE0000                     /*!< RAM address range blocked for FCL */
    

    我们只需修改CPU频率和RAM地址
    从上边可以知道557的CPU频率是80MHz,RAM起始地址是0xFEDE 0000。

    5、main()函数执行

    5.1 ret = R_FCL_Init (&sampleApp_fclConfig_enu);

    该函数用于初始化FCL,这个函数在ROM中执行。

    5.2 ret = R_FCL_CopySections ();

    该函数用于将一些FCL代码块copy到RAM中一个特定的地址中。在这个位置上,虽然Code Flash不可使用但是代码依然可以被执行。
    函数R_FCL_CopySections在ROM中被执行。

    5.3 fpFct = ( uint32_t (*)() )R_FCL_CalcFctAddr ( (uint32_t)(&FCL_Ctrl) );

    fpFct ();
    这个函数用于计算一个从ROM复制到RAM的函数的新地址。也就是说R_FCL_CalcFctAddr是为了计算出一个新的RAM地址,这个地址用于在RAM中运行一个特定的函数,这个特定的函数是从ROM中搬到RAM中运行的。为了能够计算这个特定函数的新RAM地址,这个特定的函数必须是FCL linker segments之一。
    R_FCL_CalcFctAddr在ROM中被执行。

    其实看这两行代码还是挺有意思的,函数R_FCL_CalcFctAddr()的形参是地址,用法(uint32_t)(&FCL_Ctrl) 是取函数FCL_Ctrl的地址,也就是说作为R_FCL_CalcFctAddr()的实参。R_FCL_CalcFctAddr()的返回值是destination address也就是新的RAM地址,经过强制类型转换( uint32_t (*)() )之后,R_FCL_CalcFctAddr成了一个函数指针,返回值是一个指针,指向新的RAM地址。因此fpFct ();是在RAM中执行的。从而实现了将FCL_Ctrl从ROM搬到RAM执行。

    5.4 最后就是while(1)这个主循环了。

    由于FCL_Ctrl在RAM中执行,那么在仿真时就没法看到FCL_Ctrl函数体的执行情况了。
    所以在此为了能够看到FCL_Ctrl的执行结果,就定义了一个全局变量test_value用于观察FCL_Ctrl的执行结果。
    
    5.4.1 获取Flash的Block Counter
    void FCL_Ctrl (void)
    {
        r_fcl_request_t     myRequest;
    #if R_FCL_COMMAND_EXECUTION_MODE == R_FCL_HANDLER_CALL_USER
            r_fcl_request_t mySecRequest;
    #endif
        uint8_t             writeBuffer_u08[512];
        uint32_t            readBuffer_u32[8];
        uint16_t            i;
    
        REINITIALIZE_BUFFER;
    
        FCLUser_Open ();
    
        /* prepare environment */
        myRequest.command_enu = R_FCL_CMD_PREPARE_ENV;
        R_FCL_Execute (&myRequest);
        #if R_FCL_COMMAND_EXECUTION_MODE == R_FCL_HANDLER_CALL_USER
            while (R_FCL_BUSY == myRequest.status_enu)
            {
                R_FCL_Handler ();
            }
        #endif
    
        /* get block count */
        myRequest.command_enu   = R_FCL_CMD_GET_BLOCK_CNT;
        myRequest.bufferAdd_u32 = (uint32_t)&readBuffer_u32[0];
        R_FCL_Execute (&myRequest);
        #if R_FCL_COMMAND_EXECUTION_MODE == R_FCL_HANDLER_CALL_USER
            while (R_FCL_BUSY == myRequest.status_enu)
            {
                R_FCL_Handler ();
            }
        #endif
        test_value = myRequest.bufferAdd_u32;
    
    //    /* get block end address of block 2 */
    //    REINITIALIZE_BUFFER;
    //    myRequest.command_enu   = R_FCL_CMD_GET_BLOCK_END_ADDR;
    //    myRequest.bufferAdd_u32 = (uint32_t)&readBuffer_u32[0];
    //    myRequest.idx_u32       = 0x2;                   /* result: 0x5fff */
    //    R_FCL_Execute (&myRequest);
    //    test_value = myRequest.bufferAdd_u32;
    //
    //    /* erase block 2 and 3 */
    //    myRequest.command_enu = R_FCL_CMD_ERASE;
    //    myRequest.idx_u32     = 0x2;                   /* erased range = 0x4000 to 0x7fff */
    //    myRequest.cnt_u16     = 2;
    //    R_FCL_Execute (&myRequest);
    //    #if R_FCL_COMMAND_EXECUTION_MODE == R_FCL_HANDLER_CALL_USER
    //        while (R_FCL_BUSY == myRequest.status_enu)
    //        {
    //            R_FCL_Handler ();
    //        }
    //    #endif
    //
    //    /* write 512 bytes to address 0x40000 (start of block 2) */
    //    REINITIALIZE_BUFFER;
    //    myRequest.command_enu = R_FCL_CMD_WRITE;
    //    myRequest.bufferAdd_u32 = (uint32_t)&writeBuffer_u08[0];
    //    myRequest.idx_u32       = 0x4000;
    //    myRequest.cnt_u16       = 2;                    /* written bytes = 256 * cnt_u16 */
    //    R_FCL_Execute (&myRequest);
    //    #if R_FCL_COMMAND_EXECUTION_MODE == R_FCL_HANDLER_CALL_USER
    //        while (R_FCL_BUSY == myRequest.status_enu)
    //        {
    //            R_FCL_Handler ();
    //        }
    //    #endif
    //    test_value = 0x4004;
    
        FCLUser_Close ();
    } /* FCL_Ctrl */
    

    经Debug,返回值是38个Block,正确。
    在这里插入图片描述

    5.4.2 获取指定Block的end address
    void FCL_Ctrl (void)
    {
        r_fcl_request_t     myRequest;
    #if R_FCL_COMMAND_EXECUTION_MODE == R_FCL_HANDLER_CALL_USER
            r_fcl_request_t mySecRequest;
    #endif
        uint8_t             writeBuffer_u08[512];
        uint32_t            readBuffer_u32[8];
        uint16_t            i;
    
        REINITIALIZE_BUFFER;
    
        FCLUser_Open ();
    
        /* prepare environment */
        myRequest.command_enu = R_FCL_CMD_PREPARE_ENV;
        R_FCL_Execute (&myRequest);
        #if R_FCL_COMMAND_EXECUTION_MODE == R_FCL_HANDLER_CALL_USER
            while (R_FCL_BUSY == myRequest.status_enu)
            {
                R_FCL_Handler ();
            }
        #endif
    
        /* get block count */
        myRequest.command_enu   = R_FCL_CMD_GET_BLOCK_CNT;
        myRequest.bufferAdd_u32 = (uint32_t)&readBuffer_u32[0];
        R_FCL_Execute (&myRequest);
        #if R_FCL_COMMAND_EXECUTION_MODE == R_FCL_HANDLER_CALL_USER
            while (R_FCL_BUSY == myRequest.status_enu)
            {
                R_FCL_Handler ();
            }
        #endif
        test_value = myRequest.bufferAdd_u32;
    
        /* get block end address of block 2 */
        REINITIALIZE_BUFFER;
        myRequest.command_enu   = R_FCL_CMD_GET_BLOCK_END_ADDR;
        myRequest.bufferAdd_u32 = (uint32_t)&readBuffer_u32[0];
        myRequest.idx_u32       = 0x2;                   /* result: 0x5fff */
        R_FCL_Execute (&myRequest);
        test_value = myRequest.bufferAdd_u32;
    
    //    /* erase block 2 and 3 */
    //    myRequest.command_enu = R_FCL_CMD_ERASE;
    //    myRequest.idx_u32     = 0x2;                   /* erased range = 0x4000 to 0x7fff */
    //    myRequest.cnt_u16     = 2;
    //    R_FCL_Execute (&myRequest);
    //    #if R_FCL_COMMAND_EXECUTION_MODE == R_FCL_HANDLER_CALL_USER
    //        while (R_FCL_BUSY == myRequest.status_enu)
    //        {
    //            R_FCL_Handler ();
    //        }
    //    #endif
    //
    //    /* write 512 bytes to address 0x40000 (start of block 2) */
    //    REINITIALIZE_BUFFER;
    //    myRequest.command_enu = R_FCL_CMD_WRITE;
    //    myRequest.bufferAdd_u32 = (uint32_t)&writeBuffer_u08[0];
    //    myRequest.idx_u32       = 0x4000;
    //    myRequest.cnt_u16       = 2;                    /* written bytes = 256 * cnt_u16 */
    //    R_FCL_Execute (&myRequest);
    //    #if R_FCL_COMMAND_EXECUTION_MODE == R_FCL_HANDLER_CALL_USER
    //        while (R_FCL_BUSY == myRequest.status_enu)
    //        {
    //            R_FCL_Handler ();
    //        }
    //    #endif
    //    test_value = 0x4004;
    
        FCLUser_Close ();
    } /* FCL_Ctrl */
    

    经Debug,block2的end address返回值是0x0000 5FFFF,正确。
    在这里插入图片描述

    5.4.3 对Code Flash进行write,然后读取,确认数值是否正确

    注意:write之前要先Erase

    void FCL_Ctrl (void)
    {
        r_fcl_request_t     myRequest;
    #if R_FCL_COMMAND_EXECUTION_MODE == R_FCL_HANDLER_CALL_USER
            r_fcl_request_t mySecRequest;
    #endif
        uint8_t             writeBuffer_u08[512];
        uint32_t            readBuffer_u32[8];
        uint16_t            i;
    
        REINITIALIZE_BUFFER;
    
        FCLUser_Open ();
    
        /* prepare environment */
        myRequest.command_enu = R_FCL_CMD_PREPARE_ENV;
        R_FCL_Execute (&myRequest);
        #if R_FCL_COMMAND_EXECUTION_MODE == R_FCL_HANDLER_CALL_USER
            while (R_FCL_BUSY == myRequest.status_enu)
            {
                R_FCL_Handler ();
            }
        #endif
    
        /* get block count */
        myRequest.command_enu   = R_FCL_CMD_GET_BLOCK_CNT;
        myRequest.bufferAdd_u32 = (uint32_t)&readBuffer_u32[0];
        R_FCL_Execute (&myRequest);
        #if R_FCL_COMMAND_EXECUTION_MODE == R_FCL_HANDLER_CALL_USER
            while (R_FCL_BUSY == myRequest.status_enu)
            {
                R_FCL_Handler ();
            }
        #endif
        test_value = myRequest.bufferAdd_u32;
    
        /* get block end address of block 2 */
        REINITIALIZE_BUFFER;
        myRequest.command_enu   = R_FCL_CMD_GET_BLOCK_END_ADDR;
        myRequest.bufferAdd_u32 = (uint32_t)&readBuffer_u32[0];
        myRequest.idx_u32       = 0x2;                   /* result: 0x5fff */
        R_FCL_Execute (&myRequest);
        test_value = myRequest.bufferAdd_u32;
    
        /* erase block 2 and 3 */
        myRequest.command_enu = R_FCL_CMD_ERASE;
        myRequest.idx_u32     = 0x2;                   /* erased range = 0x4000 to 0x7fff */
        myRequest.cnt_u16     = 2;
        R_FCL_Execute (&myRequest);
        #if R_FCL_COMMAND_EXECUTION_MODE == R_FCL_HANDLER_CALL_USER
            while (R_FCL_BUSY == myRequest.status_enu)
            {
                R_FCL_Handler ();
            }
        #endif
    
        /* write 512 bytes to address 0x40000 (start of block 2) */
        REINITIALIZE_BUFFER;
        myRequest.command_enu = R_FCL_CMD_WRITE;
        myRequest.bufferAdd_u32 = (uint32_t)&writeBuffer_u08[0];
        myRequest.idx_u32       = 0x4000;
        myRequest.cnt_u16       = 2;                    /* written bytes = 256 * cnt_u16 */
        R_FCL_Execute (&myRequest);
        #if R_FCL_COMMAND_EXECUTION_MODE == R_FCL_HANDLER_CALL_USER
            while (R_FCL_BUSY == myRequest.status_enu)
            {
                R_FCL_Handler ();
            }
        #endif
        test_value = 0x4004;
    
        FCLUser_Close ();
    } /* FCL_Ctrl */
    

    经Debug,地址0x0000 4004开始的4Bytes数据是0x04 0x05 0x06 0x07,正确。
    在这里插入图片描述
    解释:因为我们数据存储使用的是Motorola格式(高字节在前),所以Debug出来结果显示是0x07060504
    在这里插入图片描述
    关于Erase和Write质量要特别注意一点:
    很多时候执行力Erase之后,返回的myRequest.status_enu为R_FCL_ERR_PROTECTION,这是由于Flash被保护起来了,解决办法就是使用RFP对真个chip进行Erase再进行这些指令。
    在这里插入图片描述

    有疑问或需要探讨的地方,欢迎留言交流

    本店铺有瑞萨E1仿真器,瑞萨RH850F1x开发板(RH850F1L,RH850F1K,RH850F1H,RH850F1KM,RH850F1KH),CANPiggy/LINPiggy,CANBOX(CANcase XL/VN1630替代款),CANoe,GHS,欢迎大家进店咨询。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 瑞瑞萨rh850f1kh——hardware手册萨rh850f1kh——hardware手册
  • 汽车行业RH850芯片的内核模型spec。包括内核寄存器及指令。便于开发人员学习和使用。要学习的同学赶紧下载吧!
  • RH850-mot-file-CRC-calculator Python calculator for the RH850 mot file CRC 在使用RH850的 MOT 文件的时候,用来计算最后两位CRC数值的小计算器,输入 string ,输出的数据需要肉眼截取得到最后两位。
  • 认真的朋友会发现,我的上一篇博文《基于IAR for RH850的瑞萨RH850 FCL库用法介绍》在最后留下了一个bug,就是当FCL执行ERASE或WRITE时,返回的状态myRequest.status_enu经常是0x00000005(R_FCL_ERR_PROTEC

    版权声明
    本博文系欧科曼汽车电子所有,转载请注明出处。 欧科曼汽车电子致力于瑞萨MCU及周边相关产品开发设计。
    email:1256153255@qq.com
    website for get 瑞萨RH850F1x开发板和瑞萨E1仿真器

    认真的朋友会发现,我的上一篇博文《基于IAR for RH850的瑞萨RH850 FCL库用法介绍》在最后留下了一个bug,就是当FCL执行ERASE或WRITE时,返回的状态myRequest.status_enu经常是0x00000005(R_FCL_ERR_PROTECTION),在上一篇博客最后给的解决办法是通过RFP进行Chip的ERASE,但是这种方式的ERASE之后,只能正常的执行一次FCL的WRITE,第二次时又会出现R_FCL_ERR_PROTECTION。

    在FCL官方手册上分析出现R_FCL_ERR_PROTECTION的原因如下
    在这里插入图片描述
    官方给的原因是:安全设置(安全Flag)被Enable了,导致Code Flash被 Protection了,解决办法就是Disable安全设置。
    怎么Disable呢?继续查手册,找到这里
    在这里插入图片描述
    那就是说宏R_FCL_SUPPORT_SECURITYFLAGS是负责安全设置的Enable和Disable的,那好办呀,把代码中的R_FCL_SUPPORT_SECURITYFLAGS注释掉就完了。结果注释掉之后还是没完,依然R_FCL_ERR_PROTECTION。

    那就试试其他区域呗,如下修改

    /* erase block 2 and 3 */
        myRequest.command_enu = R_FCL_CMD_ERASE;
        myRequest.idx_u32     = 0x2;                   /* erased range = 0x4000 to 0x7fff */
        myRequest.cnt_u16     = 1;
        R_FCL_Execute (&myRequest);
        #if R_FCL_COMMAND_EXECUTION_MODE == R_FCL_HANDLER_CALL_USER
            while (R_FCL_BUSY == myRequest.status_enu)
            {
                R_FCL_Handler ();
            }
        #endif
        test_value = myRequest.status_enu;
    
        /* write 512 bytes to address 0x40000 (start of block 2) */
        REINITIALIZE_BUFFER;
        myRequest.command_enu = R_FCL_CMD_WRITE;
        myRequest.bufferAdd_u32 = (uint32_t)&writeBuffer_u08[0];
        myRequest.idx_u32       = 0x4000;
        myRequest.cnt_u16       = 1;                    /* written bytes = 256 * cnt_u16 */
        R_FCL_Execute (&myRequest);
        #if R_FCL_COMMAND_EXECUTION_MODE == R_FCL_HANDLER_CALL_USER
            while (R_FCL_BUSY == myRequest.status_enu)
            {
                R_FCL_Handler ();
            }
        #endif
        test_value = myRequest.idx_u32;
    

    ↓↓↓↓↓↓↓↓↓

    /* erase block 2 and 3 */
        myRequest.command_enu = R_FCL_CMD_ERASE;
        myRequest.idx_u32     = 0x3;                   /* erased range = 0x4000 to 0x7fff */
        myRequest.cnt_u16     = 1;
        R_FCL_Execute (&myRequest);
        #if R_FCL_COMMAND_EXECUTION_MODE == R_FCL_HANDLER_CALL_USER
            while (R_FCL_BUSY == myRequest.status_enu)
            {
                R_FCL_Handler ();
            }
        #endif
        test_value = myRequest.status_enu;
    
        /* write 512 bytes to address 0x40000 (start of block 2) */
        REINITIALIZE_BUFFER;
        myRequest.command_enu = R_FCL_CMD_WRITE;
        myRequest.bufferAdd_u32 = (uint32_t)&writeBuffer_u08[0];
        myRequest.idx_u32       = 0x6000;
        myRequest.cnt_u16       = 1;                    /* written bytes = 256 * cnt_u16 */
        R_FCL_Execute (&myRequest);
        #if R_FCL_COMMAND_EXECUTION_MODE == R_FCL_HANDLER_CALL_USER
            while (R_FCL_BUSY == myRequest.status_enu)
            {
                R_FCL_Handler ();
            }
        #endif
        test_value = myRequest.idx_u32;
    

    竟然可以了,再试试后边的其他block,也可以
    那就是Block2不能这么玩儿了,为什么呢?是不是Block2放的还是Code,不能擦除呢?查map文件

      11 638 bytes of readonly  code memory
          50 bytes of readonly  data memory
      41 116 bytes of readwrite data memory
    

    Code量占用了11638Bytes,Block0和Block1共16KB,够用。

    没辙了!!!

    那就用RFP把整个1M的Code Flash读出来看看,结果发现问题所在了

    S0110000437265617465642062792052465033
    S31500000000E0022C2C000000000000000000000000B0
    S315000000101F00E0027E2D000000000000000000002E
    S31500000020EE0F4000C10E1F001F00E0027E2D0000F3
    S31500000030EE0F4000C10E0F001F00E002662D00000B
    。。。。。。。。
    S31500002D7050000000000000008207610006E863EFD3
    S31500002D8001000338013280FF0600A5FD7F00000028
    S31500002D90850500008505000085050000E00748015F
    S31500002DA041000000410000004100FFFFFFFFFFFF60
    S31500002DB0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D
    S31500002DC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D
    S31500002DD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD
    

    从这段来看,code是放在Block0和Block1是没错。

    但是,再往下

    S31500003FD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB
    S31500003FE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB
    S31500003FF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB
    S31500004000000800000241000008000240000104040C
    S31500004010000000002004000008020A080100080A47
    S315000040200400820000000000008000000000060678
    S31500004030000000220000000008000A08100400002A
    。。。。。。。。
    S31500005FD000000000000000000000000000000000BB
    S31500005FE000000000000000000000000000000000AB
    S31500005FF0000000000000000000000000000000009B
    S31500006000000102030405060708090A0B0C0D0E0F12
    S31500006010101112131415161718191A1B1C1D1E1F02
    S31500006020202122232425262728292A2B2C2D2E2FF2
    

    发现没有,Block2(0x0000 4000~0x0000 5FFF)不是ERASE状态,所以 不能 写 入。
    而Block3开始(0x0000 6000)就是我们刚才写入的值。这下明白了吧,原来Block2不是ERASE状态。

    但是这里还有两个疑问:
    1、Block2里边这些数据是什么内容?
    2、在FCL的COMMOND指令对Block2执行了R_FCL_CMD_ERASE,为什么不能正常ERASE?

    这两个问题,还没找到原因,找到之后和大家共享出来,如有朋友知道,也请留言对我进行扫盲。

    展开全文
  • 瑞萨RH850系列CAN驱动配置工具
  • 瑞萨32位单片机 RH850/F1L用户手册 (r01uh0390ej0133) Rev.1.33 Apr, 2016 The RH850/F1L is ideal for automotive electronics, such as BCM (body control module), gateway, HVAC, lighting modules, and many ...
  • RENESAS RH850技术资料

    2018-07-23 20:35:24
    RENESAS RH850技术资料 器件型号:RH850F1L 厂商名称:Renesas Electronics Corporation [Renesas Electronics Corporation] 厂商官网:https://www.renesas.com/
  • RH850 用户手册

    2017-12-11 18:25:31
    RH850详细的用户手册,加强了功能安全,故障诊断,通信安全等特性
  • RH850 D1汇编指令

    2017-07-04 15:46:56
    RH850 D1汇编指令
  • TFT模块,rh850

    2017-09-28 10:10:17
    用于RH850开发的TFT模组 800 480 ,用于RH850开发的TFT模组 800 480 ,用于RH850开发的TFT模组 800 480 ,用于RH850开发的TFT模组 800 480 ,用于RH850开发的TFT模组 800 480 ,
  • 瑞萨 rh850 用户手册

    2016-12-16 11:06:31
    瑞萨 汽车电子芯片RH850 用户手册
  • freertos RH850 D1l移植

    2017-07-04 14:59:23
    freertos ,RH850
  • RH850D1LM_User_Manual_HW.pdf

    2020-01-09 09:45:46
    瑞萨RH850 D1系列芯片手册 瑞萨RH850 D1系列芯片手册 瑞萨RH850 D1系列芯片手册 瑞萨RH850 D1系列芯片手册
  • 瑞萨 RH850 F1K 芯片手册 瑞萨 RH850 F1K 芯片手册 瑞萨 RH850 F1K 芯片手册 瑞萨 RH850 F1K 芯片手册 瑞萨 RH850 F1K 芯片手册
  • RH850 D1系列Datasheet

    2017-07-04 15:42:38
    RH850 D1系列Datasheet
  • RH850开发环境搭建.doc

    2020-04-04 14:23:30
    RH850开发环境搭建,内部包含cancasexl的驱动安装,canoe的软件安装,IAR的软件安装,E1的自检等。
  • RH850 Hardware User Manual

    2018-11-29 19:28:06
    Renesas RH850 Hardware User Manual,对于从事汽车电子行业的同学,尤其是从事ADAS相关产品的工程师,可能会接触到这个系列的芯片。
  • Rh850_Code Flash Library

    2018-05-29 10:02:41
    Rh850系列处理器的程序段资源库。包含架构,FCL功能,用户接口(API 数据类型,功能,指令函数等),例程说明等。
  • RH850F1L_21_IIC.7z

    2021-04-14 13:49:02
    本资源是RH850/F1L的IIC驱动程序。 RH850/F1L是Renesas/瑞萨的一款汽车级的32bit芯片/MCU,内部集成多种通信接口,比如IIC。本资源是IIC驱动程序,包含演示了IIC主机发送,从机接收例程;IIC主机接收,从机发送例程...
  • SD13_RH850F1L_WDTA.7z

    2021-04-13 20:38:34
    本资源是RH850/F1L的WDT看门狗驱动程序。 RH850/F1L是Renesas(瑞萨)的一款汽车级的32bit MCU芯片,其内部集成2个看门狗模块。本例程包含两个工程,一个演示动态码喂狗,一个演示固定码喂狗。注意OptionByte选项...
  • RH850F1L_24_UART.7z

    2021-04-14 14:45:02
    本资源是RH850/F1L的UART驱动程序。 RH850/F1L是Renesas(瑞萨)的一款汽车级的32bit芯片/MCU,内部集成LIN通信控制器,该LIN控制器可以用作UART通信。本资源包含两个例程,一个是用RLIN3模块去实现UART通信,一个是...
  • RH850F1L_22_LIN.7z

    2021-04-14 14:04:00
    本资源是RH850/F1L的LIN驱动程序。 RH850/F1L是Renesas/瑞萨的一款汽车级的32bit芯片/MCU,内部集成LIN通信控制器。本资源包含使用RLIN27作为LIN master进行通信的例程,和使用RLIN30作为LIN slave进行通信的例程。...
  • SD12_RH850F1L_RTC.7z

    2021-04-13 15:56:47
    本资源是RH850/F1L的RTC实时时钟驱动程序。 RH850/F1L是Renesas/瑞萨的一款汽车级的32bit芯片/MCU,其内部集成RTC模块,对应年/月/日/时/分/秒进行计数。本例程是RTC的驱动样例。 适用于使用RH850/F1L芯片进行...
  • 很详细的瑞萨renesas RH850 RH850F1L 数据手册 datasheet。
  • SD8_RH850F1L_CRC.7z

    2021-04-13 14:33:20
    本资源是RH850/F1L的CRC模块的驱动使用样例。 RH850/F1L是Renesas/瑞萨的一款汽车级的32bit芯片/MCU,其内部集成硬件CRC校验器,大大提高安全校验速度,同时有效减少了CPU运算负载。 本例程演示该CRC校验器的使用。...
  • RH850F1L_23_LPS.7z

    2021-04-14 14:32:28
    本资源是RH850/F1L的LPS驱动程序。 RH850/F1L是Renesas/瑞萨的一款汽车级的32bit芯片/MCU,性能高,功耗低。其内部集成一个低功耗采样器(Low-Power Sampler),用于监测数字I/O引脚,模拟I/O引脚电平电压,从而...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,033
精华内容 413
关键字:

rh850