文章目录

  • 配置介绍
    • 启动文件
    • 链接文件
    • 主程序
  • 例程测试
    • 环境搭建
    • 功能描述
    • 测试现象
  • 注意事项
    • 1. 另一种实现RAM retention功能的方式
    • 2. 自定义RAM区域的地址问题
    • 3. bool类型变量使用RAM retention功能
    • 4. 不使用调试模式进行测试
  • 参考资料
  • 例程分享

在bootloader时,通常需要单独开辟一块区域用来存放一些变量,并且希望这些变量在发生软件复位(boot和app互相跳转)时不被初始化,这些变量一般用来存放跳转boot的原因(正常上电启动或者从app跳转boot)等信息。对于这种变量的存放方式有两种,一种是使用MCU自带的(模拟/真实)EEPROM,一种是针对变量所在的区域做一些修改,使得这些RAM区域在软件复位时不进行初始化,S32K1中这种功能称为RAM retention。前一种方式之前介绍过,如下链接: 《巧用S32K的模拟EEPROM功能标定参数》 ,本文以S32K144为例,介绍第二种方式。

配置介绍

下面从启动文件,链接文件以及主程序中的设置三方面介绍实现RAM retention的方法。

启动文件

如果对S32K144的启动过程不是很清楚,建议看一下胡工的这篇文章:

《浅谈嵌入式MCU软件开发之S32K1xx系列MCU启动过程及重映射代码到RAM中运行方法详解 》

首先,需要关闭SRAM的ECC初始化操作,因为该操作会修改SRAM数据。同时,关闭SRAM的ECC初始化的操作需要在软件复位后执行,如下红框是修改部分:

0x40048004是寄存器CHIPCTL的地址,在进入软件复位之前会操作该寄存器,后面主程序部分会有描述,和此处对该寄存器的值进行判断能够对应上。

链接文件

如果对S32K144的链接文件不是很清楚,可以看一下如下这篇文章:

《S32DS for ARM 2018.R1 链接文件(linker file)学习笔记 》

接着在链接文件中设置两个自定义的地址,用来保存需要实现RAM Retention的变量。


主程序

接着在主程序中使用关键字attribute修饰需要实现RAM retention功能的变量,如下所示:

__attribute__((section (".myRAML"))) uint8_t Led_Color_Flag = 0x00;
__attribute__((section (".myRAMU"))) uint8_t Buffer[10] = {0};

最后在调用软件复位函数之前将CHIPCTL的SRAML_RETEN和SRAML_RETEN两位置0,如下所示:

/** This logic ensures that any attempted access to SRAM is blocked* after these bits are written,* thereby preventing memory corruption during reset assertion.* */
SIM->CHIPCTL &= ~SIM_CHIPCTL_SRAMU_RETEN_MASK;
SIM->CHIPCTL &= ~SIM_CHIPCTL_SRAML_RETEN_MASK;
/*SW software*/
SystemSoftwareReset();

结合参考手册CHIPCTL寄存器和SRAM retention章节的描述,将这两位置为0后,可以让RAM的数据在复位过程中不在篡改,同时在复位之后需要改写为1。

至此,主要的修改注意点已经描述完毕。

例程测试

环境搭建

  • 开发板:S32K144EVB-Q100
  • 开发环境:S32DS for ARM 2.2

功能描述

为了测试RAM retention功能,我定义了两组变量,一组变量使用attribute修饰,使之固定到自定义的区域,一组变量不做修饰,会被放到.bss段(查看map文件可知)。如下图所示:

然后在主函数中判断一下变量的值是否为期望值,如果不是,就亮一段时间的红灯,同时对变量赋值,然后进行软件复位,然后再次判断变量的值是否为期望值,如果是,就一直亮绿灯。主要代码如下:

测试现象

在下图红框处打上断点,当完成软件复位之后再次执行到该语句时,查看变量,发现处于自定义RAM区域的变量保留了之前的值,而处于bss段的变量被初始化为0了。

退出调试模式,重新上电,LED先亮几秒红灯,然后亮绿灯,且一直保持。重复几次,现象一样,符合预期。

注意事项

笔者在调试RAM retention功能时,总结了一些注意事项,分享给大家。

1. 另一种实现RAM retention功能的方式

想要使用RAM retention功能,不一定需要修改ld文件,也可以按如下方式进行:

  • 定义变量如下:
#define SRAMU 0x20006000u
#define SRAML 0x1FFF8600u
uint32_t Temp[2] = {0};
  • 主函数的实现方式如下:

2. 自定义RAM区域的地址问题

在ld文件设置自定义地址时,增加了NOLOAD关键字,主要是为了生成的烧录文件(S19/HEX/BIN)不包含自定义RAM区域的地址,否则无法使用量产工具下载程序。

3. bool类型变量使用RAM retention功能

如果将需要使用RAM retention功能的变量定义为bool类型,在掉电之前该值为true,会发现重新上电之后,该变量的值仍为true。但是,如果掉电之前该值为false,重新上单之后,该值为true。发生该现象的原因笔者并未找到,建议尽量不使用bool类型变量实现该功能。

如果非要使用bool类型,初始化值使用true,主程序中赋值为false,具体如下面两张图,测试结果是OK的。

4. 不使用调试模式进行测试

在测试该例程时,发现重新上电进入debug模式时,自定义区域的变量已经变成了期望值(上电之后并未进行软件复位),和预期结果不符合。但是脱离调试模式,进行的测试结果又是符合预期的。建议读者测试RAM retention功能时离线测试,debug模式下会出现意料之外的情况。

