lmn2005 发表于 2022-5-13 19:55:36

ESP32-WROOM-32D模组上传Arduino IDE编译的固件总是重启,该如何解决

    手头的ESP32-WROOM-32D模组搭载的是单核CPU,因此Arduino IDE需要配置成单核编译模式。用ESP32的示例编译并上传固件后不断重启:
例如GetChipID,源代码如下:       
uint32_t chipId = 0;
void setup() {
        Serial.begin(115200);
}

void loop() {
        for(int i=0; i<17; i=i+8) {
          chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i;
        }

        Serial.printf("ESP32 Chip model = %s Rev %d\n", ESP.getChipModel(), ESP.getChipRevision());
        Serial.printf("This chip has %d cores\n", ESP.getChipCores());
Serial.print("Chip ID: "); Serial.println(chipId);

        delay(3000);

}

则运行后会不断重启并打印如下信息:
Rebooting...
ets Jun8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:10944
load:0x40080400,len:6388
entry 0x400806b4
E (104) system_api: Base MAC address from BLK0 of EFUSE CRC error, efuse_crc = 0x00; calc_crc = 0xd0
abort() was called at PC 0x400e1753 on core 0

ELF file SHA256: 0000000000000000

Backtrace: 0x4008443b:0x3ffb1ee0 0x40084699:0x3ffb1f00 0x400e1753:0x3ffb1f20 0x400d0cee:0x3ffb1f60 0x400d0b9b:0x3ffb1f90 0x400d14f1:0x3ffb1fb0 0x40085651:0x3ffb1fd0

如果把源码中的
for(int i=0; i<17; i=i+8) {
          chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i;
        }
这一部分注释掉,即:

uint32_t chipId = 0;
void setup() {
        Serial.begin(115200);
}

void loop() {
        Serial.printf("ESP32 Chip model = %s Rev %d\n", ESP.getChipModel(), ESP.getChipRevision());
        Serial.printf("This chip has %d cores\n", ESP.getChipCores());
Serial.print("Chip ID: "); Serial.println(chipId);

        delay(3000);

}
则可以完全正常。请教各位大佬,这是什么原因?该如何解决?

wxws 发表于 2022-5-14 07:24:14

小米iot模块就是单核的。这问题我也追了一阵子。说是由于arduino都是预编译,所以很多东西要重新编译下。当然用idf不存在这问题。建议谷歌。

lmn2005 发表于 2022-5-14 09:00:55

本帖最后由 lmn2005 于 2022-5-14 09:04 编辑

wxws 发表于 2022-5-14 07:24
小米iot模块就是单核的。这问题我也追了一阵子。说是由于arduino都是预编译,所以很多东西要重新编译下。当 ...
(引用自2楼)

idf下载hello_world没问题(当然要设置为单核模式),但是下载其他示例譬如WIFI --scan 编译后的固件,还是重启:
提示:
I (476) system_api: Base MAC address is not set
I (476) system_api: read default base MAC address from EFUSE
E (476) system_api: Base MAC address from BLK0 of EFUSE CRC error, efuse_crc = 0x00; calc_crc = 0xd0
加入:
        uint8_t mac = {0x58, 0xb6, 0x23, 0x4f, 0x7e};//58:b6:23:4f:a8:7e
        esp_base_mac_addr_set(mac);
则提示:
W (556) phy_init: failed to load RF calibration data (0x1102), falling back to full calibration
E (566) system_api: Base MAC address from BLK0 of EFUSE CRC error, efuse_crc = 0x00; calc_crc = 0xd0
请大师赐教,谢谢!

lxvtag 发表于 2022-5-14 11:41:45

你这模组是定制的还是山寨的啊?官方的这个应该是双核的。

看这报错是读取 eFuse 被设置成了什么特别的状态, 你的应用一定要使用 chipId?

wxws 发表于 2022-5-14 12:02:59

lxvtag 发表于 2022-5-14 11:41
你这模组是定制的还是山寨的啊?官方的这个应该是双核的。

