You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Raspberry Pi Pico上传uf2文件后自动断开连接求助

Raspberry Pi Pico 烧录UF2时自动断开的问题排查与修复

代码中的核心错误

你的汇编代码存在多处外设地址、寄存器偏移逻辑错误,且缺少防止CPU跑飞的死循环,这些问题会导致程序执行异常,触发硬件重启,表现为烧录时设备断开:

  1. 寄存器地址与偏移错误

    • 错误定义了reset_clr地址(实际应为0x4000C008而非0x4000F000)
    • GPIO功能设置的偏移逻辑错误:引脚25的控制寄存器偏移应为25*4,而非128+19的错误组合
    • SIO寄存器偏移完全错误:SIO输出置位寄存器偏移是0x10、输出使能寄存器偏移是0x18,而非代码中的#9、#5(ARM汇编中偏移为字节数,你的数值完全不符合外设手册定义)
  2. 缺少死循环
    程序执行完所有指令后,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

编译与烧录的关键配置

  1. 添加正确的链接脚本
    必须指定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

  2. 使用官方工具转换UF2
    替换你用的binuf2,使用Pico官方的elf2uf2工具,转换命令:elf2uf2 led.elf led.uf2

  3. 烧录操作验证

    • 按住BOOTSEL键插入USB,等待设备挂载为U盘
    • 用sudo cp led.uf2 /media/$USER/RPI-RP2/执行烧录(避免权限问题)
    • 若仍断开,检查USB线缆是否为数据传输线,或尝试更换USB端口

内容的提问来源于stack exchange,提问作者KmerPadreDiPdor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 20:52:51