ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ESP32-S3 N16R8 PlatformIO自定义板卡配置:16MB Flash与8MB PSRAM全启用指南

ESP32-S3 N16R8 PlatformIO自定义板卡配置:16MB Flash与8MB PSRAM全启用指南 这块ESP32-S3-N16R8开发板我拿到手第一件事就是插上USB打开PlatformIO准备写个点灯程序。默认选了ESP32-S3-DevKitC-1这个板型编译上传倒是顺利但跑起来后心里始终不踏实——打印出来的Flash只有8MBPSRAM压根没初始化稍微开个大一点的LVGL显示缓冲就直接重启。后来我专门花了一个周末去研究PlatformIO自定义开发板配置才真正把N16R8里的16MB Flash和8MB Octal PSRAM全部榨干。这篇就把我的配置过程、踩坑记录和排查思路完整写出来给同样拿这块板子折腾的朋友做个参考。1. 为什么PlatformIO默认板卡配置不够用从一块N16R8说起1.1 板卡列表里的“差不多”差在哪PlatformIO内置的板卡库里有一大堆ESP32-S3系列比如esp32-s3-devkitc-1、esp32-s3-devkitm-1、esp32-s3-foxelf-1等等。这些板型大多是板卡厂商在官方json基础上改出来的硬件预设各不相同。最要命的是里面很多板卡的flash_size、psram参数跟市面上常见的N16R8模组并不完全一致。我这里说的N16R8指的是ESP32-S3芯片搭配16MB Flash和8MB PSRAM的模组。这个组合在目前的S3开发板里非常流行跑LVGL、OpenMV、micro-ROS这类稍微上点规模的应用都非常合适。但PlatformIO内置板型里很多只配到了8MB Flash甚至4MBPSRAM更是经常被忽略。如果直接拿一个参数不匹配的板型来编译固件会按照错误的Flash容量生成分区表PSRAM相关配置也不对后续跑起来就是各种诡异问题。有朋友可能会说那我不用自定义开发板直接在platformio.ini里加几行board_build.flash_size不就行了确实可以覆盖一部分参数但这一招只能解决单个变量的覆盖解决不了整个board描述文件的缺失。比如variant、ldscript、flash_mode、psram_mode这些配置散落在platformio.ini里维护起来非常费力换一个项目又得重新配一遍。把整块板的描述集中到一个json文件里才是治本的做法。1.2 自定义配置能解决哪些实际问题自定义开发板配置本质上是给PlatformIO提供一个更精确的“硬件描述文件”它告诉编译器、链接器和烧录工具这颗芯片是什么型号、Flash有多大、PSRAM是什么模式、用哪套链接脚本、分区表长什么样。从实操角度我总结下来至少有五个收益Flash容量精确识别16MB就是16MB编译出来的分区表不会因为容量错误导致OTA或文件系统越界。PSRAM完整启用8MB OPI PSRAM在Arduino和ESP-IDF下都能被正确初始化大内存应用才跑得起来。分区表按需定制默认分区表只有4MB左右的应用分区自定义后可以做出7MB7MB的OTA双分区或者15MB超大型应用分区。工程切换零成本把board json文件放在工程目录下以后换电脑、换环境只要工程还在配置就跟走。多板型管理同一套代码可以针对不同板子建多个env编译时用参数指定板型测试非常方便。1.3 什么时候不需要折腾自定义板卡我也得说句公道话并不是所有场景都需要自定义开发板配置。如果你手里正好是某款官方预置板型比如主控是ESP32-S3-DevKitC-1且Flash/PSRAM容量完全一致那就没必要折腾直接选官方板型就行。或者你只是点个灯、读个传感器对Flash和PSRAM容量不敏感用默认板型编出来的固件也能正常运行。但只要你发现以下情况中的任意一种我建议你别犹豫直接上自定义配置板子的Flash或PSRAM容量在板卡列表里找不到完全匹配的。跑LVGL、摄像头、AI推理、micro-ROS后出现内存不足或异常重启。需要OTA升级但默认分区表装不下新版固件。烧录后SPIFFS/LittleFS无法格式化或者文件系统容量不对。想统一管理多块型号相近但参数不同的开发板。2. 先看硬件ESP32-S3-N16R8的关键参数与PlatformIO配置的对应关系2.1 从命名拆解硬件特性ESP32-S3-N16R8这串型号前一半是芯片系列后一半是封装与存储配置。拆开看非常直观ESP32-S3乐鑫的S3芯片双核Xtensa LX7主频最高240MHz带Vector指令加速支持WiFi 4和BLE 5.0还有原生USB OTG接口。N16表示模组板载16MB Quad SPI Flash。这个容量在嵌入式开发里算是大块头了足够装下带OTA分区的完整固件还能留出空间给文件系统。R8表示板载8MB Octal PSRAM也就是8MB的片外伪静态随机存储器。ESP32-S3内部SRAM只有512KB左右但实际可用堆内存远比这小有了8MB PSRAM跑图形界面、图像处理、AI模型推理才有了底气。还有一个容易忽略的点ESP32-S3的Flash支持QIO/QOUT/DIO/DOUT模式PSRAM也有QSPI和OPI两种类型。N16R8模组上的PSRAM是Octal PSRAM对应PlatformIO配置里的opi模式。搞错这个模式PSRAM虽然能初始化但读写可能不稳定甚至直接开机卡死在启动日志里。2.2 硬件参数如何映射到PlatformIO配置项在PlatformIO里开发板描述文件的路径是boards/xxx.json里面的build字段会被用来生成编译参数。这里我列个表格把N16R8的硬件参数和对应配置项直接对应起来硬件参数N16R8实际值PlatformIO配置项常用取值芯片型号ESP32-S3build.mcuesp32s3CPU频率240MHzbuild.f_cpu240000000LFlash大小16MBbuild.flash_size16MBFlash工作频率80MHz以模组具体规格为准build.f_flash80000000LFlash模式Quadbuild.flash_modeqioPSRAM大小8MBbuild.psram / upload.maximum_ram_sizetrue / 8388608PSRAM类型Octalbuild.psram_modeopiArduino变体通用ESP32S3build.arduino.variantesp32s3链接脚本带外部RAM的S3脚本build.arduino.ldscriptesp32s3_out.ld分区表自定义16MBbuild.partitionsdefault_16MB.csv或自定义csv看到上面这个表你就明白为什么不能只用board_build.flash_size去覆盖了。psram_mode、ldscript、variant这几项光靠platformio.ini里的局部覆盖很难搞干净写成board json才是一劳永逸。2.3 上电确认实际硬件情况别被丝印骗了在配置之前我强烈建议先确认自己板子上的模组到底是什么型号。虽然大多数N16R8开发板丝印标得很清楚但市场上也有不少混用模组的板子比如标称N16R8实际用的Flash是8MB或者PSRAM是4MB。真碰到这种情况你照着N16R8配置编出来的分区表可能越界烧录后启动失败。我常用的确认方法是先用PlatformIO编一个空工程烧进去然后跑下面这段代码#include Arduino.h void setup() { Serial.begin(115200); delay(1000); Serial.printf(Chip model: %s\n, ESP.getChipModel()); Serial.printf(Flash size: %u bytes\n, ESP.getFlashChipSize()); Serial.printf(PSRAM size: %u bytes\n, ESP.getPsramSize()); Serial.printf(Free heap: %u bytes\n, ESP.getFreeHeap()); Serial.printf(Free PSRAM: %u bytes\n, ESP.getFreePsram()); } void loop() { delay(10000); }如果Flash打印出来不是16MB或者PSRAM打印出来是0字节先别急着配置。用pio run -t erase擦除整片Flash再重新烧录试试。如果擦除后PSRAM依然为0大概率是板子用料和标称不符或者模组本身PSRAM没焊接好这种情况再怎么写board json都没用。3. 手把手配置自定义开发板boards文件与platformio.ini实战3.1 工程目录结构自定义板卡文件放哪里PlatformIO支持把自定义开发板描述文件放在工程根目录的boards/文件夹下。文件名就是board的ID比如我建一个esp32s3_n16r8.json然后在platformio.ini里写board esp32s3_n16r8PlatformIO就会自动去工程目录下找这个文件。完整目录结构示意如下my_project/ ├── boards/ │ └── esp32s3_n16r8.json ├── partitions/ │ └── custom_16MB.csv ├── platformio.ini ├── include/ │ └── README ├── lib/ │ └── README ├── src/ │ └── main.cpp └── test/ └── README这里有个细节boards/目录和partitions/目录都不是PlatformIO默认创建的需要手动新建。boards/里的json文件名不要用中文不要带空格一律小写加下划线否则PlatformIO在解析板名时容易出问题。partitions/目录用来放自定义分区表csv后面的章节会专门讲。3.2 board JSON核心字段详解直接给出一份我验证过可用的board json再逐项拆解。{ build: { core: esp32, mcu: esp32s3, f_cpu: 240000000L, f_flash: 80000000L, flash_mode: qio, flash_size: 16MB, psram: true, psram_mode: opi, partitions: default_16MB.csv, arduino: { ldscript: esp32s3_out.ld, variant: esp32s3 } }, frameworks: [arduino, espidf], name: ESP32-S3 N16R8 Custom Board, upload: { maximum_ram_size: 8388608, maximum_size: 16777216 }, url: https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/, vendor: Custom }逐项说明build.coreArduino core类型esp32系列固定为esp32。build.mcu芯片型号S3固定为esp32s3。build.f_cpuCPU频率240MHz就是240000000L。注意后面这个L不能省略PlatformIO解析时需要它来识别长整型。build.f_flashFlash工作频率N16R8大多数模组支持80MHz。如果实际是40MHz的Flash这里改成40000000L不然启动容易异常。build.flash_modeFlash模式S3模组常见qio。如果你的板子对Flash兼容性要求高可以改成dio但性能会略降。build.flash_size16MB这里直接写16MBPlatformIO会自动换算成字节数。build.psram是否启用PSRAM填true。build.psram_modePSRAM类型R8模组的Octal PSRAM对应opi。如果是QSPI PSRAM则需要填qspi。build.partitions分区表文件名或路径。这里我用官方带的default_16MB.csv后面会讲自定义分区表的做法。build.arduino.ldscript链接脚本。ESP32-S3在Arduino core下默认使用esp32s3_out.ld这个脚本会把部分RAM段放到外部PSRAM是启用大内存的关键。build.arduino.variantArduino变体S3统一用esp32s3。frameworks声明该板卡支持哪些框架我写上了arduino和espidf这样同一份board json既能支持Arduino框架也能支持ESP-IDF框架。upload.maximum_ram_size编译时用于RAM占用上限检查的参考值。8MB PSRAM存在所以填8388608但真正运行时能用的RAM以链接脚本和实际堆管理为准。upload.maximum_sizeFlash容量检查的上限对应16MB。3.3 platformio.ini里几个决定成败的配置项board json建好之后接下来是platformio.ini。下面是我实测能稳定编译的完整配置[platformio] default_envs esp32s3_n16r8 [env:esp32s3_n16r8] platform espressif32 board esp32s3_n16r8 framework arduino board_build.partitions partitions/custom_16MB.csv board_build.flash_size 16MB board_build.flash_mode qio board_build.psram true board_build.psram_mode opi monitor_speed 115200 upload_speed 921600 upload_port /dev/cu.usbmodem14101 ; Windows下示例: upload_port COM10 ; Linux下示例: upload_port /dev/ttyACM0看到这里你可能要问board json里已经写了flash_size、flash_mode、psram这些参数为什么platformio.ini里还要再写一遍原因是platformio.ini里这些board_build.*参数的优先级高于board json写在这里可以确保在任何环境下都按我们指定的值走相当于上一道保险。另外如果你在platformio.ini里没有设置完全依赖board json也是可以的但我在多台电脑、多个PlatformIO版本上遇到过json里的参数被平台默认值覆盖的情况所以保险起见都写一遍。实际使用中upload_port在不同操作系统上写法不同而且同一台电脑插不同的USB口设备名也会变。Windows上是COM加数字macOS上是/dev/cu.usbmodem*或/dev/cu.wchusbserial*Linux上最常见的是/dev/ttyACM0或/dev/ttyUSB0。如果不想每次插拔都改配置文件可以把upload_port注释掉让PlatformIO自动扫描但前提是你的电脑上只插了一个串口设备否则它会扫出多个设备然后报错。3.4 定制适合16MB Flash的分区表默认分区表里app分区通常只有1MB多对于ESP32-S3这颗芯片来说太浪费了。我给出两个常用方案一个带OTA一个不带OTA大家按需取用。先看不带OTA的超大app分区方案适合固件体积大、不需要远程升级的场景# Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x5000, otadata, data, ota, 0xe000, 0x2000, app0, app, ota_0, 0x10000, 0xF00000, spiffs, data, spiffs, 0xF10000,0xF0000,这个表的意思是app分区从0x10000开始大小15MB基本把整个Flash都给了固件。spiffs只有1MB适合只需要存少量配置的场景。如果不需要文件系统可以把spiffs删掉把app0的size加大到0xFF0000也行但要注意最后要留一点余量给coredump之类的系统功能。再看带OTA的双分区方案这也是我目前主力使用的# Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x5000, otadata, data, ota, 0xe000, 0x2000, app0, app, ota_0, 0x10000, 0x700000, app1, app, ota_1, 0x710000,0x700000, spiffs, data, spiffs, 0xe10000,0x1F0000,这个表的逻辑是分区各7MB总共14MB留给spiffs约2MB。OTA升级时固件写到备用分区里校验通过后切换启动即使新固件有问题也能回滚到旧版本。如果你跑micro-ROS、做小型无人车这个方案我比较推荐。分区表文件建好后放在工程目录的partitions/文件夹下然后在platformio.ini里指定board_build.partitions partitions/custom_16MB.csv有几个硬性规则必须记住分区表里的Offset必须按0x10000对齐nvs分区起始地址要从0x9000开始otadata紧接着nvs。如果偏移写错编译时不会报错但烧录后启动会卡在app partition is invalid之类的错误非常难排查。3.5 编译、烧录、验证一条龙配置完成后在VSCode的PlatformIO IDE里直接点右上角的对勾编译或者命令行执行pio run如果编译通过可以接上开发板执行pio run -t upload pio device monitor这里我建议第一次烧录时把波特率降下来upload_speed 115200原因很简单16MB Flash第一次烧录时如果使用921600这类高速率有些USB转串口芯片不稳定容易烧到一半断开。等确认整条链路稳定了再改回高速率节省时间。烧录完成后串口输出应该能看到类似下面的信息Chip model: ESP32-S3 Flash size: 16777216 bytes PSRAM size: 8388608 bytes Free heap: 609824 bytes Free PSRAM: 8136944 bytes看到这个输出就说明自定义开发板配置真正生效了。如果PSRAM打印为0或者Flash不是16777216字节直接跳到下一章的排查表。4. 实操中容易踩的坑问题现象与排查方法4.1 编译报错ldscript找不到、variant不存在、f_cpu不匹配自定义开发板配置最常见的错误就是board json写完后编译直接报错而且报错信息五花八门。我整理了几个高频场景和解决思路。报错linker script does not exist或者cannot find esp32s3_out.ld通常是build.arduino.ldscript写错了。首先确认你用的是Arduino框架因为ESP-IDF框架下这个字段不生效。其次确认拼写S3的链接脚本是esp32s3_out.ld不是esp32s3.ld少了一个_out就会找不到。_out这个后缀代表输出到片外Flash/RAM的配置是S3启用PSRAM时必须要用的脚本。报错variant xxx not found说明build.arduino.variant填的变体名不对。ESP32-S3在Arduino core里通用变体叫esp32s3大部分板卡json都用这个。如果改成别的名字而实际不存在编译就会在找variant头文件时挂掉。还有一种情况是f_cpu写错导致编译出来的代码运行异常。比如写成240000000而漏了LPlatformIO在解析时可能把它当成普通整数最后传给编译器的宏是-DF_CPU240000000数值本身没错但链接时某些依赖F_CPU类型的代码可能因此出现类型推断问题。这类问题很隐蔽表现是编译偶尔成功偶尔失败或者运行后定时器时间不准。我的经验是把240000000L原样照抄不要手抖少写任何字符。4.2 PSRAM没生效或运行时死机PSRAM是N16R8这块板子的灵魂配置不好比不用还麻烦。我遇到过的现象分两种一种是完全不初始化ESP.getPsramSize()返回0另一种是能打印出8MB但一访问PSRAM就死机重启。先看不初始化的原因。在Arduino框架下PSRAM的启用严格依赖board json或platformio.ini里的psram和psram_mode两个配置。psram为true只代表“要启用”如果psram_mode没有设置成opi而模组又是Octal PSRAM初始化大概率失败打印出来就是0字节。填了opi还是不行检查一下platformio.ini里的board_build.flash_mode有些板子的Flash和PSRAM共用总线Flash如果跑在dio模式PSRAM也会被拖累。我在这块板子上建议Flash用qioPSRAM用opi两边都按最高性能走。再看能打印8MB但一访问就死机的情况。这通常是链接脚本没配对。当你看到PSRAM size: 8388608时说明初始化已经成功但如果你在代码里用ps_malloc()或heap_caps_malloc()分配的缓冲区会被链接脚本映射到内部RAM段而内部RAM耗尽后编译器可能把变量放到了错误的位置运行时就崩。解决方法是确认board json里的arduino.ldscript是esp32s3_out.ld这个脚本会把部分堆和静态数据放到PSRAM只有它才能真正发挥大内存作用。4.3 Flash容量识别错误烧录后打印显示Flash是8MB而不是16MB这种问题往往不是board json的问题而是烧录工具读到的flash size和实际不符。esptool在擦除、烧录时会读取flash的SFDP信息理论上能自动识别容量但有些模组的Flash型号比较冷门SFDP信息不完整esptool就会按默认值处理。解决方法是显式指定Flash容量。在platformio.ini里加上board_upload.flash_size 16MB board_build.flash_size 16MB同时执行一次全片擦除pio run -t erase擦除后重新烧录。如果依然识别不对可以用esptool直接读取Flash信息验证python -m esptool --port /dev/cu.usbmodem14101 flash_id看输出里的Detected flash size如果硬件本身就只有8MB那说明你的板子不是真正的N16R8板子上丝印可能标错了。这种情况就只能按实际容量配置别硬按16MB来。4.4 PlatformIO创建工程慢与包下载卡住很多刚接触PlatformIO的朋友问过我为什么在VSCode里新建工程要等好几分钟甚至卡死。这里要说清楚PlatformIO首次创建ESP32-S3工程时需要下载三部分东西平台包espressif32、工具链toolchain-xtensa-esp32s3、框架framework-arduinoespressif32或espidf。这三者加起来体积非常大几个GB都很正常网络状况一般的时候确实慢。缓解办法有几个。第一不要频繁新建工程建议创建一个标准化模板工程把board json、分区表、常用配置都放好以后直接用模板复制。第二第一次下载时可以把工程建在机械硬盘上先等它跑完之后复制到SSDPlatformIO的包缓存是在用户目录下的~/.platformio不随工程移动所以复制工程不会重复下载。第三如果网络条件真的很差可以找一台已经下好包的电脑把~/.platformio目录整体打包拷贝过来拷贝完成后执行pio system info确认包目录结构完好。还有一个容易被忽略的点VSCode里新建工程时如果勾选了很多框架下载时间会翻倍。只勾Arduino框架就够了ESP-IDF需要时再通过platformio.ini的platform_packages补充没必要一次性全部下齐。4.5 串口烧录失败与USB下载模式ESP32-S3的烧录方式比老ESP32多了一个原生USB口但也更容易把人绕晕。如果你的开发板同时有USB转串口芯片比如CP2102、CH340和原生USB口第一次烧录建议走UART方式也就是插USB转串口的那个口。在PlatformIO里默认上传协议就是esptool它会自动通过UART发送下载握手信号。如果烧录时报Failed to connect或者Device not found依次排查检查设备管理器或系统信息里有没有识别到串口设备Windows缺驱动就装CP210x或CH340驱动。确认platformio.ini里的upload_port指向的是正确的串口号。按住开发板上的BOOT按键再按一下RESET等串口出现后松开BOOT然后立刻点上传。如果用原生USB口上传很多板子需要进入下载模式才能被esptool识别。具体操作是按住BOOT用USB线连接原生USB口再按一下RESET这时候电脑上会出现一个类似ESP32-S3 USB JTAG/serial的设备。PlatformIO里可以使用upload_protocol esp32usb但要注意这个协议在不同PlatformIO版本里支持程度不同如果遇到协议不识别最简单的方法还是回到UART口烧录原生USB口留给运行时做USB设备功能。4.6 分区表相关的编译与运行错误自定义分区表最大的坑是偏移地址写错。我见过最典型的情况是编译能通过烧录也不报错但上电后串口输出大量invalid header、boot: Couldnt determine partition table甚至无限重启。排查思路很明确。先用pio run -t erase擦除整片Flash因为旧分区表可能还残留在新分区起始地址附近。然后检查csv文件里的nvs起始地址必须是0x9000otadata紧跟其后是0xe000app分区起始地址必须是0x10000。这三个是硬编码规则不能自己随便改。另外检查每个分区的Size和Offset是否越界18MB、16MB之外的地址肯定不对因为Flash总共就那么大。还有一个容易忽略的点分区表文件里第一行可以是注释但不要有中文和空格逗号分隔符后面的空格不要加。PlatformIO在解析csv时比较严格多一个空格也可能导致解析失败。5. 板卡配置到位后的进阶玩法5.1 PSRAM大内存场景LVGL、摄像头、AI推理自定义开发板配置真正带来的红利是让8MB PSRAM完整可用于是很多内存敏感型应用都有了落地的可能。我最常跑的场景是LVGL图形界面。默认情况下LVGL的显示缓冲只能分配在内部RAM几十KB就撑死了刷新一屏要拆分好几次。启用PSRAM后可以分配一个完整分辨率的显示缓冲比如800x480x2字节约750KB的缓冲直接放到PSRAMUI流畅度明显提升。分配方式就是static lv_disp_draw_buf_t draw_buf; static lv_color_t *buf (lv_color_t *)ps_malloc(sizeof(lv_color_t) * 800 * 60);再比如摄像头 人脸检测这类应用OV2640拍一张800x600的JPEG图也要几十KB到上百KB加上AI推理的输入张量内部RAM根本不够。有了8MB PSRAM这些数据都可以安全地放在外部RAM里模型推理也顺滑很多。这里要提醒一句PSRAM虽大但它的读写速度比内部SRAM慢而且大量占用它会增加功耗。不是所有变量都往PSRAM塞就最好热路径上的变量、中断回调里的数据结构还是尽量留在内部RAM。5.2 micro-ROS ROS2 Humble低成本移动机器人节点ESP32-S3在机器人领域有个很典型的用法就是跑micro-ROS作为ROS2 Humble网络里的低成本传感器/执行器节点。N16R8的16MB Flash和8MB PSRAM对micro-ROS来说属于非常宽裕的配置可以把节点做得更复杂比如同时维护里程计、电机控制、IMU融合和WiFi通信。工程上我的搭配是VSCode里装PlatformIO IDE插件用来写固件电脑上跑一个Ubuntu环境装ROS2 Humble再用Docker跑micro-ROS Agent。Agent负责把串口或UDP数据转换成ROS2话题ESP32-S3另一端则通过WiFi或者板载USB串口连接Agent。Docker方式启动agent非常方便一条命令就能创建一个干净、隔离的ROS2环境避免污染宿主机。UDP通信模式的agent启动命令大体如下具体镜像和参数以官方仓库文档为准docker run -it --rm --nethost microros/micro-ros-agent:humble udp4 --port 8888固件端则通过lib_deps引入micro_ros_platformio库连接时填Agent所在主机的IP和端口。配置好自定义开发板后WiFi、PSRAM、日志缓冲区都能正常分配节点稳定性高很多。5.3 Docker统一ROS2环境与VSCodePlatformIO工作流不少朋友做机器人开发时宿主机装的不是Ubuntu或者ROS2环境装得乱七八糟最后总会出现“在我电脑上明明能跑”的尴尬。我的建议是宿主机只负责VSCode和PlatformIO IDEROS2环境全部交给Docker这样固件开发、Agent运行、仿真测试可以做到互相隔离互不干扰。VSCode里配置PlatformIO IDE的流程本身不复杂安装插件后它会自动下载PlatformIO Core。真正需要留意的是如果你在Docker容器里也想用VSCode开发建议不要在容器里再装一套PlatformIO而是让容器只跑Agent和编译ROS2功能包固件编译留到宿主机。这样既保留了PlatformIO在宿主机上的快速响应又利用了Docker管理ROS2依赖的优势。另外如果直接使用PlatformIO的终端命令pio在macOS和Linux上都需要确保~/.platformio/penv/bin在PATH环境变量里。Windows上一般安装完IDE插件就会自动配好macOS上我偶尔会遇到命令找不到的情况执行一下export PATH$PATH:$HOME/.platformio/penv/bin即可。5.4 多环境切换一套代码适配多块板子最后分享一个工程组织技巧同一套代码通过不同env来切换不同开发板。比如我在platformio.ini里写两个环境[env:esp32s3_n16r8] platform espressif32 board esp32s3_n16r8 framework arduino build_flags -DBOARD_LED_PIN2 [env:esp32s3_n8r2] platform espressif32 board esp32s3_n8r2 framework arduino build_flags -DBOARD_LED_PIN15两个环境对应两块不同模组参数的板子代码里统一用BOARD_LED_PIN来操作LED编译时指定环境即可。编译命令pio run -e esp32s3_n16r8这样就可以在不改代码的前提下快速给不同板子出固件。配合不同的board json和分区表项目可维护性会好很多。关于自定义开发板配置我的建议是拿到新板子先花半小时把board json和分区表写好不要用默认板型凑合。这个前期投入非常值得后面跑起项目来会省很多排查时间。如果你也有一块N16R8或者类似的大Flash大PSRAM的ESP32-S3板子可以直接照着这篇文章的配置去改遇到问题欢迎在评论区一起交流。
返回列表