RL78启动过程详解

电子说

1.2w人已加入

描述

引言

本文详细介绍了RL78 MCU从复位到进入main函数的过程,有助于读者对RL78 MCU体系结构的理解,RAM和ROM的初始化,以及bootloader程序的开发。

1. RL78复位源

RL78 MCU有以下7种复位源:

外部复位:

RESET复位引脚

内部复位:

上电复位(POR)

看门狗复位

低电压复位

非法指令复位

RAM奇偶校验错误复位

存取非法寄存器复位

复位功能框图如下:

mcu

2. MCU运行模式

RL78 MCU有正常运行和闪存编程两种运行模式,在复位信号解除时,通过采样TOOL0引脚上的电平,进入对应的运行模式。

mcu

3. 启动代码分析

RL78 MCU启动代码主要在cstart.asm文件中,流程如下:

mcu

3.1 启动代码入口

代码如下:

mcu

MCU复位后,PC指针指向地址0,定义复位向量在地址0。

mcu
mcu

3.2 寄存器组选择

代码如下:

mcu

RL78-S2有4组通用寄存器,通过SEL RBn指令选择使用的寄存器组。

mcu

RL78通用寄存器组结构:

mcu

3.3 镜像区设置

代码如下:

mcu

3.3.1镜像区

RL78支持存取1MB的地址空间,能通过16位地址进行存取的数据区是F0000H~FFFFFH的64K字节空间,但是如果附加“ES:”,就能扩展到00000H~FFFFFH的1M字节空间。

mcu

代码闪存从地址0开始存储,一般需要使用20位地址访问该区域。为了加快对代码闪存的访问,可以将代码闪存的部分区域镜像到F0000H~FFFFFH中未使用的区域。

镜像示例如下:

mcu

3.3.2镜像区选择

复位后,MAA位默认为0,镜像00000H~0FFFF区域到F0000H~FFFFFH区域,对于闪存大于96KB的产品,可以通过设置MAA位,选择需要镜像的区域,详细请参考PMC控制寄存器。

mcu
mcu

3.4 栈初始化

代码如下:

mcu

3.4.1 设置SP

将栈顶地址 __STACK_ADDR_START设置到SP寄存器。

其中__STACK_ADDR_START是由链接器产生。

mcu

3.4.2 初始化栈

将栈底地址参数赋值给AX寄存器,然后调用栈初始化函数stkinit,将栈区域清0。

mcu

stkinit函数在stkinit.asm文件中,代码如下:

mcu
mcu

大致流程为:先按照32字节进行清0,剩余部分,按字节进行清0。

3.5 外设初始化

代码如下:

mcu

其中R_Systeminit函数是由代码生成器,通过图形界面配置生成。

注意:尽量不要修改该部分代码。

如需修改,禁止执行读取RAM的操作。(访问未初始化的RAM,可能触发RAM奇偶校验错误,产生奇偶校验复位。)

错误代码示例:

mcu

错误原因:g_dbgMode全局变量将在data段的初始化过程中赋值1,但此时data段还未初始化,dbgMode指向的RAM地址未写入奇偶校验位,if(g_dbgMode==0)语句,将执行读操作,可能触发RAM奇偶校验错误,产生奇偶校验复位。

3.6 初始化BSS,DATA段

BSS初始化代码如下:

mcu

DATA段初始化代码如下:

mcu

其中HIGH/LOW/STARTOF/SIZEOF等表达式,请参考编译器手册文档”CC-RL user’s manual”。

mcu

3.7 进入main函数

mcu

3.8 堆

CC-RL V1.02以上版本支持堆的操作

mcu

如需使用堆的相关操作,需要先初始化_REL_sysheap和_REL_sizeof_sysheap,详细内如请参考以下示例:

mcu

来源:瑞萨MCU小百科

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分