关于瑞萨RL78系列单片机在线升级
最近在使用瑞萨的RL78FC0907芯片,用这个芯片做了一各在线升级的小程序.芯片基本资料请参考G13,链接如下:https://www2.renesas.cn/cn/zh/doc/products/region/rtcn/mpumcu/r01uh0146cj0320_rl78g13.pdf?key=1ee8684a42ed9660902b74808580e43a 中文资料。基本上涵盖了907的所有内容。
首先先来看下芯片的内存分布:
可以看到,该芯片共有32K的rom,2K的RAM。在ROM中0000-7FFF,一些固定地址的内容无法用作APP或者BOOT程序区,比如向量表区、CALLT区、选项字节等等,当你使用Boot cluster功能的时候,同样的,你在1000地址开始的标注的表区也无法使用,请注意.该芯片有4K的内部数据闪存,可以使用官方的FDL库操作。2K的RAM中包含32字节的通用寄存器,请注意这32各字节请不要使用.镜像区是ROM区镜像过去的,除了其他的表区之外剩余的24K,因为其他被特殊功能寄存器,内存等映射了地址.对于这个镜像区,有一点要注意,程序中声明的只读数据,const,一定要布置在镜像区,否则编译器会报错,也就是说,比如你顶一个只读数组 u8 const DataTable[10]={1,2,3,4,5,6,7,8,9,0}; 那么这个数组你如果把它放在镜像区,他就不会报错,你把它放在非镜像区,比如你把它放在0X1000的地址处,它就会编译报错。遇到这个问题,可以这么解决,将段定义中的.const删除,然后把u8 const DataTable 改为 u8 __far const DataTable,使得存放在.constf段中.还有一种就是将.const数据段整个放置到镜像区中,0x2000地址开始.
然后程序主要分APP区和BOOT区。boot区的程序分配如下.APP区定义从0x2000开始.
数据段分段如图,CODE_IN_ROM_n 这个数据段是存放boot区中断函数的,.text段是存放__near 声明的函数,比如说启动例程,rlib,slib是使用库代码部分分别是运行库代码和标准库代码..textf是__far 声明的函数部分,大部分函数都在这个段。.constf是__far声明的只读数据. .data是初始化的变量存放在ROM的数据,.sdata是初始化的数据,短直接寻址,具有SADDR属性的数据,存放在ROM中. 其他的pfdl fsl什么的都是需要用到的操作库,FDL是用于操作数4K据存储区的,fsl是用于在线自编程的.下面的0XFF700开始的是内存区,CODE_IN_RAM就是上面的CODE_IN_ROM_n的函数复制到内存中,可以在RAM中执行,主要是boot区使用中断用到的..dataR 是初始化的变量,.bss是未初始化的变量,.sdataR和.sbss 都是具有saddr属性的内存段。
BOOT区需要把中断重映射,我这边把中断映射到了0x2000的地址开始
因为单片机中断的中断向量表是只存放跳转的地址的,所以,每个中断向量都只有两个字节,改变之后,每个需要预留4各字节,要注意.相应的APP区需要设置如图所示,从0x2000的地址开始,设置相应的跳转函数,我这边只有定时器的中断函数.设置完中断跳转函数,接下来就是APP区的入口函数了,APP区的入口函数地址为0x2200,请把.text这个段放在最前面,因为这个段放着启动函数。
所以,APP程序的启动函数入口地址为0x2200,BOOT区最后跳转
//示例
#define APP_Start_Addr 0x2200
void ( *pfunc)(void); //申明一个函数指针// BOOT 区的main函数void main ()
{pfunc = 0; pfunc = ( void(*)(void))(APP_Start_Addr); // 指针指向0x2200的地址/*这边存放boot区程序*/pfunc(); //boot区最后调用函数跳转APP程序启动代码
}
自编程使用瑞萨的自编程操作库FSL。具体的步骤如下图:
可以选择使用中断也可以选择不使用中断,使用FSL_ChangeInterruptTable(u16 fsl_interrupt_destination)函数会将中断映射到内存中,fsl_interrupt_destination参数是中断跳转指定的地址,两个字节,指定到内存区域0xff700,取两个字节0xf700.
此时,原来存在ROM中的中断向量无法正常跳转,所以程序中断会直接跳转到内存,所以上面需要把存放在ROM中的中断处理函数段_CODE_IN_ROM_n 先复制到内存CODE_IN_RAM中.为了不让程序出错,这个中断处理函数需要和普通的中断函数类似,下代码段
//示例#pragma interrupt r_uart0_interrupt_receive(vect=0x2) // 这边需要和正常中断声明一样#pragma section text CODE_IN_ROM //将中断函数(boot区中使用)放置到固定段中void __near r_uart0_interrupt_receive(void)
{ func1();if(STIF0){STIF0 = 0;// TXD0 = 0x56;}if(SRIF0){SRIF0 = 0;boot.step = 0;boot.DelayCnt = 0;Data_Table[boot.ReceiveCnt] = RXD0;if(SSR01L&0x07){SIR01 = 0X07; //清除故障标志boot.ReceiveCnt = 0;}if(boot.ReceiveCnt == 0)boot.CheckSum = 0;if(boot.ReceiveCnt==3)boot.CheckSum = Data_Table[boot.ReceiveCnt];else if((boot.ReceiveCnt>3)&&(boot.ReceiveCnt<131))boot.CheckSum += Data_Table[boot.ReceiveCnt];boot.ReceiveCnt++;}// __RETI();func2();
}
#pragma section
需要注意的是,boot区使用的中断入口函数只有一个,就是说所有的中断都会在这个函数里面处理,根据不同的中断标志位,处理相对应的中断程序.要注意,在进入APP区程序之前,如果使用了FSL_ChangeInterruptTable()这个功能,那么必须使用FSL_RestorInterruptTable()函数使得中断恢复正常中断向量表.
个人体会,也许有什么理解的不对的地方,欢迎留言指正.
关于瑞萨RL78系列单片机在线升级相关推荐
- 瑞萨RL78系列单片机报内存溢出故障的解决过程。RA78K0R error E3206: Segment ‘@@CODEL‘ can‘t allocate to memory - ignored
最近开始使用瑞萨的R7F0C908芯片,ROM48K,对于目前的项目肯定是足够了,虽知道代码完成后,编译出现这个故障:RA78K0R error E3206: Segment '@@CODEL' ca ...
- 瑞萨RL78系列单片机划分ROM、RAM区域进行合作开发
一.引言 最近在开发中需要了一些问题,在此记录一下以便日后查看,如果有其他开发者与需要了类似的问题,也可以借鉴一下 二.背景 我们公司有个项目使用的是其他公司开发的PCB板,我们负责流程部分的开发,称 ...
- 瑞萨R7F0Cxxx系列单片机入门教程
版权声明:本文为博主yjydyod原创文章,转载请声明 本文作者为yjydyod,转载自:https://blog.csdn.net/yjydyod 前言 这是一篇关于瑞萨R7F0Cxxx系列单片机的 ...
- 瑞萨RA系列 bootloader使用MCUBoot模块更新升级应用的实例
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 本文描述瑞萨RA系列 bootloader 使用MCUBoot模块以覆盖方式更新升级应用的实例. 一.设计Bootlo ...
- 瑞萨RL78簇bootloader深入探讨(一):User工程建立
瑞萨RL78簇bootloader深入探讨(一) 前言 bootloader是单片机开发重要的一环,近期笔者需要完成一个瑞萨相关的bootloader项目,然而ARM有关bootloader的开发资料 ...
- 【瑞萨RA4系列】使用TinyMaix识别手写数字
文章目录 一.TinyMaix简介 1.1 TinyMaix开源项目 1.2 下载TinyMaix源码 二.TinyMaix移植 2.1 创建TinyMaix移植项目 2.2 添加TinyMaix源码 ...
- 【瑞萨RA4系列】开发环境搭建和点灯指南
[瑞萨RA4系列开发板体验]开发环境搭建和新手点灯指南 文章目录 [瑞萨RA4系列开发板体验]开发环境搭建和新手点灯指南 一.简单开箱 二.芯片简介 三.开发环境搭建 2.1 安装FSP(RASC) ...
- 六轴加速度传感器MPU6050官方DMP库到瑞萨RL78/G13的移植
2015年的电赛已经结束了.赛前接到器件清单的时候,看到带防护圈的多旋翼飞行器赫然在列,又给了一个瑞萨RL78/G13的MCU,于是自然联想到13年的电赛,觉得多半是拿RL78/G13做四旋翼的主控, ...
- 【瑞萨RA4系列】硬件调试器烧录和调试指南
[瑞萨RA4系列]硬件调试器烧录和调试指南 文章目录 [瑞萨RA4系列]硬件调试器烧录和调试指南 一.背景简介 二.连接调试器 三.设置Keil项目 四.烧录和调试 4.1 Keil中烧录 4.2 K ...
最新文章
- (C++)1008 数组元素循环右移问题
- AlwaysVisibleControlExtender
- NetStream.appendBytes, 走向Flash P2P VOD的第一步
- Play Framework介绍:主要概念(转)
- MFC的Button和Static控件
- 中国联通被指乱扣费 返还金额限制用
- 揭开伟大架构师的秘密
- 3d建模电脑配置要求_2019年3d设计渲染电脑配置推荐
- 我才是嗨到最晚的男人
- 基于MapWinGis开发探索(一)
- envi 面向对象遥感图像分类
- 代码整洁之道-第5章-格式-读书笔记
- objdump和 readelf 的区别
- 如何给计算机安装驱动程序,电脑系统怎么安装驱动程序
- linux aufs,UnionFS有什么用?AUFS的一些特性
- C语言的发展及其特点
- 2021-2022-1 20212820《Linux内核原理与分析》第一周作业
- [读书]《自驱型成长》
- 直线相交的交点(Line-Line Intersection)
- WIN7睡眠蓝屏0X0000009F