Raspberry Pi Pico上传uf2文件后自动断开连接求助
Raspberry Pi Pico 烧录UF2时自动断开的问题排查与修复
代码中的核心错误
你的汇编代码存在多处外设地址、寄存器偏移逻辑错误,且缺少防止CPU跑飞的死循环,这些问题会导致程序执行异常,触发硬件重启,表现为烧录时设备断开:
寄存器地址与偏移错误
- 错误定义了
reset_clr地址(实际应为0x4000C008而非0x4000F000) - GPIO功能设置的偏移逻辑错误:引脚25的控制寄存器偏移应为
25*4,而非128+19的错误组合 - SIO寄存器偏移完全错误:SIO输出置位寄存器偏移是
0x10、输出使能寄存器偏移是0x18,而非代码中的#9、#5(ARM汇编中偏移为字节数,你的数值完全不符合外设手册定义)
- 错误定义了
缺少死循环
程序执行完所有指令后,CPU会进入未定义指令或硬 fault状态,直接导致硬件重启,这是烧录后设备断开的关键原因之一。
修复后的完整代码
.section .data .equ RESET_BASE, 0x4000C000 .equ RESET_CLR, 0x4000C008 // RESET_CLR 寄存器:清除指定外设复位 .equ RESET_DONE1, 0x4000C002 // RESET_DONE1:复位完成状态寄存器 .equ GPIO_BASE, 0x40014000 .equ GPIO_CTRL_REG, 0x40014000 // GPIO控制寄存器基地址,每个引脚占4字节 .equ SIO_BASE, 0xD0000000 .equ SIO_GPIO_OE_SET, 0xD0000018 // SIO输出使能置位寄存器 .equ SIO_GPIO_OUT_SET, 0xD0000010 // SIO输出电平置位寄存器 .section .text .global _start _start: // 复位IO_BANK0和PADS_BANK0,确保外设初始化完成 ldr r0, =RESET_CLR mov r1, #(1<<5 | 1<<6) // 对应IO_BANK0(位5)和PADS_BANK0(位6)的复位清除位 str r1, [r0] // 等待复位完成 ldr r0, =RESET_DONE1 _wait_reset: ldr r2, [r0] tst r2, #(1<<5 | 1<<6) beq _wait_reset // 设置GPIO25为SIO功能(功能编码5) ldr r0, =GPIO_CTRL_REG add r0, #25*4 // 引脚25的控制寄存器偏移:25*4字节 mov r1, #5 str r1, [r0] // 使能GPIO25为输出模式 ldr r0, =SIO_GPIO_OE_SET mov r1, #(1<<25) str r1, [r0] // 设置GPIO25输出高电平,点亮LED ldr r0, =SIO_GPIO_OUT_SET str r1, [r0] // 死循环,防止CPU跑飞触发硬件异常 _loop: b _loop
编译与烧录的关键配置
添加正确的链接脚本
必须指定Pico的内存布局,创建linker.ld文件:MEMORY { FLASH (rx) : ORIGIN = 0x10000000, LENGTH = 2048K RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 256K } SECTIONS { .text : { *(.text) } > FLASH .data : { *(.data) } > RAM AT > FLASH .bss : { *(.bss) } > RAM } ENTRY(_start)链接命令:
arm-none-eabi-ld -T linker.ld -o led.elf led.o使用官方工具转换UF2
替换你用的binuf2,使用Pico官方的elf2uf2工具,转换命令:elf2uf2 led.elf led.uf2烧录操作验证
- 按住BOOTSEL键插入USB,等待设备挂载为U盘
- 用
sudo cp led.uf2 /media/$USER/RPI-RP2/执行烧录(避免权限问题) - 若仍断开,检查USB线缆是否为数据传输线,或尝试更换USB端口
内容的提问来源于stack exchange,提问作者KmerPadreDiPdor
相关产品推荐
相关产品推荐

