C语言RL78 serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于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语言最基本的规定,第 ...
随机推荐
- robotframework_如何用Chrome模拟手机打开H5页面
由于公司目前的产品大部分都是APP端的H5页面,APP原生页面很少,测试H5页面如果去搭建appium或者macaca这类自动化平台太费时,太重而不能快速落地:与自动化的目标:提高测试效率相悖.但如果 ...
- 使用jvisualvm.exe工具查看java项目内存溢出(堆溢出)
在查看内存溢出的时候,我们需要明白,堆溢出和持久代溢出,他们不一样,说到内存泄漏,我们就需要明白,内存中 年老代和新生代,和持久代,这3块的数据 自己的理解: new了一个对象,会进入到堆里面,先放 ...
- Android(java)学习笔记14:Java线程池
1. 线程池: 1)程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互.而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池. 2)线程池里 ...
- 用C#生成不反复的随机数
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/xiebaochun/article/details/28900237 对于随机数,大家都知道,计算机 ...
- POJ 1191 棋盘分割 【DFS记忆化搜索经典】
题目传送门:http://poj.org/problem?id=1191 棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submission ...
- [19/03/17-星期日] 常用类_Calendar日历类&GregorianCalendar公历日历类
一.概念 Calendar 类是一个抽象类,为我们提供了关于日期计算的相关功能,比如:年.月.日.时.分.秒的展示和计算. GregorianCalendar 是 Calendar 的一个具体子类,提 ...
- Services 在多个 controller 中共享数据。
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- TensorFlow安装环境的误区
安装py一定要注意安装的版本,我一开始安装的3.7版本的,现在还没有支持,另外,看清楚自己电脑是32位还是64位的
- git使用过程的问题与解决办法
一.什么是Git Git是目前世界上最先进的分布式版本控制系统.工作原理 / 流程: Workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remote ...
- ios应用数据存储方式(偏好设置)-转
一.简单介绍 1.很多ios应用都支持偏好设置,比如保存用户名,密码,字体大小等设置,ios提供了一套标准的解决方案来为应用加入偏好设置功能. 2.每个应用都有个NSUserDefaults实例,通过 ...