洋桃1号开发板 · 下载模式选择速查
洋桃1号开发板 · 下载模式选择速查
适用范围:洋桃1号开发板(核心板带 MODE 按键 + ASP 指示灯,板载 ASP 自动下载芯片)
回答问题:什么时候能串口下载、什么时候能 ST-Link 烧录、连不上芯片时该怎么切
核心结论:BOOT0 决定芯片从哪里启动,而启动位置决定 SWD 能不能连。
三秒设置:灯暗亮 + 闪 2 次 + BOOT0 接 GND → ST-Link 随便连(见「正确操作方式」一节)
#一、元信息
| 字段 | 值 |
|---|---|
| 芯片/平台 | 洋桃1号开发板 / STM32F103C8T6(通用:任何带 ASP 自动下载电路的洋桃核心板) |
| 接口类型 | MODE 按键(单击/双击/长按)+ ASP 指示灯状态;底层为双路继电器控制 BOOT0 与 BOOT1(PB2) |
| 验证状态 | ✅ 已验证 |
| 验证环境 | 洋桃1号开发板 / ST-Link V2(SWD)+ STM32CubeProgrammer CLI(普通 / HotPlug / Under Reset 三种模式)/ OpenOCD 读回 PC·SP·GPIO 寄存器 / CH340 + FlyMcu / 2026-09-11 |
| 驱动方式 | 纯硬件操作,无代码 |
| 出厂默认 | Flash ISP 模式 + 自动下载开启 |
#二、接线表
| 信号 | MCU 引脚 | 说明 |
|---|---|---|
| BOOT0 | BOOT0 引脚 | 由 ASP 双路继电器自动控制;手动模式下必须明确接 GND,绝不能悬空(悬空会被板载 10K 上拉成 1) |
| BOOT1 | PB2 | 同为 ASP 控制;PB2 可能被外设占用(如摇杆按键,按下接地),电平必须用寄存器读数确认,不能靠猜 |
| NRST | NRST | 非必需;接上后可用 connect under reset 模式强连,属保险措施 |
| SWDIO / SWCLK | PA13 / PA14 | ST-Link 调试接口 |
| USART1 TX / RX | PA9 / PA10 | CH340 串口下载通路 |
#三、正确操作方式
忘了就只看这一节。三步设置好,之后 ST-Link 随时能连、能烧、能调试:
| 步骤 | 操作 | 确认状态 |
|---|---|---|
| 1 | 双击 MODE 键 | ASP 指示灯变成 暗亮(= 关闭自动下载) |
| 2 | 长按 MODE 键 | 指示灯闪 2 次(= 切到 RAM ISP 这一档) |
| 3 | BOOT0 接到 GND | 然后断电重新上电 |
口诀:灯暗亮 + 闪 2 次 + BOOT0 接 GND = ST-Link 随便连
按上面设置完成后:
- 板子正常运行你的程序(屏幕正常显示)
- ST-Link 用普通模式就能连上 —— 不需要接 NRST、不需要把 BOOT0 拨到 3.3V
- 烧录完自动复位运行
绝对不要做的两件事:
| ❌ 错误操作 | 后果 |
|---|---|
| 把 BOOT0 的线拔掉(悬空) | 板载 10K 上拉会把它变成 1,可能进 SRAM 导致连不上 |
| 双击 MODE 让灯变成正常亮 | 那是「开启自动下载」,给 CH340 串口下载用的;ST-Link 用这个状态容易出问题 |
一句话:ST-Link 用「灯暗亮」;串口下载才用「灯正常亮」。
#四、先认识 MODE 键和 ASP
洋桃1号核心板上有一个 MODE 按键和一个 ASP 指示灯。ASP 是板载的自动下载芯片,通过双路继电器控制电源与 BOOT 引脚。
| 操作 | 功能 | ASP 指示灯表现 |
|---|---|---|
| 单击 | 开关开发板电源 | 亮 = 电源开;灭 = 电源关 |
| 双击 | 开关自动下载功能 | 正常亮度 = 开启;较暗亮度 = 关闭 |
| 长按 | 切换下载模式 | 闪 1 次 = Flash ISP 模式;闪 2 次 = RAM ISP 模式 |
出厂默认:Flash ISP + 自动下载开启。
日常两种用法:
- 用 CH340 串口下载 → 双击打开自动下载(灯正常亮)
- 用 ST-Link 烧录/调试 → 双击关闭自动下载(灯暗亮)+ 长按至闪 2 次 + BOOT0 接 GND
#五、核心原理:启动模式决定 SWD 能否连接
STM32F103 上电时根据 BOOT0 / BOOT1 两个引脚选择启动区域。SWD 能不能连,取决于芯片当时跑在哪里:
| BOOT0 | BOOT1 | 启动区域 | SWD 连接 | 实测证据 |
|---|---|---|---|---|
| 0 | 任意 | 主闪存(用户程序) | ✅ 三种模式全通 | PC = 0x08000F22(Flash 内) |
| 1 | 0 | 系统 Bootloader | ✅ 三种模式全通 | PC = 0x1FFFF3B2(Bootloader) |
| 1 | 1 | 内置 SRAM | ❌ 连不上(内核跑飞) | ST 官方定义 + 历史现象 |
实测方式:
STM32_Programmer_CLI -c "port=SWD",分别用普通模式 / HotPlug / Under Reset 各测一次,全部返回Device ID 0x410。
为什么 SRAM 启动连不上:SRAM 里没有有效程序,内核取指就异常/跑飞,调试握手无法完成。而 Bootloader 是 ST 出厂固化的正常程序,运行期间 SWD 完全可用。
一句话记:不是「SWD 坏了」,而是「芯片当时跑的东西无法响应调试器」。
#六、三个必须记住的实测事实
#6.1 BOOT0 悬空 = 被上拉成 1
洋桃核心板的 BOOT0 有一颗板载 10K 上拉电阻到 3.3V。
实测:BOOT0 悬空状态下上电,读回
PC = 0x1FFFF3B2(系统 Bootloader),GPIOB_IDR = 0x00000000(GPIO 从未初始化,说明用户程序没运行)
—— 证明悬空时 BOOT0 实际为高电平。
所以「把 BOOT0 的线拔掉」不等于低电平,而是 1。 这是最容易踩的坑。
#6.2 BOOT1 = PB2 = 摇杆按键引脚
STM32F103 的 BOOT1 复用在 PB2,而洋桃1号的摇杆按键正好接在 PB2 上(按下接地)。
实测:摇杆模块插着、程序正常运行时读
GPIOB_IDR,PB2 为 0,
说明该引脚被外部电路拉低。「摇杆插着 = BOOT1=1」这个想当然的说法并不成立,
实际电平要用寄存器读数确认,不能靠猜。
排查技巧:接上调试器后读 GPIOB_IDR(地址 0x40010C08)的 bit2 即可知道 PB2 真实电平。
#6.3 NRST 不是必需,但很有价值
接上 NRST(ST-Link 的 RST → 板子 NRST)后,可以使用 connect under reset 模式:
连接时先把 NRST 拉低 → 内核进入复位态、用户程序暂停 → 此时建立 SWD 连接 → 再释放复位 → 烧录。
这招能对付「程序跑飞」「程序把 SWD 引脚配成普通 IO」「低功耗模式」等异常情况,是保险措施,不是日常必需。
#七、推荐做法
最稳:BOOT0 明确接 GND,之后什么都不用拨。
| 引脚 | 接法 |
|---|---|
| BOOT0 | 接 GND(固定不动) |
| SWDIO | ST-Link SWDIO → PA13 |
| SWCLK | ST-Link SWCLK → PA14 |
| GND | 共地 |
| 3.3V | ST-Link 3.3V → 板子 3.3V(VREF) |
| NRST(可选) | ST-Link RST → 板子 NRST |
BOOT0=0 时芯片始终从 Flash 启动:
- 程序正常运行
- SWD 随时可连、可烧、可调试(普通模式即可,不依赖 NRST)
- 烧录后自动复位运行
#八、连不上时的排障顺序
现象:Error: Unable to get core ID / No STM32 target found,但设备电压显示正常(约 3.2 V)。
| 顺序 | 检查项 | 处理 |
|---|---|---|
| 1 | ASP 灯是否亮 | 不亮 → 单击 MODE 开机 |
| 2 | BOOT0 是否悬空 | 明确接 GND(或接 3.3V),绝不能悬空 |
| 3 | 是否处于 SRAM 启动 | 让 BOOT1=0(拔掉摇杆模块 / 按住摇杆键)+ 断电上电 |
| 4 | SWD 四线是否插实 | 杜邦线最容易松,重点查 SWDIO / SWCLK / GND |
| 5 | 报 DEV_USB_COMM_ERR | 拔插一次 ST-Link 的 USB 线(克隆版常见现象) |
| 6 | 以上都不行 | 接上 NRST,用 connect under reset 模式强连 |
复位模式强连脚本:
powershellpowershell -ExecutionPolicy Bypass -File D:\stm32_env\scripts\flash.ps1 -ProjectDir <工程> -UnderReset
#九、串口(CH340)下载注意事项
- 进系统 Bootloader 需要 BOOT0=1 且 BOOT1=0
- 双击 MODE 打开自动下载(ASP 灯正常亮)后,FlyMcu 会自动完成 BOOT0 时序与复位,不用手动拨跳线
- 下载完成后 ASP 自动切回运行模式;若是手动拨的 BOOT0,记得拨回 GND 并断电重新上电
- 若报
无法打开串口/Not Support Setting(bps/byte size etc),那是 CH340 驱动/串口层的问题,与 BOOT 模式无关,先修驱动(换数据线 / 换 USB 口 / 重装 CH341SER 驱动)
#十、踩坑清单
- 「灯亮着」不等于「电源开着」:ASP 灯有「正常亮」和「较暗」两档,暗亮代表自动下载已关(ST-Link 场景正确),不是故障。
- 改了 BOOT 电平不断电等于没改:BOOT0/BOOT1 是上电瞬间采样的,改完跳线必须断电重上电才生效。
- BOOT0 悬空 = 1,不是「不确定」:板载 10K 上拉决定悬空必然为高电平,芯片会直接进系统 Bootloader,用户程序根本不跑。以为「拔掉线就是低电平」是最常见的误判。
- PB2 的电平必须实测,别顺着「外设上拉」的直觉猜:摇杆按键按下接地,实测插入摇杆模块时 PB2 = 0。读
GPIOB_IDR(0x40010C08)的 bit2 才是真相。 - 「长按闪 2 次 = 连不上元凶」是旧结论,已推翻:长按到「闪 2 次」(RAM ISP 档)改变的只是 ASP 对 BOOT1 的处理;只要 BOOT0 已接 GND 固定为 0,芯片仍然从 Flash 启动,BOOT1 是无关项,SWD 照连不误。真正致命的是 BOOT0 悬空被上拉成 1,再叠加 BOOT1=1 → 进 SRAM。所以 ST-Link 的正确档位恰恰是 灯暗亮 + 闪 2 次 + BOOT0 接 GND。
- 自动下载开着时程序会反复复位:用 ST-Link 调试若没关自动下载,ASP 会不停抢 BOOT0,表现为程序跑不起来、调试器频繁断连。
#11、结论:一句话记住
txtBOOT0 = 0 → 跑用户程序 SWD ✅ ← 日常保持这个
BOOT0 = 1, BOOT1 = 0 → 系统 Bootloader SWD ✅ (串口下载用)
BOOT0 = 1, BOOT1 = 1 → 内置 SRAM SWD ❌ ← 「连不上」的元凶
BOOT0 悬空 = 1(板载 10K 上拉),切记不要悬空!
NRST 接了更保险(可用 connect under reset),但不是必需。
日常三件套:灯暗亮 + 闪 2 次 + BOOT0 接 GND。
一句话版:连不上先看灯亮不亮,再按「正确操作方式」三步设置,最后断电重新上电。
#12、参考库/链接
- 摇杆 ADC 工程(含 PB2=BOOT1 踩坑实录):/kb/stm32/input/joystick-dual-axis-adc
- 工具箱脚本:
D:\stm32_env\scripts\(flash.ps1 支持-UnderReset复位模式强连) - STM32F103 参考手册(RM0008):Boot modes 章节
#13、更新日志
| 日期 | 类型 | 更新内容 |
|---|---|---|
| 2026-09-11 | 修改 | 新增「正确操作方式」三步速查(灯暗亮 + 闪 2 次 + BOOT0 接 GND);推翻旧结论——「长按闪 2 次 = 连不上元凶」作废(BOOT0=GND 时 BOOT1 为无关项);同步修正结论卡片、表头口诀与踩坑清单第 5 条;标题去掉手写编号(网站会自动编号,原先渲染成「四、一、先认识 MODE 键」双重编号) |
| --- | --- | --- |
| 2026-09-11 | 修改 | 按最新实测结论重写正文:① BOOT0 悬空 = 板载 10K 上拉为 1(不是「不确定」);② 摇杆按键实测 PB2=0,「外设上拉让 BOOT1=1」为误判,电平要读 GPIOB_IDR 确认;③ 日常推荐改为 BOOT0 明确接 GND 固定不动(原「BOOT0 不接线」写法作废);④ 排障顺序扩为 6 步,补 DEV_USB_COMM_ERR 与 connect under reset 强连;⑤ 新增 CH340 串口下载章节与结论卡片 |
| 2026-09-10 | 新增 | 首次建档 |