电子说
引言
本文详细介绍了RL78 MCU从复位到进入main函数的过程,有助于读者对RL78 MCU体系结构的理解,RAM和ROM的初始化,以及bootloader程序的开发。
1. RL78复位源
RL78 MCU有以下7种复位源:
外部复位:
RESET复位引脚
内部复位:
上电复位(POR)
看门狗复位
低电压复位
非法指令复位
RAM奇偶校验错误复位
存取非法寄存器复位
复位功能框图如下:
2. MCU运行模式
RL78 MCU有正常运行和闪存编程两种运行模式,在复位信号解除时,通过采样TOOL0引脚上的电平,进入对应的运行模式。
3. 启动代码分析
RL78 MCU启动代码主要在cstart.asm文件中,流程如下:
3.1 启动代码入口
代码如下:
MCU复位后,PC指针指向地址0,定义复位向量在地址0。
3.2 寄存器组选择
代码如下:
RL78-S2有4组通用寄存器,通过SEL RBn指令选择使用的寄存器组。
RL78通用寄存器组结构:
3.3 镜像区设置
代码如下:
3.3.1镜像区
RL78支持存取1MB的地址空间,能通过16位地址进行存取的数据区是F0000H~FFFFFH的64K字节空间,但是如果附加“ES:”,就能扩展到00000H~FFFFFH的1M字节空间。
代码闪存从地址0开始存储,一般需要使用20位地址访问该区域。为了加快对代码闪存的访问,可以将代码闪存的部分区域镜像到F0000H~FFFFFH中未使用的区域。
镜像示例如下:
3.3.2镜像区选择
复位后,MAA位默认为0,镜像00000H~0FFFF区域到F0000H~FFFFFH区域,对于闪存大于96KB的产品,可以通过设置MAA位,选择需要镜像的区域,详细请参考PMC控制寄存器。
3.4 栈初始化
代码如下:
3.4.1 设置SP
将栈顶地址 __STACK_ADDR_START设置到SP寄存器。
其中__STACK_ADDR_START是由链接器产生。
3.4.2 初始化栈
将栈底地址参数赋值给AX寄存器,然后调用栈初始化函数stkinit,将栈区域清0。
stkinit函数在stkinit.asm文件中,代码如下:
大致流程为:先按照32字节进行清0,剩余部分,按字节进行清0。
3.5 外设初始化
代码如下:
其中R_Systeminit函数是由代码生成器,通过图形界面配置生成。
注意:尽量不要修改该部分代码。
如需修改,禁止执行读取RAM的操作。(访问未初始化的RAM,可能触发RAM奇偶校验错误,产生奇偶校验复位。)
错误代码示例:
错误原因:g_dbgMode全局变量将在data段的初始化过程中赋值1,但此时data段还未初始化,dbgMode指向的RAM地址未写入奇偶校验位,if(g_dbgMode==0)语句,将执行读操作,可能触发RAM奇偶校验错误,产生奇偶校验复位。
3.6 初始化BSS,DATA段
BSS初始化代码如下:
DATA段初始化代码如下:
其中HIGH/LOW/STARTOF/SIZEOF等表达式,请参考编译器手册文档”CC-RL user’s manual”。
3.7 进入main函数
3.8 堆
CC-RL V1.02以上版本支持堆的操作
如需使用堆的相关操作,需要先初始化_REL_sysheap和_REL_sizeof_sysheap,详细内如请参考以下示例:
来源:瑞萨MCU小百科
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !