| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 如何在软件复位后保留指定RAM区域的数据 -> 正文阅读 |
|
[嵌入式]如何在软件复位后保留指定RAM区域的数据 |
文章目录在bootloader时,通常需要单独开辟一块区域用来存放一些变量,并且希望这些变量在发生软件复位(boot和app互相跳转)时不被初始化,这些变量一般用来存放跳转boot的原因(正常上电启动或者从app跳转boot)等信息。对于这种变量的存放方式有两种,一种是使用MCU自带的(模拟/真实)EEPROM,一种是针对变量所在的区域做一些修改,使得这些RAM区域在软件复位时不进行初始化,S32K1中这种功能称为RAM retention。前一种方式之前介绍过,如下链接: 《巧用S32K的模拟EEPROM功能标定参数》 ,本文以S32K144为例,介绍第二种方式。 配置介绍下面从启动文件,链接文件以及主程序中的设置三方面介绍实现RAM retention的方法。 启动文件
首先,需要关闭SRAM的ECC初始化操作,因为该操作会修改SRAM数据。同时,关闭SRAM的ECC初始化的操作需要在软件复位后执行,如下红框是修改部分: 0x40048004是寄存器CHIPCTL的地址,在进入软件复位之前会操作该寄存器,后面主程序部分会有描述,和此处对该寄存器的值进行判断能够对应上。 链接文件
接着在链接文件中设置两个自定义的地址,用来保存需要实现RAM Retention的变量。
主程序接着在主程序中使用关键字
最后在调用软件复位函数之前将CHIPCTL的SRAML_RETEN和SRAML_RETEN两位置0,如下所示:
结合参考手册CHIPCTL寄存器和SRAM retention章节的描述,将这两位置为0后,可以让RAM的数据在复位过程中不在篡改,同时在复位之后需要改写为1。 至此,主要的修改注意点已经描述完毕。 例程测试环境搭建
功能描述为了测试RAM retention功能,我定义了两组变量,一组变量使用 然后在主函数中判断一下变量的值是否为期望值,如果不是,就亮一段时间的红灯,同时对变量赋值,然后进行软件复位,然后再次判断变量的值是否为期望值,如果是,就一直亮绿灯。主要代码如下: 测试现象在下图红框处打上断点,当完成软件复位之后再次执行到该语句时,查看变量,发现处于自定义RAM区域的变量保留了之前的值,而处于bss段的变量被初始化为0了。 退出调试模式,重新上电,LED先亮几秒红灯,然后亮绿灯,且一直保持。重复几次,现象一样,符合预期。 注意事项笔者在调试RAM retention功能时,总结了一些注意事项,分享给大家。 1. 另一种实现RAM retention功能的方式想要使用RAM retention功能,不一定需要修改ld文件,也可以按如下方式进行:
2. 自定义RAM区域的地址问题在ld文件设置自定义地址时,增加了 3. bool类型变量使用RAM retention功能如果将需要使用RAM retention功能的变量定义为bool类型,在掉电之前该值为true,会发现重新上电之后,该变量的值仍为true。但是,如果掉电之前该值为false,重新上单之后,该值为true。发生该现象的原因笔者并未找到,建议尽量不使用bool类型变量实现该功能。 如果非要使用bool类型,初始化值使用true,主程序中赋值为false,具体如下面两张图,测试结果是OK的。 4. 不使用调试模式进行测试在测试该例程时,发现重新上电进入debug模式时,自定义区域的变量已经变成了期望值(上电之后并未进行软件复位),和预期结果不符合。但是脱离调试模式,进行的测试结果又是符合预期的。建议读者测试RAM retention功能时离线测试,debug模式下会出现意料之外的情况。 参考资料
例程分享本文所使用的例程分享如下: |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 10:21:25- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |