我试图保存一些数据到闪存的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();
}
第一节第一节第一节第一节第一次
2条答案
按热度按时间h5qlskok1#
这可能是因为设备关闭过快,以至于无法完成掉电功能。
您可以将ESP32欠压检测电平设置为各种电压,如下所示
尝试使用
ESP_BROWNOUT_DET_LVL_SEL_7
代替CONFIG_BROWNOUT_DET_LVL_SEL_5
您也可以尝试在VCC引脚上放置一个大电容(22uF或更高)。当电容放电时,它可能会给予ESP32足够的时间来运行掉电功能。
42fyovps2#
ESP 32的板载BOD主要是为了抑制操作,可能会导致腐败,如果他们发生在太低的电压。所以它是完全相反的,当一个BOD被检测到,你应该执行一些I/O读/写操作到一些媒体。BOD检测的全部目的是停止操作。
你需要做的是:
1.具有电压感测电路以检测电源的存在(在VUSB或VIN上);
1.一个小型备用电池或超级电容器,将继续ESP 32的权力足够长的时间,你保存数据和电源关闭。
您可以设置中断时,停电发生通过您的电压感应电路,你做你需要做的,而电源保持稳定。