最近有遇到树莓派 Pico W 因上传了某一段程序,导致 Thonny 无法和 Pico 主板通信,串口调试会提示设备忙(Device Busy),但是可以识别到端口。
这种状态下,无法给 Pico 上传程序,即使重新刷了 UF2 固件也不管用。所以需要用到 @ybzjllj 分享的方法来处理。其原理是给 Pico 的闪存全覆盖写入,彻底将残留在闪存中的程序移除。
为了制作这个占位用的 UF2 文件,可以先下载官方的 MicroPython 固件,将它命名为 RP2040.uf2。再使用下面的代码把这个文件的大小增加到 4,194,304 bytes。
代码如下:
base_512 = bytearray(
b’\x55\x46\x32\x0A\x57\x51\x5D\x9E\x00\x20\x00\x00\x00\x00\x00\x10′
b’\x00\x01\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x56\xFF\x8B\xE4′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00′
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x6F\xB1\x0A’
)
def uf2_append_data():
global i, x0D, x0E
x0D = 0
x0E = 0
with (open(‘RP2040.uf2’, ‘rb’) as file):
content = file.read() # 读取全部内容
modified_chunk = bytearray(content) # 转换为可变字节数组
for i in range(0, int(len(modified_chunk)/512)): # 遍历所有块,每块512字节
if x0D != modified_chunk[i*512+0x0D] or x0E != modified_chunk[i*512+0x0E]:
print(“Error:”, i, modified_chunk[i*512+0x0D], modified_chunk[i*512+0x0E])
return
modified_chunk[i*512+0x18] = 0x00 # 修改块的长度值为0x2000内容
modified_chunk[i*512+0x19] = 0x20
x0D += 1
if x0D == 0x100:
x0D = 0
x0E += 1
# 将修改后的内容写入同一文件
with open(‘RP2040.uf2’, ‘wb’) as file:
file.write(modified_chunk) # 写入修改后的内容
print(i) # 打印固件原有块数,后面接着追加块。
while i< 0x1FFF: # 追加块数到
temp512 = base_512
temp512[0x0D] = x0D
temp512[0x0E] = x0E
temp512[0x14] = x0D
temp512[0x15] = x0E
with open('RP2040.uf2', 'ab') as file:
file.write(temp512) # 以追加模式打开文件并写入
i += 1
x0D += 1
if x0D == 0x100:
x0D = 0
x0E += 1
uf2_append_data()
[/bash]
下面提供了制作好的 UF2 文件,可以直接下载使用。
链接: https://pan.baidu.com/s/1hrV3nBy_xRssEwjJ91Cg3g?pwd=c5vg 提取码: c5vg
按下 boot 按键不放,链接 Pico 和计算机,将出现 Pico 的磁盘分区。将上述 UF2 文件复制到 Pico 根目录即可。
发表评论