matlab某个区域清零,【经验】如何实现指定RAM区域不清零,保持复位数据不被初始化?...

6d8e20f5a50abc677ed6281ebd4752b7.png

在很多应用当中,单片机控制设计时,由于一些特定的标志信息需要维持,以备查询前一次的状态,需要有一部分RAM数据在复位的时候不需要被重新初始化清零,所以在程序设计时,要预留出一段RAM进行这类数据的存放,在程序处理时候,对这段数据不做处理,使其初始值为随机值,复位后保持上一次的状态。

我们知道, RAM为随机存储器,掉电数据不保存,复位数据为随机值。MCU一般在启动时,系统正常工作之前,会对RAM区进行初始化,对没有赋初值的RAM区域进行清零。

那么,针对我们现在应用很广泛的瑞萨电子RL78系列的MCU,如何实现指定RAM区域不清零,保持复位数据不被初始化呢?

要实现这个要求,需要修改系统的启动文件,但首先需要搞清楚RL78的RAM分布,如下图:

818a1c9e4162b0357a2b94b376b6770a.png

图一:RL78 memory分布图,以RL78/G13 4K RAM产品为例

如果需要不进行初始化的RAM区段比较小,可以将RAM的saddr区域进行不初始化操作,操作流程为:

1、将CS+安装路径下的cstart.asm及其包含的两个头文件def.inc和macro.inc拷贝至用户工程路径下,并将cstart.asm添加到CS+工程的startup文件夹下,这样做的目的是,使用工程目录下的启动文件(此启动文件可认为修改而不影响其他项目应用系统启动文件),如下图:

d942db2fd4960380b5c2107c681815dd.png

图二:添加启动文件示意图

2、将启动文件中的clear saddr和copy sreg variables which doesn't have initial value以下的语句注释屏蔽,这样做的目的是将启动文件中对RAM的saddr区域初始化关掉,使此区域的RAM在初始上电时为随机值,在正常运行后此区域的RAM不会被清零;如下图:

c7ec254ef0a7319b167baf8145c465d1.png

图三:修改启动文件示意图

3、做了以上两个步骤的操作后,实现了saddr区域的RAM不清零;此时在程序中定义变量时,在变量前加上关键字sreg,即可将这些变量放置在saddr区而不被初始化,如下图:

d1a45d7be6adac075ebab7d36a8026c7.png

图四,变量定义示意图

4、最后,还需一步,因为RL78内置的安全功能,默认RAM奇偶校验使能,因为一部分RAM未被初始化,RAM奇偶校验未通过引起的内部复位,导致程序无法正常运行。而在仿真情况下,内部复位是被仿真器忽略的,所以在仿真情况下问题未显现,在脱机情况下问题暴露。所以,在程序初始化最开始,关闭RAM奇偶校验控制寄存器,对应的操作为:RPECTL = 0x80。

完成以上四步,即可实现RAM不清零,并在系统复位后保持上一次的状态。

世强元件电商版权所有,转载请注明来源及链接。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值