搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2022-5-13 19:55:36 | 显示全部楼层 |阅读模式
    手头的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 Jun  8 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);

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入228汤圆

发表于 2022-5-14 07:24:14 来自手机 | 显示全部楼层
小米iot模块就是单核的。这问题我也追了一阵子。说是由于arduino都是预编译,所以很多东西要重新编译下。当然用idf不存在这问题。建议谷歌。

出0入0汤圆

 楼主| 发表于 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[6] = {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
请大师赐教,谢谢!

出0入169汤圆

发表于 2022-5-14 11:41:45 | 显示全部楼层
你这模组是定制的还是山寨的啊?官方的这个应该是双核的。

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

出0入228汤圆

发表于 2022-5-14 12:02:59 | 显示全部楼层
lxvtag 发表于 2022-5-14 11:41
你这模组是定制的还是山寨的啊?官方的这个应该是双核的。

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

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

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

出0入228汤圆

发表于 2022-5-14 12:03:38 | 显示全部楼层
https://github.com/mmakaay/arduino-esp32-unicore-no-mac-crc

出0入0汤圆

 楼主| 发表于 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模组,应该有其他的网友手头也有这款单核模组。

出0入0汤圆

发表于 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编译出可供小米模块用的固件了。

出0入0汤圆

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

你研究得太深入,说得太具体了!谢谢!
老外的1.0.6,也是从官方IDF中预编译的吧,但就是不知道在哪个环节忽略MAC CRC检验,或者有检验,但禁止其重启(我胡猜的)。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 06:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表