【IoT】STM32 FLASH 掉电数据丢失处理策略以及备份机制

目录

1、原因

2、解决方式

2.1、硬件方式解决 — 掉电保护机制 

2.2、软件方式解决 


1、原因

由于FLASH的擦除和写入的特性,如果在擦除中掉电或者写入时掉电,有可能会出现失败的情况,下次再上电读取就会出错。

擦除的时候掉电,不能保证擦除完全,但是已经擦除的部分,肯定是0xff了。

写的时候掉电,已经写入的就是正确的,电平掉到最低极限工作电压附近时,写入的就无法保证了,地址无法保证,写入的值也无法保证。没有写到的,肯定还是 0xFF。  

2、解决方式

2.1、硬件方式解决 — 掉电保护机制 

必须硬件电路上有相应的掉电警告中断,而且必须有足够的时间供软件响应。  

掉电保存和上电恢复,需要以下: 

1) 快速检测掉电信号;

2) 要有足够的时间让你停下来保存现场;

3) 上电后可靠的复位; 

这些的关键是掉电信号\电源\复位信号三个怎么配合的事;
  
掉电保护不是重新擦写那么简单,首先要有一个机制能知道发生了掉电事件,还要知道什么地方的数据是可能出错的,如果是新建文件还好一点,一般就是数据作废,如果是改写一个文件时发生掉电事故的话,

  • 11
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 下面是 STM32 的代码示例: ```c #include "stm32f1xx_hal.h" void SystemPower_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Enable Power Clock */ __HAL_RCC_PWR_CLK_ENABLE(); /* Enable GPIOs Clock */ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); /* Configure all GPIO port pins in Analog Input mode (floating input trigger OFF) */ GPIO_InitStructure.Mode = GPIO_MODE_ANALOG; GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Pin = GPIO_PIN_All; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); /* Disable all GPIO port clocks */ __HAL_RCC_GPIOA_CLK_DISABLE(); __HAL_RCC_GPIOB_CLK_DISABLE(); __HAL_RCC_GPIOC_CLK_DISABLE(); /* Enter Stop Mode */ HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); } ``` 这个代码将所有 GPIO 都配置成了模拟输入模式,然后关闭了所有 GPIO 的时钟,并进入了低功耗模式。在低功耗模式下,只有低功耗寄存器可以工作,其他的外设都处于停止状态,可以实现功能。需要注意的是,前需要保存必要的数据,以便下次唤醒后恢复系统状态。 ### 回答2: STM32代码主要完成低功耗的功能,使得芯片在状态下仍然能够正常工作。以下是一个简单示例: #include "stm32f10x.h" #include "stm32f10x_pwr.h" int main(void) { RCC_AHBPeriphClockCmd(RCC_AHBPeriph_PWR, ENABLE); // 使能PWR时钟 PWR_EnterSTANDBYMode(); // 进入模式 while (1) { // 程序将不会执行到这里 } } 在该示例中,我们首先使能了PWR时钟以便使用模式相关的函数。然后,调用PWR_EnterSTANDBYMode()函数进入模式,程序将停止在此处,直到外部中断或复位事件唤醒芯片。在模式下,CPU和大多数外设都被关闭,以节省功耗。 要注意的是,模式的唤醒源可以是多种事件,如外部中断、定时器、看门狗等,可以根据实际需求进行配置和使用。在芯片被唤醒后,程序将从唤醒源指定的中断服务函数开始执行。 对于更复杂的模式,你需要进一步了解和配置芯片的低功耗模式,如选择正确的时钟源、配置外设唤醒等。此外,为了使芯片进入模式之前的准备工作,比如保存数据和关闭外设等,你可能还需要编写其他代码。 ### 回答3: STM32代码主要是通过在程序中配置相应的寄存器来控制芯片进入低功耗模式以实现的功能。以下是一个典型的STM32代码示例: 首先,需要将芯片的时钟配置为低功耗时钟模式。在RCC寄存器中配置相应的控制位,例如选择内部低速时钟(LSI)作为时钟源。 其次,需要对待写入的寄存器进行相应的配置。例如,将GPIO口的输入/输出模式设置为适当的状态,使其在期间保持在合适的平状态。 然后,需要使芯片进入低功耗模式。这可以通过将PWR寄存器中的控制位设置为相应的值来实现。例如,可以选择进入低功耗待机模式(Stop Mode)或者低功耗休眠模式(Sleep Mode)。 最后,在模式下恢复时,需要重新配置时钟源和寄存器状态。通过相应的寄存器配置,恢复芯片的正常工作状态。 总之,STM32代码的实现主要包括三个步骤:配置时钟源、配置寄存器状态以保持适当平、设置低功耗模式进入和恢复。具体的代码实现可以根据实际需求进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

产品人卫朋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值