最近在使用瑞萨的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系列单片机在线升级相关推荐

  1. 瑞萨RL78系列单片机报内存溢出故障的解决过程。RA78K0R error E3206: Segment ‘@@CODEL‘ can‘t allocate to memory - ignored

    最近开始使用瑞萨的R7F0C908芯片,ROM48K,对于目前的项目肯定是足够了,虽知道代码完成后,编译出现这个故障:RA78K0R error E3206: Segment '@@CODEL' ca ...

  2. 瑞萨RL78系列单片机划分ROM、RAM区域进行合作开发

    一.引言 最近在开发中需要了一些问题,在此记录一下以便日后查看,如果有其他开发者与需要了类似的问题,也可以借鉴一下 二.背景 我们公司有个项目使用的是其他公司开发的PCB板,我们负责流程部分的开发,称 ...

  3. 瑞萨R7F0Cxxx系列单片机入门教程

    版权声明:本文为博主yjydyod原创文章,转载请声明 本文作者为yjydyod,转载自:https://blog.csdn.net/yjydyod 前言 这是一篇关于瑞萨R7F0Cxxx系列单片机的 ...

  4. 瑞萨RA系列 bootloader使用MCUBoot模块更新升级应用的实例

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 本文描述瑞萨RA系列 bootloader 使用MCUBoot模块以覆盖方式更新升级应用的实例. 一.设计Bootlo ...

  5. 瑞萨RL78簇bootloader深入探讨(一):User工程建立

    瑞萨RL78簇bootloader深入探讨(一) 前言 bootloader是单片机开发重要的一环,近期笔者需要完成一个瑞萨相关的bootloader项目,然而ARM有关bootloader的开发资料 ...

  6. 【瑞萨RA4系列】使用TinyMaix识别手写数字

    文章目录 一.TinyMaix简介 1.1 TinyMaix开源项目 1.2 下载TinyMaix源码 二.TinyMaix移植 2.1 创建TinyMaix移植项目 2.2 添加TinyMaix源码 ...

  7. 【瑞萨RA4系列】开发环境搭建和点灯指南

    [瑞萨RA4系列开发板体验]开发环境搭建和新手点灯指南 文章目录 [瑞萨RA4系列开发板体验]开发环境搭建和新手点灯指南 一.简单开箱 二.芯片简介 三.开发环境搭建 2.1 安装FSP(RASC) ...

  8. 六轴加速度传感器MPU6050官方DMP库到瑞萨RL78/G13的移植

    2015年的电赛已经结束了.赛前接到器件清单的时候,看到带防护圈的多旋翼飞行器赫然在列,又给了一个瑞萨RL78/G13的MCU,于是自然联想到13年的电赛,觉得多半是拿RL78/G13做四旋翼的主控, ...

  9. 【瑞萨RA4系列】硬件调试器烧录和调试指南

    [瑞萨RA4系列]硬件调试器烧录和调试指南 文章目录 [瑞萨RA4系列]硬件调试器烧录和调试指南 一.背景简介 二.连接调试器 三.设置Keil项目 四.烧录和调试 4.1 Keil中烧录 4.2 K ...

最新文章

  1. (C++)1008 数组元素循环右移问题
  2. AlwaysVisibleControlExtender
  3. NetStream.appendBytes, 走向Flash P2P VOD的第一步
  4. Play Framework介绍:主要概念(转)
  5. MFC的Button和Static控件
  6. 中国联通被指乱扣费 返还金额限制用
  7. 揭开伟大架构师的秘密
  8. 3d建模电脑配置要求_2019年3d设计渲染电脑配置推荐
  9. 我才是嗨到最晚的男人
  10. 基于MapWinGis开发探索(一)
  11. envi 面向对象遥感图像分类
  12. 代码整洁之道-第5章-格式-读书笔记
  13. objdump和 readelf 的区别
  14. 如何给计算机安装驱动程序,电脑系统怎么安装驱动程序
  15. linux aufs,UnionFS有什么用?AUFS的一些特性
  16. C语言的发展及其特点
  17. 2021-2022-1 20212820《Linux内核原理与分析》第一周作业
  18. [读书]《自驱型成长》
  19. 直线相交的交点(Line-Line Intersection)
  20. WIN7睡眠蓝屏0X0000009F

热门文章

  1. gstreamer+qgc+aarch64
  2. 三角函数形式的傅里叶级数
  3. Python——matplotlib中的乱七八糟(一)【注释,图例,tick能见度,移动坐标轴】
  4. 基于SSM框架的图书馆借阅管理系统
  5. Zookeeper的四字命令
  6. 产品经理和软件工程师的职能划分
  7. 基于机智云平台的泵站智能巡检系统
  8. python的冒泡排序
  9. twig ajax异常,php – AJAX调用如何使用TWIG
  10. 娱乐小工具微信小程序源码下载支持多种流量主