了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序)。
前段时间完成的hyperboot_rl78, 是专门为Renesas 16-bit单片机RL78 写的通过串口更新程序的bootloader. 由于它是通过超级终端采用Send File的方式来传送Hex文件,文本原文传送,没有协议,所以基本上hyperboot_rl78是不会使用到产品上,只能在实验室用用。但是今天我要介绍的RL78 bootloader是可靠性非常高的一款串口bootloader。 它分两部分, 一部分是RL78 MCU 端boot程序 rl78Boot, 另一部分是PC端host 程序 rl78Loader. 他们之间有通信协定,所以快速,可靠,可以使用到最终的产品上。
rl78Boot是使用CS+ 和CC-RL开发的boot程序,rl78Boot与application 的memory map 设计和 hyperboot_rl78 是一样的,interrupt vector remap 也和hyperboot_rl78 一样,详见我上一篇博文。rl78Boot上电的时候就运行,3~4秒后如果没有接收到PC 端host 程序 rl78Loader发过来的更新程序请求。就跳转到正常的application去。如果接收到更新请求,就接收 rl78Loader发送过来的数据,并根据数据中的命令字段来执行相应的动作, 并根据结果返回ACK (0x15) 或 NACK (0x51)。
命令字段有以下几种
0x6F: HAND_SHAKE (握手,或叫更新请求)
0x02: WR_MEM (Flash 烧写)
0x03: ER_MEM (Flash 擦除)
0x04: VF_MEM (Flash 验证)
0x1F: RUN_APP (跳转到application)
rl78Boot的程序框架如下
void BTLD_BootProcess(void)
{
if (R_UART0_RcvFlag())
{
if (BTLD_FramePtr == 0)
{
uint8_t sof = R_UART0_FlagedReceive();
if ( sof != 0x02 && sof != 0x03 && sof != 0x04 && sof != 0x1F )
{
;
}
else
{
BTLD_ReceiveFrame[BTLD_FramePtr++] = sof;
}
}
else
{
BTLD_ReceiveFrame[BTLD_FramePtr++] = R_UART0_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];
uint32_t add32 = ((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;
}
}
}
rl78Loader是使用Visual Studio 2013和C#开发的带UI界面的PC端host程序, rl78Loader 界面上可以选择COM口,Baud rate, 加载要烧写的hex(目前只支持Motorola S-Record格式)。并将record数据转换成Bin数据。我为rl78Loader 和rl78Boot之间的交互,设计总共5种类型的帧分别对应到5种不同的命令,也就是 HAND_SHAKE, WR_MEM, ER_MEM, VF_MEM, RUN_APP。 5种帧的统一格式如下:
<CMD><ADDR_L><ADDR_H><ADDR_U><DATA_1><DATA_2>.....<DATA_n><CHECK_SUM>
上面就是自定义的通信协定,规定了每个帧包含命令字段一个(<CMD>), 地址字段三个(<ADDR_L>, <ADDR_H>和<ADDR_U>),组合起来就是24-bit地址。 数据字段n个<DATA_1>....<DATA_n>, 以及最后的校验和<CHECK_SUM>。每个字段都是1个Byte(8-bit)。 当某些字段不用时,可以填充0xFF。 比如握手帧在<CMD>段为0x6F, 在<ADDR_L>, <ADDR_H>, <ADDR_U>都为0xFF, 因为握手帧不需要地址内容。
UI 界面上"Start" 按钮按下后, 首先发送握手帧(CMD=0x6F),并重复多次,如果重复多次仍然没接受到ACK, Log窗口就会打印“bootloader not found".
但握手时一旦接收到ACK, 就会接着发送擦除帧(CMD=0x03),并等待ACK, 接着就是烧写帧(CMD=0x02), 验证帧(CMD=0x04), 最后是跳转帧(CMD=0x1F)。这个就是整个烧写流程。
rl78Loader 的UI 界面如下:
C语言RL78 serial bootloader和C#语言bootloader PC端串口通信程序的更多相关文章
-
C语言PIC16 serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 新PIC16 Boot ...
-
C语言dsPIC / PIC24 serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 新dsPIC/PIC2 ...
-
C语言PIC18 serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 新PIC18 Boot ...
-
C语言RH850 F1KM serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 今天我要介绍的RH85 ...
-
C语言PIC32 serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 今天介绍下我新完成的为 ...
-
C语言RH850 F1L serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程 ...
-
自己用C语言写RL78 serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 之前用C实现过多款PI ...
-
Win10 UWP 开发系列:使用多语言工具包让应用支持多语言
之前我在一篇blog中写过如何使用多语言工具包,见http://www.cnblogs.com/yanxiaodi/p/3800767.html 在WinEcos社区也发布过一篇详细的文章介绍多语言工 ...
-
《玩转D语言系列》二、D语言现状、基本规定和相关资源介绍
这算是本系列文章的一个序吧,主要是为以后的学习做铺垫,文本分为三个部分,第一部分是对于网上一些比较旧的资料的问题的一些更正,当然我也不可能看过所有的资料,难免会有遗漏.第二部分是D语言最基本的规定,第 ...
随机推荐
-
Java基础学习 -- I/O系统、流
Java类库里有四个表示流的抽象父类:InputStream.OutputStream.Reader.Writer. 其中 InputStream 和 OutputStream 是对字节进行操作的输入 ...
-
货运APP雨后春笋 传统物流模式将被改变
移动互联网正在改变我们的生活方式,各种手机APP充斥着人们的生活,物流行业也不例外.货运APP的出现,对于物流行业是一个提升的机会,也是迈向标准化和专业化的一个有效途径.有专家预测,这将为物流行业的发 ...
-
understand一些功能
功能 支持分析的语言 统计总的代码数据 统计单个文件的数据 分析代码复杂度 分析代码格式 文件的依赖关系 文件夹依赖关系 文件夹包含关系.代码量 understand提供了很多图表,同时它可以根据源码 ...
-
【转】服务器证书安装配置指南(Weblogic)
服务器证书安装配置指南(Weblogic) 详情请点击: http://verisign.itrus.com.cn/html/fuwuyuzhichi/fuwuqizhengshuanzhuangpe ...
-
jQuery插件之validate
一.jQuery.validate.js插件用于对表单输入进行验证,其使用配置非常简单.支持多事件触发,自带多种验证规则,还支持自定义验证规则. 1.配置方法. 先导入jQuery库,然后导入Vali ...
-
用pickle模块实现“增删改查”的简易功能
pickle的作用: 1:pickle.dump(dict,file)把字典转为二进制存入文件. 2:pickle.load(file)把文件二进制内容转为字典 import pickle # 增 d ...
-
ActiveMQ Message Groups
http://activemq.apache.org/message-groups.html 与Exclusive Consumer相比,Message Groups的对消息分组的粒度更细.具有相同g ...
-
Saving Princess claire_(hdu 4308 bfs模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Time Limit: 2000/1000 MS (Jav ...
-
C语言调用DIRECT3D的实例代码,通过lpVtbl字段进行
m_pDirect3D9 = Direct3DCreate9(D3D_SDK_VERSION); int w = 1920; int h = 1080; D3DPRESENT_PARAMETER ...
-
Eclipse Debug 调试
Debug 调试 Java 程序 我们可以在 Package Explorer 视图调试 Java 程序,操作步骤如下: 鼠标右击包含 main 函数的 java 类 选择 Debug As > ...