<strong><font color="#4e5e9e">引言</font> </strong>
本文详细介绍了RL78 MCU从复位到进入main函数的过程,有助于读者对RL78 MCU体系结构的理解,RAM和ROM的初始化,以及bootloader程序的开发。
<strong><font color="#4e5e9e">1. RL78复位源</font> </strong>
RL78 MCU有以下7种复位源:
外部复位:
<ul>
<li>
<p>RESET复位引脚</p>
</li>
</ul>
内部复位:
<ul>
<li>
<p>上电复位(POR)</p>
</li>
<li>
<p>看门狗复位</p>
</li>
<li>
<p>低电压复位</p>
</li>
<li>
<p>非法指令复位</p>
</li>
<li>
<p>RAM奇偶校验错误复位</p>
</li>
<li>
<p>存取非法寄存器复位</p>
</li>
</ul>
复位功能框图如下:
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266173-1.png&…; alt=“RL78启动过程详解" /></center>
<strong><font color="#4e5e9e">2. MCU运行模式</font> </strong>
RL78 MCU有正常运行和闪存编程两种运行模式,在复位信号解除时,通过采样TOOL0引脚上的电平,进入对应的运行模式。
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266174-2.png&…; alt=“RL78启动过程详解" /></center>
<strong><font color="#4e5e9e">3. 启动代码分析</font> </strong>
RL78 MCU启动代码主要在cstart.asm文件中,流程如下:
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266175-3.png&…; alt=“RL78启动过程详解" /></center>
<strong>3.1 启动代码入口</strong>
代码如下:
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266176-4.png&…; alt=“RL78启动过程详解" /></center>
MCU复位后,PC指针指向地址0,定义复位向量在地址0。
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266177-5.png&…; alt=“RL78启动过程详解" /></center>
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266178-6.png&…; alt=“RL78启动过程详解" /></center>
<strong>3.2 寄存器组选择</strong>
代码如下:
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266179-7.png&…; alt=“RL78启动过程详解" /></center>
RL78-S2有4组通用寄存器,通过SEL RBn指令选择使用的寄存器组。
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266180-8.png&…; alt=“RL78启动过程详解" /></center>
RL78通用寄存器组结构:
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266181-9.png&…; alt=“RL78启动过程详解" /></center>
<strong>3.3 镜像区设置</strong>
代码如下:
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266182-10.png…; alt=“RL78启动过程详解" /></center>
3.3.1镜像区
RL78支持存取1MB的地址空间,能通过16位地址进行存取的数据区是F0000H~FFFFFH的64K字节空间,但是如果附加“ES:”,就能扩展到00000H~FFFFFH的1M字节空间。
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266183-11.png…; alt=“RL78启动过程详解" /></center>
代码闪存从地址0开始存储,一般需要使用20位地址访问该区域。为了加快对代码闪存的访问,可以将代码闪存的部分区域镜像到F0000H~FFFFFH中未使用的区域。
镜像示例如下:
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266184-12.png…; alt=“RL78启动过程详解" /></center>
3.3.2镜像区选择
复位后,MAA位默认为0,镜像00000H~0FFFF区域到F0000H~FFFFFH区域,对于闪存大于96KB的产品,可以通过设置MAA位,选择需要镜像的区域,详细请参考PMC控制寄存器。
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266185-13.png…; alt=“RL78启动过程详解" /></center>
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266186-14.png…; alt=“RL78启动过程详解" /></center>
<strong>3.4 栈初始化</strong>
代码如下:
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266187-15.png…; alt=“RL78启动过程详解" /></center>
3.4.1 设置SP
将栈顶地址 __STACK_ADDR_START设置到SP寄存器。
其中__STACK_ADDR_START是由链接器产生。
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266188-16.png…; alt=“RL78启动过程详解" /></center>
3.4.2 初始化栈
将栈底地址参数赋值给AX寄存器,然后调用栈初始化函数stkinit,将栈区域清0。
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266189-17.png…; alt=“RL78启动过程详解" /></center>
stkinit函数在stkinit.asm文件中,代码如下:
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266191-18.png…; alt=“RL78启动过程详解" /></center>
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266192-19.png…; alt=“RL78启动过程详解" /></center>
大致流程为:先按照32字节进行清0,剩余部分,按字节进行清0。
<strong>3.5 外设初始化</strong>
代码如下:
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266193-20.png…; alt=“RL78启动过程详解" /></center>
其中R_Systeminit函数是由代码生成器,通过图形界面配置生成。
注意:尽量不要修改该部分代码。
如需修改,禁止执行读取RAM的操作。(访问未初始化的RAM,可能触发RAM奇偶校验错误,产生奇偶校验复位。)
错误代码示例:
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266194-21.png…; alt=“RL78启动过程详解" /></center>
错误原因:g_dbgMode全局变量将在data段的初始化过程中赋值1,但此时data段还未初始化,dbgMode指向的RAM地址未写入奇偶校验位,if(g_dbgMode==0)语句,将执行读操作,可能触发RAM奇偶校验错误,产生奇偶校验复位。
<strong>3.6 初始化BSS,DATA段</strong>
BSS初始化代码如下:
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266195-22.png…; alt=“RL78启动过程详解" /></center>
DATA段初始化代码如下:
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266196-23.png…; alt=“RL78启动过程详解" /></center>
其中HIGH/LOW/STARTOF/SIZEOF等表达式,请参考编译器手册文档”CC-RL user’s manual”。
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266197-24.png…; alt=“RL78启动过程详解" /></center>
<strong>3.7 进入main函数</strong>
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266198-25.png…; alt=“RL78启动过程详解" /></center>
<strong>3.8 堆</strong>
CC-RL V1.02以上版本支持堆的操作
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266200-26.png…; alt=“RL78启动过程详解" /></center>
如需使用堆的相关操作,需要先初始化_REL_sysheap和_REL_sizeof_sysheap,详细内如请参考以下示例:
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563100-266201-27.png…; alt=“RL78启动过程详解" /></center>
来源:<a href="https://mp.weixin.qq.com/s/YWIVHV0VcQpLn32ZmOtsjA">瑞萨MCU小百科</a>
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。