了解更多关于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 界面: