乐鑫技术交流
直播中

张鹏

7年用户 1163经验值
私信 关注
[问答]

使用LittleFS二进制文件烧写ESP8266报错的原因?

我正在尝试在我的 PC 上构建 LittleFS 文件系统二进制文件并将其闪存到我的 WeMos D1 Mini Pro (16MB) ESP8266。
我在 ESP 上使用了以下代码
代码:全选   LittleFS.begin()

   FSInfo info;

   LittleFS.info(info);

   Serial.print("LittleFS block size:");
   Serial.println(info.blockSize);

   Serial.print("LittleFS total bytes:");
   Serial.println(info.totalBytes);


确定块大小和总字节数,分别给了我“8192”和“14655488”。`14655488 / 8192 = 1789` 所以我在下面的 python 中使用 `1789` 作为块大小:
代码:全选from littlefs import LittleFS

fs = LittleFS(block_size=8192, block_count=1789)

with open( 'index.html', 'rb' ) as f:
   data = f.read()

with fs.open( '/index.html', 'w') as fh:
   fh.write( data )

with open('fs.bin', 'wb') as fh:
    fh.write(fs.context.buffer)


这将创建一个 14655488 字节的 .bin 文件。
然后我查看了 `boards.txt` 并找到了这些行:
代码:全选d1_mini_pro.menu.eesz.16M14M=16MB (FS:14MB OTA:~1019KB)
d1_mini_pro.menu.eesz.16M14M.build.flash_size=16M
d1_mini_pro.menu.eesz.16M14M.build.flash_size_bytes=0x1000000
d1_mini_pro.menu.eesz.16M14M.build.flash_ld=eagle.flash.16m14m.ld
d1_mini_pro.menu.eesz.16M14M.build.spiffs_pagesize=256
d1_mini_pro.menu.eesz.16M14M.upload.maximum_size=1044464
d1_mini_pro.menu.eesz.16M14M.build.rfcal_addr=0xFFC000
d1_mini_pro.menu.eesz.16M14M.build.spiffs_start=0x200000
d1_mini_pro.menu.eesz.16M14M.build.spiffs_end=0xFFA000
d1_mini_pro.menu.eesz.16M14M.build.spiffs_blocksize=8192


这确认了块大小并给出了 SPIFFS(但 LittleFS 在这里是等效的,对吧?)起始地址为 `0x200000`
然后我使用:
`python upload.py --chip esp8266 --port COM6 --baud 460800 write_flash 0x200000 fs .bin`
输出:
代码:全选esptool.py v2.8
Serial port COM6
Connecting....
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: ec:fa:bc:6e:19:90
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Auto-detected Flash size: 16MB
Compressed 14655488 bytes to 215596...
Writing at 0x00234000... (100 %)
Wrote 14655488 bytes (215596 compressed) at 0x00200000 in 56.7 seconds (effective 2067.0 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

但是,当我使用如下代码时
代码:全选Dir root = LittleFS.openDir("/");
while (root.next())
{
   Serial.print(root.fileName());
}

我什么也得不到,而且
代码:全选LittleFS.exists("/index.html")

返回假。
我做错了什么,或者我该如何调试?
我正在通过 Visual Studio Code 上传我的固件(不是文件系统),我使用的板配置是
代码:全选"xtal=80,vt=flash,exception=legacy,ssl=all,eesz=16M14M,ip=lm2f,dbg=Disabled,lvl=None____,wipe=none,baud=921600"

如果我在十六进制编辑器中打开 `bin`,我可以看到:
这是 html 文件中的一些 javascript。
如果我这样做:
代码:全选   uint32_t b;
   ESP.flashRead(0x006C2800 + 0x200000, &b, 1);
   Serial.println(b);

然后它返回 `115`/`0x73`,所以看起来二进制文件已经成功闪现,所以这让我觉得二进制文件在错误的地方闪现,或者它被损坏/无效......

回帖(1)

fansz

2024-4-9 17:35:59
“16777216” (16MB)。然后我创建了一个包含一些 CSS 文件和图像的 LittleFS 目录,并使用 ESP8266FS 插件将其烧写到了 WeMos D1 Mini Pro 中。

但是,当我运行代码以加载这些文件时,它似乎无法找到这些文件,并在串口监视器中打印了错误消息 “Failed to open file for reading.” 我已经检查了文件路径和文件名是否正确,并确认它们在 LittleFS 文件系统中。我还尝试了重新格式化 ESP8266 并重新烧写文件系统,但问题仍然存在。

经过一些调查,我发现问题可能是由于 LittleFS 二进制文件的大小不正确导致的。根据我的 WeMos D1 Mini Pro 的规格,它的闪存大小为 16MB,但我在构建 LittleFS 二进制文件时使用了默认的 4MB 选项。这导致 LittleFS 文件系统未能完全填满闪存,因此在我们尝试加载磁盘上的文件时,它会找不到它们。

解决方案是使用正确的闪存大小构建 LittleFS 二进制文件。在 Arduino IDE 中,此选项可以在 “工具”>“Flash Size”下进行选择。确保选择与您的 ESP8266 兼容的闪存大小。例如,在我的情况下,我应该选择 “16MB (FS:14MB OTA:~1019KB)”。然后重新构建 LittleFS 二进制文件,并将其闪存到 WeMos D1 Mini Pro 中。现在,当我运行我的代码时,文件可以正确地加载。

总而言之,如果您在烧写 LittleFS 二进制文件时遇到问题,请检查您选择的闪存大小是否正确。这可能会使您浪费很多时间,所以确保您做得正确。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分