瑞萨RL78簇bootloader深入探讨(一):User工程建立
瑞萨RL78簇bootloader深入探讨(一)
前言
bootloader是单片机开发重要的一环,近期笔者需要完成一个瑞萨相关的bootloader项目,然而ARM有关bootloader的开发资料网上能找到很多,但是瑞萨相关的资料相对而言就少很多了。经过一周多从各处收集资料,总结,实验,现将近期完成的一些工作整理成本文,以便日后翻查和给其他人一些经验。
当然,本项目也是东拼西凑,仅供交流学习,许多错误之处也请多多批评指正。
注:本文代码部分均来自网络以及自编,侵删。
概述
本文的目标是完成一个由boot区和user区共同组成的完整工程,user区即用户应用程序,boot区则是程序引导区,主要是为了更新用户程序使用。然后程序复位后能够进入boot程序检查更新,然后跳转进入user程序。
相信许多看到这篇文章的同学对BootLoader都有一定了解,这里不在赘述。
user工程建立
1.新建一个新工程,MCU笔者选择R5F100LG
2.使用代码快速生成工具生成代码
为了展示中断向量表的重映射,这里专门加入几个常用中断响应。主要配置如下:
2.1 LED灯输出P14.0
2.2 串口0收发中断
2.3 ADC中断
2.4 定时器0中断
3.点击生成工程
3.1 r_main.c的初始化中启动三个中断
3.2 ADC中断中插入处理动作
3.3 在定时器中断中加入定时功能:分别是1s LED闪烁一次,2s ADC启动一次转换。(注意函数声明和加入adc的库文件)
3.4 烧录测试,测试结果是灯正常闪烁,adc中断能正常进入。证明用户基础工程建立完毕。
user工程加入启动文件、地址偏移文件、中断向量映射文件。
R5F100LG的FLASH空间是128K (0x0000 ~ 0x1FFFF),笔者将0x0000 ~ 0x2000作为boot区。0x4000 ~ 0x1FFFF作为user区。
下图是RL78G13中断向量表(节选),我们要将中断向量表映射到0x4000开始的位置。
记住我们用到得4个中断源分别是:0x1E串口0发送中断标志、0x20串口0接收中断标志、0x2C定时器0中断标志、0x34ADC中断标志。我们后续需要处理这几个中断向量。
1.加入启动文件cstart.asm及相关的def.inc、macro.inc
文件可以在C:\Program Files (x86)\Renesas Electronics\CS+\CACX\CA78K0R\V1.72\Src\cc78k0r\src目录下找到
其中cstart.asm文件中这一段要屏蔽掉,让该地址跟随我们重新定义的U_ROM地址分配。
- 在工程Startup中加入cstart.asm文件,并在Debug tool设置中设置为cstart启动,生成堆栈解决方案符号设置为Yes。
到这里如果再次进行调试,可以看到程序是从cstart.asm启动的,并在第294行跳转到main()函数
3. 新建并加入分区文件boot.dr,输入以下内容用于分区
MEMORY ROM : ( 000000H, 02000H )
MEMORY U_ROM : ( 004000H, 01C000H )merge @@CNST :=U_ROM
merge @@CNSTL :=U_ROM
merge @@R_INIT :=U_ROM
merge @@R_INIS :=U_ROM
merge @@RLINIT :=U_ROM
merge @@CODE :=U_ROM
merge @@LCODE :=U_ROM
merge @@BASE :=U_ROM
merge @@CODEL :=U_ROM
新建int_vect.asm,用于中断跳转声明,输入下列内容:
NAME INT_VECTEXTRN _@cstartEXTRN AVT_RSTEXTRN AVT_E00EXTRN AVT_E01EXTRN AVT_E02EXTRN AVT_E03EXTRN AVT_E04EXTRN AVT_E05EXTRN AVT_E06EXTRN AVT_E07EXTRN AVT_E08EXTRN AVT_E09EXTRN AVT_E10EXTRN AVT_E11EXTRN AVT_E12EXTRN AVT_E13EXTRN AVT_E14EXTRN AVT_E15EXTRN AVT_E16EXTRN AVT_E17EXTRN AVT_E18EXTRN AVT_E19EXTRN AVT_E20EXTRN AVT_E21EXTRN AVT_E22EXTRN AVT_E23EXTRN AVT_E24EXTRN AVT_E25EXTRN AVT_E26EXTRN AVT_E27EXTRN AVT_E28EXTRN AVT_E29EXTRN AVT_E30EXTRN AVT_E31EXTRN AVT_E32EXTRN AVT_E33EXTRN AVT_E34EXTRN AVT_E35EXTRN AVT_E36EXTRN AVT_E37EXTRN AVT_E38EXTRN AVT_E39EXTRN AVT_E40EXTRN AVT_E41EXTRN AVT_E42EXTRN AVT_E43EXTRN AVT_E44EXTRN AVT_E45EXTRN AVT_E46EXTRN AVT_E47EXTRN AVT_E48EXTRN AVT_E49EXTRN AVT_E50EXTRN AVT_E51EXTRN AVT_E52EXTRN AVT_E53EXTRN AVT_BRK@@VECT_RST CSEG AT 0000HDW AVT_RST
@@VECT00 CSEG AT 0004HDW AVT_E00 ; 0x04
@@VECT01 CSEG AT 0006HDW AVT_E01 ; 0x06
@@VECT02 CSEG AT 0008HDW AVT_E02 ; 0x08
@@VECT03 CSEG AT 000AHDW AVT_E03 ; 0x0A
@@VECT04 CSEG AT 000CHDW AVT_E04 ; 0x0C
@@VECT05 CSEG AT 000EHDW AVT_E05 ; 0x0E
@@VECT06 CSEG AT 0010HDW AVT_E06 ; 0x10
@@VECT07 CSEG AT 0012HDW AVT_E07 ; 0x12
@@VECT08 CSEG AT 0014HDW AVT_E08 ; 0x14
@@VECT09 CSEG AT 0016HDW AVT_E09 ; 0x16
@@VECT10 CSEG AT 0018HDW AVT_E10 ; 0x18
@@VECT11 CSEG AT 001AHDW AVT_E11 ; 0x1A
@@VECT12 CSEG AT 001CHDW AVT_E12 ; 0x1C
@@VECT13 CSEG AT 001EHDW AVT_E13 ; 0x1E
@@VECT14 CSEG AT 0020HDW AVT_E14 ; 0x20
@@VECT15 CSEG AT 0022HDW AVT_E15 ; 0x22
@@VECT16 CSEG AT 0024HDW AVT_E16 ; 0x24
@@VECT17 CSEG AT 0026HDW AVT_E17 ; 0x26
@@VECT18 CSEG AT 0028HDW AVT_E18 ; 0x28
@@VECT19 CSEG AT 002AHDW AVT_E19 ; 0x2A
@@VECT20 CSEG AT 002CHDW AVT_E20 ; 0x2C
@@VECT21 CSEG AT 002EHDW AVT_E21 ; 0x2E
@@VECT22 CSEG AT 0030HDW AVT_E22 ; 0x30
@@VECT23 CSEG AT 0032HDW AVT_E23 ; 0x32
@@VECT24 CSEG AT 0034HDW AVT_E24 ; 0x34
@@VECT25 CSEG AT 0036HDW AVT_E25 ; 0x36
@@VECT26 CSEG AT 0038HDW AVT_E26 ; 0x38
@@VECT27 CSEG AT 003AHDW AVT_E27 ; 0x3A
@@VECT28 CSEG AT 003CHDW AVT_E28 ; 0x3C
@@VECT29 CSEG AT 003EHDW AVT_E29 ; 0x3E
@@VECT30 CSEG AT 0040HDW AVT_E30 ; 0x40
@@VECT31 CSEG AT 0042HDW AVT_E31 ; 0x42
@@VECT32 CSEG AT 0044HDW AVT_E32 ; 0x44
@@VECT33 CSEG AT 0046HDW AVT_E33 ; 0x46
@@VECT34 CSEG AT 0048HDW AVT_E34 ; 0x48
@@VECT35 CSEG AT 004AHDW AVT_E35 ; 0x4A
@@VECT36 CSEG AT 004CHDW AVT_E36 ; 0x4C
@@VECT37 CSEG AT 004EHDW AVT_E37 ; 0x4E
@@VECT38 CSEG AT 0050HDW AVT_E38 ; 0x50
@@VECT39 CSEG AT 0052HDW AVT_E39 ; 0x52
@@VECT40 CSEG AT 0054HDW AVT_E40 ; 0x54
@@VECT41 CSEG AT 0056HDW AVT_E41 ; 0x56
@@VECT42 CSEG AT 0058HDW AVT_E42 ; 0x58
@@VECT43 CSEG AT 005AHDW AVT_E43 ; 0x5A
@@VECT44 CSEG AT 005CHDW AVT_E44 ; 0x5C
@@VECT45 CSEG AT 005EHDW AVT_E45 ; 0x5E
@@VECT46 CSEG AT 0060HDW AVT_E46 ; 0x60
@@VECT47 CSEG AT 0062HDW AVT_E47 ; 0x62
@@VECT48 CSEG AT 0064HDW AVT_E48 ; 0x64
@@VECT49 CSEG AT 0066HDW AVT_E49 ; 0x66
@@VECT50 CSEG AT 0068HDW AVT_E50 ; 0x68
@@VECT51 CSEG AT 006AHDW AVT_E51 ; 0x6A
@@VECT52 CSEG AT 006CHDW AVT_E52 ; 0x6C
@@VECT53 CSEG AT 006EHDW AVT_E53 ; 0x6E
@@VECT_BRK CSEG AT 007EHDW AVT_BRK ; 0x7E END
屏蔽中断函数的声明和静态声明,用于接下来得外部调用,以r_adc_user.c为例。
新建vect_table.asm用于映射中断跳转。输入以下内容,主要是中断响应函数声明和中断向量对应的中断响应函数。
NAME VECT_TABLE
; External symbols ----------------------------------------------------------EXTRN _@cstartEXTRN _r_tau0_channel0_interruptEXTRN _r_adc_interruptEXTRN _r_uart0_interrupt_sendEXTRN _r_uart0_interrupt_receiveBR_VALUE EQU 0EDh ;RL78 BR opcode
; Public symbols ------------------------------------------------------------ PUBLIC AVT_RST PUBLIC AVT_E00PUBLIC AVT_E01PUBLIC AVT_E02PUBLIC AVT_E03PUBLIC AVT_E04PUBLIC AVT_E05PUBLIC AVT_E06PUBLIC AVT_E07PUBLIC AVT_E08PUBLIC AVT_E09PUBLIC AVT_E10PUBLIC AVT_E11PUBLIC AVT_E12PUBLIC AVT_E13PUBLIC AVT_E14PUBLIC AVT_E15PUBLIC AVT_E16PUBLIC AVT_E17PUBLIC AVT_E18PUBLIC AVT_E19PUBLIC AVT_E20PUBLIC AVT_E21PUBLIC AVT_E22PUBLIC AVT_E23PUBLIC AVT_E24PUBLIC AVT_E25PUBLIC AVT_E26PUBLIC AVT_E27PUBLIC AVT_E28PUBLIC AVT_E29PUBLIC AVT_E30PUBLIC AVT_E31PUBLIC AVT_E32PUBLIC AVT_E33PUBLIC AVT_E34PUBLIC AVT_E35PUBLIC AVT_E36PUBLIC AVT_E37PUBLIC AVT_E38PUBLIC AVT_E39PUBLIC AVT_E40PUBLIC AVT_E41PUBLIC AVT_E42PUBLIC AVT_E43PUBLIC AVT_E44PUBLIC AVT_E45PUBLIC AVT_E46PUBLIC AVT_E47PUBLIC AVT_E48PUBLIC AVT_E49PUBLIC AVT_E50PUBLIC AVT_E51PUBLIC AVT_E52PUBLIC AVT_E53PUBLIC AVT_BRK; Application Vector Table --------------------------------------------------SEC_APP CSEG AT 4000H
AVT_RST:DB BR_VALUE ; BRDW _@cstart ; Reset vector
AVT_E00:DB BR_VALUE ; BR 0x04DW _@cstart ; Interrupt Service Routine
AVT_E01: DB BR_VALUE ; BR 0x06DW _@cstart ; Interrupt Service Routine
AVT_E02:DB BR_VALUE ; BR 0x08DW _@cstart ; Interrupt Service Routine
AVT_E03:DB BR_VALUE ; BR 0x0ADW _@cstart ; Interrupt Service Routine
AVT_E04:DB BR_VALUE ; BR 0x0CDW _@cstart ; Interrupt Service Routine
AVT_E05:DB BR_VALUE ; BR 0x0EDW _@cstart ; Interrupt Service Routine
AVT_E06:DB BR_VALUE ; BR 0x10DW _@cstart ; Interrupt Service Routine
AVT_E07:DB BR_VALUE ; BR 0x12DW _@cstart ; Interrupt Service Routine
AVT_E08: DB BR_VALUE ; BR 0x14DW _@cstart ; Interrupt Service Routine
AVT_E09: DB BR_VALUE ; BR 0x16DW _@cstart;DW _@cstart ; Interrupt Service Routine
AVT_E10: DB BR_VALUE ; BR 0x18DW _@cstart ; Interrupt Service Routine
AVT_E11: DB BR_VALUE ; BR 0x1ADW _@cstart ; Interrupt Service Routine
AVT_E12: DB BR_VALUE ; BR 0x1CDW _@cstart ; Interrupt Service Routine
AVT_E13: DB BR_VALUE ; BR 0x1EDW _r_uart0_interrupt_send ; Interrupt Service Routine
AVT_E14: DB BR_VALUE ; BR 0x20DW _r_uart0_interrupt_receive ; Interrupt Service Routine
AVT_E15: DB BR_VALUE ; BR 0x22DW _@cstart ; Interrupt Service Routine
AVT_E16: DB BR_VALUE ; BR 0x24DW _@cstart ; Interrupt Service Routine
AVT_E17: DB BR_VALUE ; BR 0x26DW _@cstart ; Interrupt Service Routine
AVT_E18: DB BR_VALUE ; BR 0x28DW _@cstart ; Interrupt Service Routine
AVT_E19: DB BR_VALUE ; BR 0x2ADW _@cstart ; Interrupt Service Routine
AVT_E20: DB BR_VALUE ; BR 0x2CDW _r_tau0_channel0_interrupt;DW _@cstart ; Interrupt Service Routine
AVT_E21: DB BR_VALUE ; BR 0x2EDW _@cstart;DW _@cstart ; Interrupt Service Routine
AVT_E22: DB BR_VALUE ; BR 0x30DW _@cstart ; Interrupt Service Routine
AVT_E23: DB BR_VALUE ; BR 0x32DW _@cstart ; Interrupt Service Routine
AVT_E24: DB BR_VALUE ; BR 0x34DW _r_adc_interrupt ; Interrupt Service Routine
AVT_E25: DB BR_VALUE ; BR 0x36DW _@cstart ; Interrupt Service Routine
AVT_E26: DB BR_VALUE ; BR 0x38DW _@cstart ; Interrupt Service Routine
AVT_E27: DB BR_VALUE ; BR 0x3ADW _@cstart ; Interrupt Service Routine
AVT_E28:DB BR_VALUE ; BR 0x3CDW _@cstart ; Interrupt Service Routine
AVT_E29:DB BR_VALUE ; BR 0x3EDW _@cstart ; Interrupt Service Routine
AVT_E30: DB BR_VALUE ; BR 0x40DW _@cstart ; Interrupt Service Routine
AVT_E31: DB BR_VALUE ; BR 0x42DW _@cstart ; Interrupt Service Routine
AVT_E32: DB BR_VALUE ; BR 0x44DW _@cstart ; Interrupt Service Routine
AVT_E33: DB BR_VALUE ; BR 0x46DW _@cstart ; Interrupt Service Routine
AVT_E34: DB BR_VALUE ; BR 0x48DW _@cstart ; Interrupt Service Routine
AVT_E35: DB BR_VALUE ; BR 0x4ADW _@cstart ; Interrupt Service Routine
AVT_E36: DB BR_VALUE ; BR 0x4CDW _@cstart ; Interrupt Service Routine
AVT_E37: DB BR_VALUE ; BR 0x4EDW _@cstart ; Interrupt Service Routine
AVT_E38:DB BR_VALUE ; BR 0x50DW _@cstart ; Interrupt Service Routine
AVT_E39:DB BR_VALUE ; BR 0x52DW _@cstart ; Interrupt Service Routine
AVT_E40: DB BR_VALUE ; BR 0x54DW _@cstart ; Interrupt Service Routine
AVT_E41: DB BR_VALUE ; BR 0x56DW _@cstart ; Interrupt Service Routine
AVT_E42: DB BR_VALUE ; BR 0x58DW _@cstart ; Interrupt Service Routine
AVT_E43: DB BR_VALUE ; BR 0x5ADW _@cstart ; Interrupt Service Routine
AVT_E44: DB BR_VALUE ; BR 0x5CDW _@cstart ; Interrupt Service Routine
AVT_E45: DB BR_VALUE ; BR 0x5EDW _@cstart ; Interrupt Service Routine
AVT_E46: DB BR_VALUE ; BR 0x60DW _@cstart ; Interrupt Service Routine
AVT_E47: DB BR_VALUE ; BR 0x62DW _@cstart ; Interrupt Service Routine
AVT_E48:DB BR_VALUE ; BR 0x64DW _@cstart ; Interrupt Service Routine
AVT_E49:DB BR_VALUE ; BR 0x66DW _@cstart ; Interrupt Service Routine
AVT_E50: DB BR_VALUE ; BR 0x68DW _@cstart ; Interrupt Service Routine
AVT_E51: DB BR_VALUE ; BR 0x6ADW _@cstart ; Interrupt Service Routine
AVT_E52: DB BR_VALUE ; BR 0x6CDW _@cstart ; Interrupt Service Routine
AVT_E53: DB BR_VALUE ; BR 0x6EDW _@cstart ; Interrupt Service Routine
AVT_BRK: DB BR_VALUE ; BRDW _@cstart ; Interrupt Service Routine END
测试与分析
完整得工程目录如图所示:
下载并开始调试:
1.开始调试之后复位会默认进入0H的位置:
2.然后会跳转AVT_RST的声明处,也就是我们重映射的4000H地址:
3.按F11进行下一步,可以看到成功跳转到_@cstart标签,也就是启动文件。
4. 294行打下断点,可以看到启动文件即将进入main()函数:
5.在重映射的中断跳转函数中打下断点,按F5进行调试,等待100ms后可以看到程序进入了我们设的重映射中断中:
6. 同理可在adc中断打下断点进行测试。
总结
本章完成了user工程的Flash区分配,中断向量表的重映射,并且重新建工程开始一步一步展示如何操作。
下一章将准备介绍boot工程的建立。期(duan)待(geng) ε≡٩(๑>₃<)۶
参考
1.《【总结】cstart.asm,78K0R系列启动文件详解》
https://blog.csdn.net/iluzhiyong/article/details/51902297
2.《自定义瑞萨单片机RL78 启动文件的六个步骤》
http://diagram.eepw.com.cn/diagram/circuit/cid/138/cirid/125679
3.《Rl78 bootloader vector table application notes》
瑞萨RL78簇bootloader深入探讨(一):User工程建立相关推荐
- 瑞萨RL78 dataflash pfdl库使用教程
瑞萨RL78 dataflash pfdl库使用 1.安装PFDL库 2.CS+ for CC配置 4.读dataflash 5.写dataflash 6.注意事项 1.安装PFDL库 从瑞萨官方下载 ...
- 六轴加速度传感器MPU6050官方DMP库到瑞萨RL78/G13的移植
2015年的电赛已经结束了.赛前接到器件清单的时候,看到带防护圈的多旋翼飞行器赫然在列,又给了一个瑞萨RL78/G13的MCU,于是自然联想到13年的电赛,觉得多半是拿RL78/G13做四旋翼的主控, ...
- 关于瑞萨RL78/G13在2018年TI杯的使用
经过4天3夜的奋斗,TI杯终于结束.俗话说的好,做任何一件事都可以得到好多东西.这次TI杯,我选用了瑞萨RL78/G13,并选做了D题,手势识别.由于我技术不够,导致算法的优化以及识别的容错率比较低, ...
- 瑞萨RA系列 bootloader使用MCUBoot模块更新升级应用的实例
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 本文描述瑞萨RA系列 bootloader 使用MCUBoot模块以覆盖方式更新升级应用的实例. 一.设计Bootlo ...
- 基于瑞萨RH850的BootLoader调试问题记录
最近要基于瑞萨的RH850开发BootLoader,调试过程遇到了一些问题,在这里记录一下. 1 Flash擦写问题 1.1 Flash介绍 Flash分为DFlash和CFlash DFlash一般 ...
- 瑞萨RL78系列单片机报内存溢出故障的解决过程。RA78K0R error E3206: Segment ‘@@CODEL‘ can‘t allocate to memory - ignored
最近开始使用瑞萨的R7F0C908芯片,ROM48K,对于目前的项目肯定是足够了,虽知道代码完成后,编译出现这个故障:RA78K0R error E3206: Segment '@@CODEL' ca ...
- 关于瑞萨RL78系列单片机在线升级
最近在使用瑞萨的RL78FC0907芯片,用这个芯片做了一各在线升级的小程序.芯片基本资料请参考G13,链接如下:https://www2.renesas.cn/cn/zh/doc/products/ ...
- 瑞萨RL78系列单片机划分ROM、RAM区域进行合作开发
一.引言 最近在开发中需要了一些问题,在此记录一下以便日后查看,如果有其他开发者与需要了类似的问题,也可以借鉴一下 二.背景 我们公司有个项目使用的是其他公司开发的PCB板,我们负责流程部分的开发,称 ...
- 瑞萨RL78\G13编译出现Segment ‘@@CODEL‘ can‘t allocate to memory
点击Help->about查看licence,发现是CS+没有激活,呵呵. (小知识:CS+没有激活的状态下只能编译32K\64K的代码量,随芯片型号改变-) 点击开始菜单,选择下图这个东西,输 ...
最新文章
- CentOS6.2安装LAMP+DRUPAL网站(2)
- 在Makefile中的 .PHONY 是做什么的?
- 极路由安全设计架构分析
- MFC 窗体样式修改
- 在centos6.5中安装reids
- Node Introduce
- 管理感悟:说说NWT裁员的经历及关键错误
- HTML网页设计结课作业——19张精美网页!
- 神策分析 1.13 版本用户分群全新升级,为企业打磨精细化运营基石
- 新手教程,网站建设第一步:织梦之家Dede程序的下载和安装
- RunCat for windows安装教程
- eclipse安装教程_eclipse安装教程jdk
- 做职场里的“超级英雄”,需要怎样的盔甲与工具?
- Visual C++ 2008入门经典 Ivor Horton(书_在线阅读)
- 电脑播放视频报错----------无法播放。请确保你的计算机的声卡和视频卡可以使用,并安装了最新的驱动程序----------解决!
- 转载:farey(法莱)数列
- 智能优化算法之蚁群算法(ACO)
- 淘宝app无法抓包问题
- 网站中的个性及风格设计
- Hyperionics.HyperSnap.v7.19.00.Incl.Keygen-Lz0