UNO ESP32(Wemon D1 R32)报错:rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
前言,具体问题情况
开发板:UNO ESP32(Wemon D1 R32)
开发环境:Arduino Ide 2.2.2
- 网上搜
rst:0x10
这样的关键词全都是说引脚问题什么的,但是我出现这个问题是在我改了下代码(封装多任务,没改跟引脚相关的)之后出现的 - 接线也没变,纯纯就是改了下原代码的结构,所以感觉问题肯定不是引脚相关的,然后问了半天GPT,结果原因貌似是在全局范围内创建对象
- 我是照着这篇文章修改我的代码,修改后相关代码如下
class YjTask
{
public:
YjTask(uint32_t deltaT = 500) : dt(deltaT)
{
tNext = dt;
}
void poll()
{
if (millis() >= tNext)
{
loop();
tNext += dt;
}
}
virtual void loop() = 0;
protected:
const uint32_t dt;
volatile uint32_t tNext;
};
class TaskWiFi : public YjTask
{
public:
TaskWiFi(uint8_t vpin, uint32_t deltaT = 500) : YjTask(deltaT), pin(vpin)
{
String ssid = "ESP32";
String passwd = "1145141919810";
bool isOpenWiFiAP = WiFi.softAP(ssid, passwd);
// WiFi创建成功才会设置引脚为输出
if (isOpenWiFiAP == true)
pinMode(pin, OUTPUT);
}
void loop()
{
digitalWrite(pin, !digitalRead(pin));
}
private:
uint8_t pin;
};
TaskWiFi WiFiBlink(pinWiFi, 500);
void setup() {
Serial.begin(115200); // 设置串口波特率
}
void loop() {
WiFiBlink.poll();
}
- 修改成这样以后上传,板子就开始在串口
rst:0x10
刷屏了,问了半天GPT - 说是在setup()前就实例化对象导致的,让我移到setup()里面
- 结果移到里面编译器直接不通过了,因为loop()里面调用了
WiFiBlink.poll()
,而这个对象是在setup()里面定义的,所以作用域只在那里面 - 再问一遍GPT它给了个解决方法,这下可以用了
解决方法(个人例子)
修改后代码如下,貌似就是通过在全局范围声明一个对象的指针,对象创建放到setup()内,在loop()内就用这个指针来调用方法
TaskWiFi* WiFiBlink;
void setup() {
Serial.begin(115200); // 设置串口波特率
WiFiBlink = new TaskWiFi(pinWiFi, 500);
}
void loop() {
WiFiBlink->poll();
}
省流
我遇到rst:0x10
的原因貌似是在全局范围内实例化对象,但是别人这样貌似没问题,所以可能是这个板子的特性(Wemos D1 R32是真的坑人),解决方法就是把对象创建放到setup()里面,但是在全局范围创建个这个对象的指针,这样loop()里面就能调用这个对象的方法了
没学过C++,表述可能有一堆错误什么的,qwq