电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
[树莓派Pico] 解决使用MicroPython固件出现变砖假死的问题
分 享
扫描二维码分享
[树莓派Pico] 解决使用MicroPython固件出现变砖假死的问题
pico变砖
pico假死
wybliw
关注
发布时间: 2021-09-14
丨
阅读: 4338
[TOC] --- 开发环境: * win10系统 * 树莓派Pico (mpy固件版本V1.1.17) * Thonny V3.3.13 --- ## 问题起源 相信很多树莓派pico玩家,遇到在使用microPython固件(后文简称mpy固件)时,自己一不小心上传main.py,代码中有错误的语法,或者死循环代码,导致pico再次连接Thonny时,出现无响应,连接不上的情况。 当py代码中写了死循环代码,这就会导致pico再次连接thonny时,可能会连接不上,点击停止按钮也无济于事,因为pico的cpu被死循环代码占用,无法与thonny连接上,所以点击任何按钮都无响应。比如下图: ### Thonny正常连接Pico ![](https://cf04.ickimg.com/bbsimages/202109/6275f5a4ddb05e03a414f41c4cbeb831.png) thonny正常连接到pico后,shell区会有mpy版本等信息提示,文件区会有pico磁盘显示。 ### Thonny无法连接Pico ![](https://cf04.ickimg.com/bbsimages/202109/662a673d244a696f5d93828e0139341c.png) thonny连接不上pico,shell区可能没有任何提示或者有其他连接错误的信息,文件区也没有pico磁盘显示。 这种情况,即使是重新上传microPython固件,也无法解决问题,因为自己的main.py文件还在flash中,目前mpy固件大小是550KB左右,除非上传一个很大的uf2程序到pico中,覆盖mpy固件后面的flash区域,就能将自己main.py文件覆盖掉,然后再上传mpy固件就正常连接thonny了。目前circuitpython固件有1.2MB,可以覆盖mpy后面的一部分区域。 * [CircuitPython固件下载](https://circuitpython.org/board/raspberry_pi_pico/) * [MicroPython固件下载](https://micropython.org/download/rp2-pico/) 除了用cpy固件外,就是自己写flash擦除程序,上传到pico来擦除flash。 ## flash擦除程序 ### 搭建pico C SDK开发环境 这里使用树莓派4B来开发,用Ubuntu PC需要下载交叉编译工具。 ### 下载sdk和example 打开树莓派4B,按照pico官方手册《getting-started-with-pico.pdf》,第2章 SDK,在树莓派4B中,用户目录下,创建pico文件夹,进入pico文件夹,git下载pico-sdk和pico-examples文件。 ![](https://cf04.ickimg.com/bbsimages/202109/e5132495f10d427c8ebec03beb8e4226.png) ### 设置sdk环境变量 ![](https://cf04.ickimg.com/bbsimages/202109/d24b40826025afc9557bd73961fe6465.png) ### 编译blink程序 创建进入example文件夹,build文件夹。 ![](https://cf04.ickimg.com/bbsimages/202109/0a828a3cc5fe0b08040458451e8fd895.png) 进入build文件夹,执行cmake命令。 ![](https://cf04.ickimg.com/bbsimages/202109/2d2687c822dd418a85b559c020e184f9.png) 进入build下的blink文件夹,make编译程序。 ![](https://cf04.ickimg.com/bbsimages/202109/f104bd9952d05726f7cc267a0a161584.png) 编译完成后,blink文件下会产生uf2文件。 ### 编译flash擦除程序 这里通过 C SDK 手册《raspberry-pi-pico-c-sdk.pdf》中,第4章,4.1.9节,介绍了flash操作相关的API。使用官方flash示例中的,pico-examples/flash/program/flash_program.c, 官方示例地址:https://github.com/raspberrypi/pico-examples 修改 flash_program.c 程序如下: ``` c // 擦除空间:起始地址:0x40000, 结束地址:0x200000, // (256KB) (2048KB) // 擦除块大小:4096B(4KB) // 擦除时,板载LED会以约150ms的频率闪烁; // 擦除完成:板载LED会以约1s的频率闪烁. // 串口使用的是:IO0(Txd)和IO1(Rxd). #include
#include
#include "pico/stdlib.h" #include "hardware/flash.h" #define PICO_DEFAULT_LED_PIN 25 const uint LED_PIN = PICO_DEFAULT_LED_PIN; // We're going to erase and reprogram a region 256k from the start of flash. // Once done, we can access this at XIP_BASE + 256k. #define FLASH_TARGET_OFFSET (256 * 1024) const uint8_t *flash_target_contents = (const uint8_t *) (XIP_BASE + FLASH_TARGET_OFFSET); int main() { stdio_init_all(); gpio_init(LED_PIN); gpio_set_dir(LED_PIN, GPIO_OUT); uint8_t f = 1; uint32_t start_addr = FLASH_TARGET_OFFSET; uint32_t blank_num = (2048 * 1024 - FLASH_TARGET_OFFSET) / (FLASH_SECTOR_SIZE); uint32_t end_addr = FLASH_TARGET_OFFSET + FLASH_SECTOR_SIZE * blank_num; // 开始擦除flash printf("\nStart Erasing Flash... total blank: %d\n", blank_num); for (int i=0; i
>start address: 0x%X , Size: 0x%X \n", FLASH_TARGET_OFFSET + FLASH_SECTOR_SIZE*i, FLASH_SECTOR_SIZE); gpio_put(LED_PIN, f); f=!f; sleep_ms(100); } // 擦除完成 printf("Erase Done... \n"); printf("Erase Flash: Start: 0x%X, End: 0x%X. total size: %d KB.\n", \ start_addr, \ end_addr, \ (end_addr - start_addr) / 1024); // LED灯提示 while(1) { gpio_put(LED_PIN, 0); sleep_ms(1000); gpio_put(LED_PIN, 1); sleep_ms(1000); } } ``` 和blink程序一样,直接make,就可以编译程序了,编译完成后,就会出现uf2文件。 将uf2文件上传到pico,即可执行flash擦除,擦除时,板载LED灯会以150ms左右频率闪烁,擦除完成后,LED灯以1s左右频率闪烁。 使用串口助手,可以查看擦除过程: ![](https://cf04.ickimg.com/bbsimages/202109/380101b06bf3f2abebf59b74c7f06525.png) ### 擦除成功 擦除完成后,重新上传mpy固件即可,thonny连接上后,如下图: pico文件区,原来的文件已全部清空。 ![](https://cf04.ickimg.com/bbsimages/202109/6e4671c6fa1f3455e2fa4b72d025590d.png) 已编译好的程序下载连接: * [Pico Flash擦除程序](https://download.csdn.net/download/wybliw/21867582)
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
wybliw
关注
评论
(1)
登录后可评论,请
登录
或
注册
wybliw
213
天前...
官方示例中有个flash_nuke程序,是专用的flash擦除程序,,程序在RAM跑,擦除全部的FLASH,,完成后自动重启PICO进入U盘模式。
0
回复
发布
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交