C語言RH850 F1KM serial bootloader和C#語言bootloader PC端串口通信程序

       瞭解更多關於bootloader 的C語言實現,請加我QQ: 1273623966 (驗證信息請填 bootloader),歡迎諮詢或定製bootloader(在線升級程序)。

       今天我要介紹的RH850 bootloader是最近才完成的一款串口bootloader。 它和RL78 bootloader非常相似, 也分兩部分, 一部分是RH850 MCU 端boot程序 rh850f1kmBoot,  另一部分是PC端host 程序 rh850Loader. 他們之間有通信協定, 通信協定如下:

                0x6F:     HAND_SHAKE (握手,或叫更新請求)

                0x02:     WR_MEM    (Flash 燒寫)

                0x03:      ER_MEM    (Flash 擦除)

                0x04:     VF_MEM     (Flash 驗證)

                0x1F:    RUN_APP    (跳轉到application)

       rh850f1kmBoot 的開發環境:

                IDE:         CS+  for CC V7.00.00 [13 Jun 2018]

               Compiler:    CC-RH V2.00.00

               MCU:          RH850 F1KM R7F701684

      用到了Renesas官方提供的flash library:  RENESAS_FCL_RH850_T01_V2.12

      rh850f1kmBoot memory map (code flash range):   0x0000~0x17FFF;

      並且新增了以下ROM sections:

                               R_FCL_CODE_ROM.text,                    &
                               R_FCL_CONST.const,                      &
                               R_FCL_CODE_USRINT.text,                 &
                               R_FCL_CODE_USR.text,                    &
                               R_FCL_CODE_RAM.text,                    &
                               R_FCL_CODE_ROMRAM.text,                 &
                               R_FCL_CODE_RAM_EX_PROT.text

     以及RAM sections:

                              FCL_RESERVED.bss/FEDE0000,              &

                              R_FCL_DATA.bss,                         &
                               .stack.bss                      /FEDE8000

   以上設置都是參照Renesas flash library pacakge (FCL) 裏面的sample來做的。在CS+ 工程的linker option裏配置好這些設置就可以了。

   配置好了,剩下的就是完成代碼了。

 

if (R_UART1_RcvFlag())
    {
        if (BTLD_FramePtr == 0)
        {
            uint8_t sof = R_UART1_FlagedReceive();
            if ( sof != 0x02 && sof != 0x03 && sof != 0x04 && sof != 0x1F )
            {
                ;
            }
            else
            {
                BTLD_ReceiveFrame[BTLD_FramePtr++] = sof;
            }
        }
        else
        {
            BTLD_ReceiveFrame[BTLD_FramePtr++] = R_UART1_FlagedReceive();
        }
    }
    if (BTLD_FramePtr == FRAME_BUFF_SIZE)
    {
        uint8_t cmd = BTLD_ReceiveFrame[CMD_INDEX];
        uint8_t addL = BTLD_ReceiveFrame[ADDRL_INDEX];
        uint8_t addH = BTLD_ReceiveFrame[ADDRH_INDEX];
        uint8_t addU = BTLD_ReceiveFrame[ADDRU_INDEX];
        uint8_t addM = BTLD_ReceiveFrame[ADDRM_INDEX];
        uint32_t add32 = ((uint32_t)addM << 24)|((uint32_t)addU << 16)|((uint32_t)addH << 8) | addL;
        BTLD_FramePtr = 0;
        switch (cmd)
        {
            case ER_MEM:
                BTLD_FlashErase(add32);
                resetDataBuffer(BTLD_ReceiveFrame, FRAME_BUFF_SIZE);
                break;
            case WR_MEM:
                BTLD_FlashWrite(add32);
                resetDataBuffer(BTLD_ReceiveFrame, FRAME_BUFF_SIZE);
                break;
            case VF_MEM:
                BTLD_FlashVerify(add32);
                break;
            case RUN_APP:
                Jump_To_Application(add32);
                break;
            default:
                break;
        }
    }

   以上是芯片端的rh850f1kmBoot的實現。 PC 端rh850Loader 是用C# 實現的。加載hex後按照協定通過RS232傳輸地址和數據。
  RS232 的配置如下:19200-8-None-1-None.  (19200bps 是我最常用的UART的Baud Rate 了)。

  rh850Loader 帶UI 界面:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章