C语言 利用掉电中断保存掉电数据

0yycz8jy  于 2023-03-29  发布在  其他
关注(0)|答案(2)|浏览(209)

我试图保存一些数据到闪存的esp32当电源故障发生时它保存数据时,brown out被调用。我正在使用一些代码,我发现here,但brown out并没有触发所有的时间,当电源关闭,我不明白代码是如何工作的,任何人都可以帮助理解和编辑这一个可靠的输出

#include <Arduino.h>
#include "esp_system.h"
#include "soc/soc.h"
#include "soc/cpu.h"
#include "soc/rtc_cntl_reg.h"
#include "driver/rtc_cntl.h"
#include "esp_compiler.h"
#include <EEPROM.h>

typedef  void (*functiontype)  ( void*);

#ifdef CONFIG_BROWNOUT_DET_LVL
#define BROWNOUT_DET_LVL CONFIG_BROWNOUT_DET_LVL
#else
#define BROWNOUT_DET_LVL 5
#endif //CONFIG_BROWNOUT_DET_LVL

#define CONFIG_BROWNOUT_DET_LVL_SEL_5 1

#define countaddress 507
#define ribbonaddress 509

#define ONE_BYTES 1
#define TWO_BYTES 2
#define THREE_BYTES 3

volatile int ribbonlength=0;
volatile int count=0;

void  low_voltage_save()
 {
      byte countbytehigher = count>>8 ;
      byte countbytelower  = count& 0xFF ;
      EEPROM.write(countaddress,countbytelower);
      EEPROM.write(countaddress+1,countbytehigher);
      byte bytehigher= ribbonlength>>16;
      byte bytemid= ribbonlength>>8;
      byte bytelower=ribbonlength&0xFF;
      EEPROM.write(ribbonaddress,bytelower);
      EEPROM.write(ribbonaddress+1,bytemid);
      EEPROM.write(ribbonaddress+2,bytehigher);
      EEPROM.commit();
      Serial.println("Brown Out Function Triggerd");
            REG_WRITE(RTC_CNTL_INT_CLR_REG, RTC_CNTL_BROWN_OUT_INT_CLR);
        esp_cpu_stall(!xPortGetCoreID());
        while(1){}
        
}



void brownout_init()
{
    REG_WRITE(RTC_CNTL_BROWN_OUT_REG,
            RTC_CNTL_BROWN_OUT_ENA /* Enable BOD */
            | RTC_CNTL_BROWN_OUT_PD_RF_ENA /* Automatically power down RF */
            /* Reset timeout must be set to >1 even if BOR feature is not used */
            | (2 << RTC_CNTL_BROWN_OUT_RST_WAIT_S)
            | (BROWNOUT_DET_LVL << RTC_CNTL_DBROWN_OUT_THRES_S));

   ESP_ERROR_CHECK(rtc_isr_register((functiontype)low_voltage_save, NULL, RTC_CNTL_BROWN_OUT_INT_ENA_M) );
    // printf("Initialized BOD\n");

    REG_SET_BIT(RTC_CNTL_INT_ENA_REG, RTC_CNTL_BROWN_OUT_INT_ENA_M);
}

int EEPROM_READ(int address,int noofbytes)
  {
    if (noofbytes== TWO_BYTES)
    {
      byte bytehigher = EEPROM.read(address+1);
      byte bytelower =  EEPROM.read (address);
    
      return(bytehigher<<8)+bytelower;
    }
    else if (noofbytes ==THREE_BYTES)
    {
      byte bytehigher= EEPROM.read (address+2);
      byte bytemid= EEPROM.read (address+1);
      byte bytelower=EEPROM.read (address);

      return(bytehigher<<16)+(bytemid<<8)+bytelower;
    }
    else if (noofbytes ==ONE_BYTES)
     {
      return EEPROM.read (address);
     }
     
     
  }
  void incrementfun()
  {
    if(ribbonlength==100000)
    {
      ribbonlength=0;
    }
    if(count==10000)
    {
      count=0;
    }
    ribbonlength++;
    count++;
    Serial.println("current count "+String(count)+" currentlength "+String(ribbonlength));
    delay(500);
  }
void setup()
 {
  brownout_init();
  Serial.begin(115200);
  EEPROM.begin(512);
  count=EEPROM_READ(countaddress,TWO_BYTES);
  ribbonlength=EEPROM_READ(ribbonaddress,THREE_BYTES);
  Serial.println("count read "+String(count));
  Serial.println("ribbonlength read "+String(ribbonlength));
 }

void loop() {
  incrementfun();
}

第一节第一节第一节第一节第一次

h5qlskok

h5qlskok1#

这可能是因为设备关闭过快,以至于无法完成掉电功能。
您可以将ESP32欠压检测电平设置为各种电压,如下所示

Available options:
2.43V +/- 0.05 (ESP_BROWNOUT_DET_LVL_SEL_0)
2.48V +/- 0.05 (ESP_BROWNOUT_DET_LVL_SEL_1)
2.58V +/- 0.05 (ESP_BROWNOUT_DET_LVL_SEL_2)
2.62V +/- 0.05 (ESP_BROWNOUT_DET_LVL_SEL_3)
2.67V +/- 0.05 (ESP_BROWNOUT_DET_LVL_SEL_4)
2.70V +/- 0.05 (ESP_BROWNOUT_DET_LVL_SEL_5)
2.77V +/- 0.05 (ESP_BROWNOUT_DET_LVL_SEL_6)
2.80V +/- 0.05 (ESP_BROWNOUT_DET_LVL_SEL_7)

尝试使用ESP_BROWNOUT_DET_LVL_SEL_7代替CONFIG_BROWNOUT_DET_LVL_SEL_5
您也可以尝试在VCC引脚上放置一个大电容(22uF或更高)。当电容放电时,它可能会给予ESP32足够的时间来运行掉电功能。

42fyovps

42fyovps2#

ESP 32的板载BOD主要是为了抑制操作,可能会导致腐败,如果他们发生在太低的电压。所以它是完全相反的,当一个BOD被检测到,你应该执行一些I/O读/写操作到一些媒体。BOD检测的全部目的是停止操作。
你需要做的是:
1.具有电压感测电路以检测电源的存在(在VUSB或VIN上);
1.一个小型备用电池或超级电容器,将继续ESP 32的权力足够长的时间,你保存数据和电源关闭。
您可以设置中断时,停电发生通过您的电压感应电路,你做你需要做的,而电源保持稳定。

相关问题