Embedded 将一些RAM值保持在复位状态

Embedded 将一些RAM值保持在复位状态,embedded,microcontroller,stm32,cortex-m3,stm32l152,Embedded,Microcontroller,Stm32,Cortex M3,Stm32l152,点击电路板或Kiel上的重置按钮后,有没有办法保留一些ram值或全局变量 我在使用STM32L152ZE免责声明:我是根据在其他芯片和工具链上做这类事情的经验来回答这个问题的。我不知道基尔或那个特别的部分 取决于重置按钮的功能 如果它直接在MCU上触发外部重置中断,则重置时可能保留所有RAM值,并且仅使用C运行时初始化将全局值归零/重新初始化。要验证这一点,请查看数据表中有关重置、RAM以及可能的待机/低功耗模式的部分,以了解详细信息。大多数现代MCU都为这些主题提供了一个完整的顶级部分 如果它

点击电路板或Kiel上的重置按钮后,有没有办法保留一些ram值或全局变量


我在使用STM32L152ZE

免责声明:我是根据在其他芯片和工具链上做这类事情的经验来回答这个问题的。我不知道基尔或那个特别的部分

取决于重置按钮的功能

如果它直接在MCU上触发外部重置中断,则重置时可能保留所有RAM值,并且仅使用C运行时初始化将全局值归零/重新初始化。要验证这一点,请查看数据表中有关重置、RAM以及可能的待机/低功耗模式的部分,以了解详细信息。大多数现代MCU都为这些主题提供了一个完整的顶级部分

如果它是一个完全的电源复位(如在所有的电压供应芯片完全删除),那么所有的赌注是关闭的。如果是这样的话,我认为唯一的选择是片上EEPROM

您必须查看示意图和/或检查重置状态寄存器,以获得最终答案

所以,让我们假设重置允许您保留RAM-如果是这样的话,那么典型的步骤是

  • 向链接器指令文件中添加一个特殊节(或多个节?),该文件未由C运行时init初始化

  • 使用与变量定义相关的
    #pragma
    语句控制变量定义的位置(即调用该特殊部分)

  • 启动时,检查复位原因码寄存器,以了解RAM是否包含有效数据

  • 假设引导加载程序是两个单独编译的程序,则需要做出类似的规定,以防止引导加载程序也接触RAM


    作为创建特殊部分的替代方案,Kiel可能会提供一个C运行时启动代码版本,该版本不会隐式地“零”任何全局变量,而是只使用初始值初始化全局变量。这通常是一种提高启动时间的方法。要做到这一点,您必须深入阅读编译器手册(或者只编写自己的C runt time init代码)…

    STM32L152ZE包括一个16 KB的EEPROM和128字节的备份寄存器

    EEPROM正是如此,并且不会出现STM32写入自己的闪存的问题,因为它会暂停总线,从而在写入和擦除块时执行代码

    备份寄存器与设备的其余部分(以及RTC)位于不同的电源域上,只要电源保留在此域,数据就可以保留。有一种保护机制需要特定的顺序来读取和写入这些寄存器


    如果它只是在您感兴趣的重置中幸存下来,那么我相信只要通过重置(即不是通过电源循环重置)保持电源,那么SRAM就会保持。然而,默认情况下,Keil项目配置为在启动时将所有IRAM段初始化为零;您可以在项目设置中保留一个节作为“no init”节,并使用变量
    \uuu attribute\uuu
    扩展名在此节中或在特定地址显式实例化变量。

    如果您使用的是Keil IDE,而不是使用自己的链接器配置文件,那么就相当简单了。 在“Options of target-target”中有一个读/写内存区域,在这里您定义了一个新区域,所有未初始化的变量都将放置在该区域中。例如start-0x20000000和size 0x20,如果您的RAM从0x20000000开始,并且希望在重置后保留前32个字节,请选中“NoInit”框。 然后在“目标-链接器的选项”中,确保选中“从目标对话框使用内存布局”选项,以便自动生成链接器SCT文件

    现在,最后一步是将变量放入0x20000000到0x20000020区域。您可以在项目的单个文件中声明要取消初始化的所有此类变量。现在,右键单击项目窗口中的文件名,并选择选项“文件选项”xxx.c在内存分配中,为ZI数据选择0x20000000到0x20000020区域。(希望您未初始化的变量在声明过程中没有在代码中指定任何值)