zoukankan      html  css  js  c++  java
  • 自己用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
  • 相关阅读:
    如何在 Linux 虚拟机上扩展根文件系统
    Linux 虚拟机中配置 GNOME + VNC
    在 Linux 中使用 Azure Premium 存储的基本优化指南
    如何为运行的 ARM Linux 启用 LAD2.3 版本的诊断扩展
    不要在构造函数中抛出异常
    vtk java
    富文本keditor的一些使用问题
    几个问题
    Java并发编程(十四)并发容器类
    FreeBSD编译安装emacs,不要用ports
  • 原文地址:https://www.cnblogs.com/geekygeek/p/hyperbootloader_rh850F1KM.html
Copyright © 2011-2022 走看看