入驻于 2024-10-05 / MAKE 主页
我用了多种办法生成UF2文件,但是用二进制编辑器打开后,头部信息总是与官方固件的文件有些不一样,于是才想起了用官方文件作为基础,自已修改一个UF2文件。
有对RP2040进行降频和超频的,要注意这个问题。代码没有调试好,不要上传要RP2040,不然有可能遇到我的问题。
一块开发板不值几个钱,但是解决了问题,总是好的,以后超频降频也没有后顾之忧了。
我自已在官方固件二进制文件后面增加了空白内容,直接能装满2M。同是修改固件数据块中的长度值,用来刷一次,已成功恢复。
python:(其中RP2040.uf2为固件文件名)
# 创建一个512字节的字节数组,用来追加到固件后面。x0D,x0E,0x14,0x15为块计数,每块需要更新
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()
关键是我修改了时钟频率后,Type-c插上后电脑识别不了这个设备,Thonny就无法通信。
只有写uf2固件可以。
写固件不会清除原来的main.py,所以,只要使用micropython固件,通电就会运行这个main.py,其中的machine.freq(2700000)指令就会修改时钟频率,Type-c就不能正常通讯。
现在只有通过编写一个初始化EEPROM的程序,编译成uf2来恢复。可是,我不会做。