看这报错是读取 eFuse 被设置成了什么特别的状 ...
(引用自4楼)

绝对 不是山寨的。应该是定制的,至于为什么单核 ,就不知道了。

LZ的demo.只是用取id 函数举个例子。并 不是非要取ID.涉及底层的调用,就出错了。

wxws 发表于 2022-5-14 12:03:38

https://github.com/mmakaay/arduino-esp32-unicore-no-mac-crc

lmn2005 发表于 2022-5-14 12:45:42

lxvtag 发表于 2022-5-14 11:41
你这模组是定制的还是山寨的啊?官方的这个应该是双核的。

看这报错是读取 eFuse 被设置成了什么特别的状 ...
(引用自4楼)

当然,不一定要读取chipId,但是在IDF中使用其他示例(譬如WIFI---scan),也同样会重启,并且一定会报错:
Base MAC address from BLK0 of EFUSE CRC error, efuse_crc = 0x00;calc_crc = 0xd0
据百度或论坛上网友说,这东西是小米IOT模组,应该有其他的网友手头也有这款单核模组。

baoyingcheng 发表于 2022-11-17 18:11:31

我的也是这样的,买的时候看丝印以为和官方的一样,结果收到之后发现是小米定制版,而小米还不对外开放它的定制SDK。
据我自己研究:如果用arduino开发,用6楼提供的是可以正常工作的,但这个老外没有及时更新,版本还是好3年前的1.0.6。而现在官方已经是2.0.5了。另外还有一个老外更新到了2.0.2,但没解决mac CRC的问题。
至于mac的问题其实是这样的,mac地址有两个,一个出场mac写在efuse的blk0区块,第一位是CRC,官方用的是8位马克西姆算法,而小米用的是其他算法,具体不清楚。而不论idf还是arduino还是mpy都是基于官方的idf的,而官方idf有个函数esp_efuse_mac_get_default,具体怎么实现的看不到,只有头文件,读取的时候会校验crc,如果出错就芯片抛出一个error然后自动重启。楼主这个例子就用到了ESP.getEfuseMac函数,这个函数是arduino框架封装的idf里的前面那个函数,一调用就会重启。包括网络和蓝牙相关的应用都会用到mac地址,而都会调这个函数,也就会造成重启。其他一切安好。
而且这个并不是单核,我拆开看过,内部的芯片实际是双核d0wd芯片,但怎么给锁成单核的也不清楚,据说(以下未验证)网络相关应用是跑在被锁的那个核心的,而官方的idf在开启网络的时候,你写的程序主要也是在app核里跑,而另一个核(叫pro核)跑的是网络栈,所以使用起来并不会有什么区别。而单核模块solo-1用的是s0wd的芯片,是生产的时候就有一个坏核心,然后锁成单核的,这个是真的只有一个核。如果开启wifi,且你的程序一直占用cpu则会导致断线或者重启。而小米这个却不会。有大佬用idf的可以验证一下。
另外,如果谁有企业营业执照的,可以去小米iot平台申请一份sdk,看看它那个patch到底改了哪些地方。我从文档里看,它也是用的乐鑫官方的idf,然后装好之后再运行一下patch,可惜我手头没有这个patch。有了这个之后,就可以根据官方的arduino和mpy编译出可供小米模块用的固件了。

lmn2005 发表于 2022-11-24 10:53:57

baoyingcheng 发表于 2022-11-17 18:11
我的也是这样的,买的时候看丝印以为和官方的一样,结果收到之后发现是小米定制版,而小米还不对外开放它的 ...
(引用自8楼)

你研究得太深入,说得太具体了!谢谢!
老外的1.0.6,也是从官方IDF中预编译的吧,但就是不知道在哪个环节忽略MAC CRC检验,或者有检验,但禁止其重启(我胡猜的)。
页: [1]
查看完整版本: ESP32-WROOM-32D模组上传Arduino IDE编译的固件总是重启,该如何解决