参考资料

  1. Example S32K144 RAM Retention S32DS.R1 - NXP Community
  2. S32K1xxRM Rev12.1, 02/2020,官网已是最新的Rev14
  3. 老王的朋友圈截图

例程分享

本文所使用的例程分享如下:
链接:https://pan.baidu.com/s/155Ok2mU51AMBsaQ9n-XFGg
提取码:89vy

如何在软件复位后保留指定RAM区域的数据相关推荐

  1. 软件启动后出现“根级别上的数据无效 行1 位置1“错误

    使用XDocument.Parse解析XML时报异常: 根级别上的数据无效. 第 1 行 位置 1. 解决方式目前有两种: 1 XmlDocument doc = new XmlDocument(); ...

  2. 客快物流大数据项目(三十):软件下载后存放位置

    软件下载后存放位置 一.虚拟机数据路径配置 创建文件夹路径 mkdir -p /export/softwares /export/services /export/datas /export/soft ...

  3. 单片机复位后为什么要对sp重新赋值_单片机系统抗干扰,软件 VS 硬件哪个重要?...

    在提高硬件系统抗干扰能力的同时,软件抗干扰以其设计灵活.节省硬件资源.可靠性好越来越受到重视.下面以MCS-51单片机系统为例,对微机系统软件抗干扰方法进行研究. 1.软件抗干扰方法的研究在工程实践中 ...

  4. 批量卸载软件脚本python_Python练习小工具——批量删除同名电子书保留指定格式...

    本帖最后由 似水流年2015 于 2020-9-2 23:41 编辑 小书库清理走起,陆陆续续存了上百G的电子书,很多电子书同一本却有4种格式,epub,mobi,azw3, pdf,多浪费硬盘啊,寻 ...

  5. 单片机异常复位后如何保存变量数据

    目录 1.理论 2.实践 1.理论 众所周知,单片机复位后变量数值会自动初始化,以华大半导体HC32L136为例,具有 7 个复位信号来源,每个复位信号都可以让 CPU 重新运行,绝大多数寄存器会被复 ...

  6. STM32的复位方式:硬件复位、软件复位(看门狗复位和系统复位)

    STM32的复位方式:硬件复位.软件复位(看门狗复位和系统复位). 1.硬件复位: 硬件复位通过给NRST引脚输入低电平复位单片机. 2.看门狗复位: 独立看门狗和窗口看门狗. (1)独立看门狗 ST ...

  7. 单片机复位后为什么要对sp重新赋值_常见的单片机复位方式及其原理分析

    为确保设计出的电路系统稳定可靠的工作,必须在电路中加入复位电路--将电路恢复到初始状态.类似于我们使用的电脑,一旦我们电脑死机或发生其他问题,我们会利用重启按钮重启我们的电脑.复位电路亦是如此,一旦我 ...

  8. 关于STM32使用RTC时复位后程序死在 RTC

    在软件仿真时如果不需要配置,则程序会死在 RTC_WaitForSynchro() 函数中.而下载到硬件上时,有时候可以跑,有时候也会在该函数中死循环. 可能的原因: 首先,一定要确认是否使能了对后备 ...

  9. 台式电脑键盘按键错乱_电脑键盘按键怕误触怎么办?用这款软件帮你屏蔽指定键盘按键!支持替换按键!...

    点击蓝字即可快速关注我,分享好软件~ 平时在一些情况下,比如在打游戏的时候,如果不小心按到了win键,就会被跳回桌面,非常的麻烦 今天小林君就来分享一个非常好用的小工具,通过它可以实现屏蔽电脑键盘上任 ...

最新文章

  1. Android Studio你不知道的调试技巧
  2. Linux模块机制浅析
  3. class多项式(链表实现)
  4. 2014522920145316《信息安全系统设计基础》实验一 开发环境的熟悉
  5. python输入圆的半径公式_【同步练习】六年级数学上册圆的面积教材同步
  6. 云卓遥控器+DIY高清摄像机的方案(完美接入原系统)
  7. 一个完整的pytorch预训练实现图像分类,模型融合
  8. iOS 微信消息拦截插件系列教程-附录(服务端成果展示)
  9. exe4j生成的exe反编译
  10. Java集合容器面试题(2022版本)
  11. google内部考核制度OKR
  12. IP-Guard清除记录
  13. 三角函数的正交性及其公式推导
  14. bitbake如何clean
  15. 新增用户时输入账号已存在(全局异常处理)
  16. 最短公共超序列(最短公共父序列)
  17. 期货客户开户手续费(期货开户最低手续费)
  18. python实现百度语音之语音识别
  19. RSD处理高分5号高光谱(GF5 AHSI)数据(四)——从地物光谱搜索高光谱数据集
  20. js 针对异步的处理

热门文章

  1. 微机原理学习笔记-常见寻址方式
  2. 苹果电脑压缩视频大小变小怎么压缩那个软件好
  3. 博客园:教你如何给一篇博客加入外链
  4. 成功的项目经理,每天、每周、每月应该做的都在这里
  5. 【PCIe】PCIe 完成超时机制
  6. PMP认证考试报考流程
  7. ECharts+Bootstrap实现响应式中国地图
  8. Python常见字符编码及其之间的转换
  9. 如何解决Arduino IDE开发板管理器下载失败----以离线安装esp8266-2.7.2为例
  10. 拓邦新能上市申请获创业板受理:毛利率持续下降,张震华为大股东