在重置皮层m3上保留一些RAM值

时间:2015-04-08 08:48:07

标签: embedded microcontroller stm32 cortex-m3 stm32l152

单击棋盘上或基尔上的重置按钮后,有没有办法保留一些ram值或全局变量

我正在使用STM32L152ZE

3 个答案:

答案 0 :(得分:4)

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

取决于重置按钮的功能。

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

如果它是一个完整的电源复位(就像所有提供芯片的电压被完全移除一样),那么所有的赌注都会关闭。如果是这种情况,我认为唯一的选择是片上EEPROM。

您必须查看原理图和/或检查重置状态寄存器以获得明确的答案。

所以我们假设它的重置确实允许你保留RAM - 如果是这样的话,那么典型的步骤就是......

  1. 在链接器指令文件中添加一个特殊部分(或部分?),该文件未由C运行时初始化初始化。

  2. 使用围绕/与变量定义相关联的#pragma语句来控制它的去向(即调出特殊部分)。

  3. 启动时,检查重置原因代码寄存器以了解RAM是否包含有效数据。

  4. 假设它们是两个单独编译的程序,您需要制定类似的规定以防止引导加载程序触及RAM。

    作为创建特殊部分的替代方法,Kiel 可能提供C运行时启动代码的版本,该代码不会隐式地将任何全局变量“归零”,而只是初始化具有初始值的全局变量。这通常可用作改善启动时间的方法。你必须深入研究编译器手册(或者只编写你自己的C runt time init代码)来做到这一点....

答案 1 :(得分:2)

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

EEPROM就是这样,并且不会遇到STM32写入自己的闪存而导致总线停滞的问题,从而在写入和擦除块时执行代码。

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

如果它只是存在您感兴趣的复位,那么我相信只要通过复位保持功率(即不通过电源循环复位),就可以保持SRAM。但是,默认情况下,Keil项目配置为在启动时将所有IRAM段初始化为零;您可以在项目设置中保留一个部分作为" no-init" section,并使用变量__attribute__扩展名来显式实例化此部分或特定地址中的变量。

答案 2 :(得分:0)

如果您使用的是Keil IDE而不使用自己的链接器配置文件,那么它非常简单。 在"目标选项中 - 目标"有一个部分读/写存储区,在这里你定义一个新的区域,其中所有未初始化的变量将被放置。例如,start-0x20000000和size 0x20,并选中框#34; NoInit"如果你的RAM从0x20000000开始,你想在复位后保留前32个字节。 然后在"目标选项 - 链接器"中,确保"使用目标对话框中的内存布局"选择选项以便自动生成链接器SCT文件。

现在最后一步是将变量放入0x20000000到0x20000020区域。您在项目的单个文件中声明所有未初始化的变量。现在右键单击项目窗口中的文件名并选择选项"文件选项" xxx.c" "并在内存分配中为ZI数据选择0x20000000到0x20000020区域。 (希望您的未初始化变量在声明期间未在代码中分配任何值)