自己用C语言写RH850 F1KM serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序)。
手上有块Renesas RH850 F1KM的板子,几个月前有些空,准备给它写个串口bootloader。 写完后发现在debug模式下,bootloader工作很正常,能够正常烧写应用程序。但是在release模式下一直有R_FCL_ERR_PARAMETER错误,一直解决不了。后来非常忙,就没再去倒弄它了。昨天有点空,就仔细地查看了下。发现在boot.asm中有以下定义。
;-----------------------------------------------------------------------------
; hdwinit
; Specify RAM addresses suitable to your system if needed.
;-----------------------------------------------------------------------------
GLOBAL_RAM_ADDR .set 0
GLOBAL_RAM_END .set 0
LOCAL_RAM_ADDR .set 0
LOCAL_RAM_END .set 0
查看datasheet, 修改成实际值后, 就运行正常了。很有意思。
;-----------------------------------------------------------------------------
; hdwinit
; Specify RAM addresses suitable to your system if needed.
;-----------------------------------------------------------------------------
GLOBAL_RAM_ADDR .set 0xFEDD8000
GLOBAL_RAM_END .set 0xFEDE0000
LOCAL_RAM_ADDR .set 0xFEDE0000
LOCAL_RAM_END .set 0xFEE00000
接下来介绍下RH850 F1KM 串口 bootloader 如何实现。
首先介绍实现环境,IDE是CS+, C编译器是CC-RH, 硬件板是我的学习板, 详细如下:
IDE : CS+ for CC V7.00.00 [13 Jun 2018]
Compiler: CC-RH V2.00.00
MCU: RH850 F1KM R7F701684
FCL: RENESAS_FCL_RH850_T01_V2.12
我的bootloader和application的memory map设计如下:
bootloader code range: 0x0000~0x17FFF
application code range: 0x18000~0x1FFFFF (offset 0x18000)
bootloader code range设置,需要通过修改CS+ bootloader工程的Linker Option来实现。
application code range设置, 也需要修改CS+ application工程的Linker Option来实现。具体可以查阅CS+的帮助。
另外,application 的interrupt 入口需要在CS+ application工程中的boot.asm中添加。
bootloader 的上位机是串口终端hyperterm(超级终端)。 hyperterm的配置(串口配置)如下:
baud rate: 19200
data bytes: 8
parity: none
stop bits: 1
flow control : none
line delay: 150ms
上电后, bootloader 初始化uart (baudrate-data bytes-parity-stop bits-flow control 要和hyperterm的配置一致,19200-8-none-1-none, 否则通信不了)。bootloader 然后每隔1S左右打印一个 '.' , 打印完6个'.' (6S)就跳转到application. 如果要更新程序,就在6S内在hyperterm 窗口中敲一回车。bootloader 收到回车(代表握手成功)就开始擦除application code range. 打印 “Erasing *********" 每擦除一个block (1024 bytes) 就增加打印一个 ”*“直到所有application blocks都擦除完毕,并打印”Done“(代表擦除成功)。
hyperterm 窗口显示了bootloader 完成Erase后打印的”Done“,就操作hyperterm采用发送文本的方式发送application 的hex文件,一行接一行的发送,每发送一行就暂停240ms (配置hyperterm参数line delay = 240ms).
bootloader 每接收一行,原样打印,并解读里面的数据类型,地址,长度,数据,和Checksum, 如果数据类型为S1或S2,就将接收到的数据烧写到对应的地址。直到最后一行也处理完毕。整个烧写过程都没问题就打印”Program Rewritten Complete“ “(代表更新成功)。并跳转到application。 如果烧写过程有问题就打印”Program Rewritten Complete with Error“。
以上就是bootloader的更新程序的整个逻辑。代码框架如下:
void M_Bootloader_MainFunc(void)
{
switch (bootState)
{
case BOOT_HANDSHAKE:
M_Bootloader_Handshake();
break;
case BOOT_ERASE:
M_Bootloader_Erase();
break;
case BOOT_RECEIVE:
M_Bootloader_Receive();
break;
case BOOT_PROGRAM:
M_Bootloader_Write();
break;
case BOOT_VERIFY:
M_Bootloader_IVerify();
break;
case BOOT_PREJUMP:
Prejump_To_Application();
break;
case BOOT_JUMPTO_APP:
Jump_To_Application();
break;
default:
break;
}
}
整个过程, hyperterm中打印出来的内容就是更新流程log. 下面是一个完整的更新流程的部分log.
....BOOT Mode
Erasing*****************************Done
S0E0000726838353046314B6D6F7468
S090000E0020080010093
S214018000E0022480000000000000000000000000E4
S2140180101F00E0020E800000000000000000000CB
S214018020E0020080000000000000000000000000E8
S214018030E002F07F000000000000000000000000E9
S214018040E002E27F000000000000000000000000E7
S214018050E002D27F00000000000000000000000E7
S214018060E002C07F000000000000000000000000E9
S2140180701F00E002B07F00000000000000000000CA
S214018080E002A07F00000000000000000000000E9
S214018090E002907F000000000000000000000000E9
S2140180A0E002807F000000000000000000000000E9
自己用C语言写RH850 F1KM serial bootloader的更多相关文章
- 自己用C语言写RH850 F1L serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 由于有了RH850 F ...
- 自己用C语言写dsPIC / PIC24 serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). HyperBootlo ...
- 自己用C语言写单片机PIC18 serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). HyperBootlo ...
- 自己用C语言写单片机PIC16 serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 为什么自己写bootl ...
- 自己用C语言写NXP S32K144 serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader) 欢迎咨询或定制bootloader(在线升级程序). NXP S32K144 ...
- C语言RH850 F1KM serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 今天我要介绍的RH85 ...
- 自己用C语言写NXP S32K116 serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 每次我有了新的EVA ...
- C语言RH850 F1L serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程 ...
- C语言dsPIC / PIC24 serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 新dsPIC/PIC2 ...
随机推荐
- java - Socket简单编程实践
1.简介: 1)SOCKET是应用程序和网络之间的一个接口.SOCKET创建设置好以后,应用程序可以: 通过网络把数据发送到socket . 通过网络从socket接收数据.(通信的前提是应用程序知道 ...
- 谷歌插件 JSON-Handle
JSON-Handle http://jsonhandle.sinaapp.com/ 点击下载 插件下载后,在浏览器输入:chrome://extensions/ 将下载后的文件拖入 chrome浏览 ...
- 从零开始的全栈工程师——js篇2.12(面向对象)
面向对象 Js一开始就是写网页特效,面向过程的,作者发现这样写不好,代码重复利用率太高,计算机内存消耗太大,网页性能很差. 所以作者就收到java和c的影响,往面向对象靠齐.Js天生有一个Object ...
- aapt.exe finished with non-zero exit value 1
在一个APP 中导入 严振杰的 ALBUM,出现错误 在网上找了各种,最后在 stackoverflow上找到这样的说法: -Go to File->project structure-> ...
- php 03
php03 一.判断类型 is_bool() 判断是否是布尔型 is_int(),is_integer() 和is_long() 判断是否是整型 is_float(),is_double()和i ...
- 初识ListView - 定制ListView - 提升ListView运行效率
ListView绝对可以称得上是 Android 中最常用的控件之一,几乎所有的应用程序都会用到它.由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有大量的数据需要展示的 ...
- meterpreter > ps
meterpreter > ps Process List============ PID PPID Name Arch Session User Path --- ---- ---- ---- ...
- 命令行启动mysql服务
在<计算机网络>课程中曾学过net命令,可以用于启动后台服务.在mysql中,net命令用于启动后台服务器进程mysqld,即后台服务. 不过,如果在普通用户模式下net start my ...
- jqGrid中multiselect: true 操作checkbox
在jqGrid中设置multiselect: true可以实现全选的操作,但怎么设置被选中的checkbox里面的值呢,做法如下:jQuery("#listTable").jqGr ...
- js 正则匹配(去掉html标签)
正则匹配去掉所有html标签 var a = "<span>999</span>" a = a.replace(/<[^>]+>/g,' ...