了解更多关于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的更多相关文章

  1. 自己用C语言写RH850 F1L serial bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 由于有了RH850 F ...

  2. 自己用C语言写dsPIC / PIC24 serial bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). HyperBootlo ...

  3. 自己用C语言写单片机PIC18 serial bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). HyperBootlo ...

  4. 自己用C语言写单片机PIC16 serial bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 为什么自己写bootl ...

  5. 自己用C语言写NXP S32K144 serial bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader) 欢迎咨询或定制bootloader(在线升级程序). NXP S32K144 ...

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

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 今天我要介绍的RH85 ...

  7. 自己用C语言写NXP S32K116 serial bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 每次我有了新的EVA ...

  8. C语言RH850 F1L serial bootloader和C#语言bootloader PC端串口通信程序

                   了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程 ...

  9. C语言dsPIC / PIC24 serial bootloader和C#语言bootloader PC端串口通信程序

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 新dsPIC/PIC2 ...

随机推荐

  1. Spring cloud Eureka 服务治理(注册服务提供者)

    搭建完成服务注册中心,下一步可以创建服务提供者并向注册中心注册服务. 接下来我们创建Spring Boot 应用将其加入Eureka服务治理体系中去. 直接使用签名章节创建hello服务项目改造: 1 ...

  2. FusionCharts使用JavaScript渲染图表(不用Flash)

    FusionCharts可以让用户只使用JavaScript建立图表(而不是使用Flash),只需要添加另一行代码,如下所示: FusionCharts.setCurrentRenderer('jav ...

  3. 转:WPF中ListBox的创建和多种绑定用法

    先从最容易的开始演示ListBox控件的创建. Adding ListBox Items下面的代码是向ListBox控件中添加多项ListBoxItem集合.XAML代码如下:<ListBox ...

  4. Win10 应用商店管理应用

    在企业日常办公中,对 Windows 10 应用商店软件不需要,希望办公系统干净一些.企业运维中,我们可以使用组策略来管理Windows 10 微软Store应用程序.可以根据组织的要求进行配置,多项 ...

  5. 将ts文件合并为mp4命令

    cmd: copy/b D:\*.ts D:\new.ts 参考:http://blog.sina.com.cn/s/blog_66b4f1180102uzxs.html

  6. echarts 相关属性介绍

    title: {//图表标题     x: 'left', //组件离容器左侧的距离,left的值可以是像20,这样的具体像素值, 可以是像 '20%' 这样相对于容器高宽的百分比,也可以是 'lef ...

  7. POJ-2135 Farm Tour---最小费用最大流模板题(构图)

    题目链接: https://vjudge.net/problem/POJ-2135 题目大意: 主人公要从1号走到第N号点,再重N号点走回1号点,同时每条路只能走一次. 这是一个无向图.输入数据第一行 ...

  8. Android(java)学习笔记74:ListViewProject案例(ListView + ArrayAdapter)

    1. 首先是MainActivity.java文件,如下: package com.himi.lv1; import java.util.ArrayList; import java.util.Lis ...

  9. C语言 数组名不是首地址指针

    今天上计算机系统课的时候老师讲到了C中的聚合类型的数据结构.在解释数组名的时候说"数组名是一个指针,指向该数组的第一个元素",附上ppt(第二行): 我觉得这是不正确的,是一个常见 ...

  10. python剑指offer剪绳子

    题目 给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n>1并且m>1)每段绳子的长度记为k[0],k[1],…,k[m].请问k[0]k[1]…*k[m]可能的最大乘积是多少 ...