在很多应用当中,单片机控制设计时,由于一些特定的标志信息需要维持,以备查询前一次的状态,需要有一部分RAM数据在复位的时候不需要被重新初始化清零,所以在程序设计时,要预留出一段RAM进行这类数据的存放,在程序处理时候,对这段数据不做处理,使其初始值为随机值,复位后保持上一次的状态。
我们知道, RAM为随机存储器,掉电数据不保存,复位数据为随机值。MCU一般在启动时,系统正常工作之前,会对RAM区进行初始化,对没有赋初值的RAM区域进行清零。
那么,针对我们现在应用很广泛的瑞萨电子RL78系列的MCU,如何实现指定RAM区域不清零,保持复位数据不被初始化呢?
要实现这个要求,需要修改系统的启动文件,但首先需要搞清楚RL78的RAM分布,如下图:
图一:RL78 memory分布图,以RL78/G13 4K RAM产品为例
如果需要不进行初始化的RAM区段比较小,可以将RAM的saddr区域进行不初始化操作,操作流程为:
1、将CS+安装路径下的cstart.asm及其包含的两个头文件def.inc和macro.inc拷贝至用户工程路径下,并将cstart.asm添加到CS+工程的startup文件夹下,这样做的目的是,使用工程目录下的启动文件(此启动文件可认为修改而不影响其他项目应用系统启动文件),如下图:
图二:添加启动文件示意图
2、将启动文件中的clear saddr和copy sreg variables which doesn't have initial value以下的语句注释屏蔽,这样做的目的是将启动文件中对RAM的saddr区域初始化关掉,使此区域的RAM在初始上电时为随机值,在正常运行后此区域的RAM不会被清零;如下图:
图三:修改启动文件示意图
3、做了以上两个步骤的操作后,实现了saddr区域的RAM不清零;此时在程序中定义变量时,在变量前加上关键字sreg,即可将这些变量放置在saddr区而不被初始化,如下图:
图四,变量定义示意图
4、最后,还需一步,因为RL78内置的安全功能,默认RAM奇偶校验使能,因为一部分RAM未被初始化,RAM奇偶校验未通过引起的内部复位,导致程序无法正常运行。而在仿真情况下,内部复位是被仿真器忽略的,所以在仿真情况下问题未显现,在脱机情况下问题暴露。所以,在程序初始化最开始,关闭RAM奇偶校验控制寄存器,对应的操作为:RPECTL = 0x80。
完成以上四步,即可实现RAM不清零,并在系统复位后保持上一次的状态。
世强元件电商版权所有,转载请注明来源及链接。