了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序)。
之前用C实现过多款PIC单片机的bootloader, 包括8-bit的PIC16,PIC18;16-bit的PIC24, dsPIC30, dsPIC33; 和32-bit的PIC32MX,PIC32MZ,我为这些类型PIC都写过C bootloader。今天要介绍的serial bootloader 是为我的RL78单片机学习板而写。RL78是Renesas的16-bit单片机。这是我第一次为Renesas的单片机写C 语言bootloader,遇到不少问题,通过不懈努力,总算成功的完成了我的第一个Renesas RL78 serial bootloader。我将这个RL78 serial bootloader命名为hyperboot_rl78, 因为hyperboot_rl78用到的上位机是hyperterm (超级终端)。写这篇博文的目的是来总结这次hyperboot_rl78的实现过程,总结内容包括bootloader的设计, bootloader的逻辑,bootloader的使用,实现环境,实现过程中遇到的问题,以及如何解决的。以上都会一一在这篇博文中介绍到。
首先介绍实现环境,IDE是CS+, C编译器是CC-RL, 硬件板是我的学习板, 详细如下:
IDE : CS+ for CC V7.00.00 [13 Jun 2018]
Compiler: CC-RL V1.07.00
MCU: RL78 F14 R5F10PPJ
Hardware: QB-R5F10PPJ-TB(e)
我的bootloader和application的memory map设计如下:
bootloader code range: 0x0000~0x33FF
application code range: 0x3400~0x3FFFF
application reset vector remap:0x4000
interrupt vector remap: 0x4006~0x40CA
bootloader 不使用interrupt,interrupt vector 区间0x4~0x7C remap到application的code区间0x4006~0x40CA。
bootloader code range设置, bootloader interrupt remap 都需要通过修改CS+ bootloader工程的Linker Option来实现。具体可以查阅CS+的帮助。
application code range设置, application reset vector remap 也需要修改CS+ application工程的Linker Option来实现。
另外,interrupt vector remap 到application code区间0x4006~0x40CA, application使用中断的话,需要在代码中建Juamp Table, 并将interrupt service routine的地址映射到Jump Table中。 我的做法是在application CS+ 工程的Linker Option中新增 .app_vector section, .app_vector section的地址范围0x4000~0x40CA(包括reset vector 和 interrupt vector).
Jump Table指定到.app_vetor section, 在Jump Table 添加跳转指令和_start 地址(cstartup for reset vector)或interrupt service routine的地址(for interrupt vector)到相对应的位置中。Jump Table我是用CC-RL的汇编指令实现的,为此我查阅了RL78的Software Manual。Jump Table 中的汇编代码例子如下: