Raspberry Pi Pico如何从配置文件读取持久化参数?
Raspberry Pi Pico 配置文件读写解决方案(无额外硬件)
核心问题
Pico默认的U盘模式(BOOTSEL)是bootloader专属功能,烧录UF2重启后会退出U盘模式运行用户程序,此时U盘内的文件无法被用户程序读取——这两种模式互斥,不能同时运行。
最简可行方案:用户程序内实现USB MSC + 内部Flash文件系统
直接利用Pico自带的2MB内部Flash,在用户程序中同时实现USB虚拟U盘功能和FAT文件系统,用户可通过USB修改配置文件,程序能直接读取Flash内的配置,断电数据持久保存,无需额外硬件。
步骤(新手友好)
- 基于SDK示例改造:打开Pico SDK中的
usb_msc示例(路径pico-sdk/examples/device/usb_msc),该示例已实现用户程序内的USB虚拟U盘功能。 - 划分Flash区域:从2MB Flash末尾预留一块区域(比如512KB)作为配置存储区,避免覆盖程序代码。示例:
#define FS_START_ADDR (PICO_FLASH_SIZE_BYTES - 512*1024) - 集成FATFS文件系统:用SDK自带的FATFS库把预留Flash区域格式化为FAT分区,既可以通过USB MSC让用户修改
config.txt,程序也能通过标准C文件API(fopen/fread)读取配置。 - 双功能并行:USB连接时Pico被识别为U盘,用户可修改配置;断开USB或程序运行时,正常读取配置参数。
关键代码片段
文件系统初始化与配置读取
#include "ff.h" #include "pico/flash.h" // 预留Flash末尾512KB作为配置存储区 #define FS_START_ADDR (PICO_FLASH_SIZE_BYTES - 512*1024) #define FS_SIZE_BYTES (512*1024) FATFS fs; void init_fs() { // 挂载文件系统 if (f_mount(&fs, "", 1) != FR_OK) { // 挂载失败,尝试格式化 f_mkfs("", FM_FAT, 0, NULL, 0); f_mount(&fs, "", 1); } } void load_config() { FIL config_file; if (f_open(&config_file, "config.txt", FA_READ) == FR_OK) { char config_buf[256]; UINT read_bytes; f_read(&config_file, config_buf, sizeof(config_buf)-1, &read_bytes); config_buf[read_bytes] = '\0'; // 在这里解析配置参数(比如按行分割、键值对解析) f_close(&config_file); } }
CMake依赖配置
在CMakeLists.txt中添加必要的库依赖:
target_link_libraries(your_project_name pico_stdlib tinyusb_device fatfs )
替代方案(适合无需频繁修改配置的场景)
如果不需要随时通过USB修改配置,可将配置文件与程序固件合并为一个UF2:
- 用SDK的
pico2uf2工具,把config.txt打包进Flash预留区域,用户烧录一次即可完成程序和配置的写入。修改配置时重新生成带新配置的UF2再烧录即可,实现简单但灵活性稍差。
内容的提问来源于stack exchange,提问作者Atlasy
相关产品推荐
相关产品推荐

