
BOOT 启动顺序芯片的 “启动顺序”就像我们给电脑开机后从 “黑屏断电状态” 到 “进入系统能运行软件” 的全过程 ——RP2040 上电接通电源或复位后不会直接运行我们写的程序而是会先执行芯片自带的 “引导流程”这个流程分为硬件层面的准备工作和软件层面的引导程序执行两步。而 bootrom引导 ROM 是内置在芯片 16kB ROM 中的核心引导代码之前我们讲过 ROM 是芯片出厂固化的存储bootrom 就是其中的 “启动工具包”是整个启动流程的核心执行者。这里启动可分为以下两个环节硬件控制 hardware controlled在 bootrom 引导程序执行前芯片进行的工作bootrom 引导程序是内置在芯片中的软件无需软件参与属于芯片硬件的自我初始化处理器控制 processor controlled执行 bootrom 引导程序属于软件引导程序的执行。1.硬件控制的引导顺序芯片通电运行 RUN 引脚置位RUN 引脚是芯片的 “电源启动开关”“置位” 就是把这个开关拨到 “开启” 状态告诉芯片 “电源已经接上可以开始启动了”芯片上电压调压器等待数字芯片电源DVDD稳定电压调压器是给芯片内部 “数字电路” 供电的 “稳压器”类似手机充电器的稳压功能DVDD 是数字电路的专用电源这一步是等 DVDD 的电压稳定在安全值比如 1.8V避免电压忽高忽低烧坏芯片内部电路相当于电脑开机时电源要等输出电压稳定再给主板供电。通电状态机已启动通电状态机是芯片里负责按顺序完成硬件准备的自动电路它会依次完成以下工作ROSC(环形振荡器)已启动为时钟发生器提供一个时钟源clk_sys 和 clk_ref 现在以相对较低的频率运行通常为 6.5MHzROSC 是芯片的 “初始时钟源”相当于闹钟的 “发条”启动后会产生基础的 “时钟信号”芯片工作的 “心跳节奏”clk_sys 是芯片的 “系统主时钟”clk_ref 是 “参考时钟”开始用低频6.5MHz运行是为了让硬件启动更安全、稳定后续会根据需求提速。复位控制器、XIP 就地执行硬件、存储器、总线结构和处理器子系统均退出复位这些硬件模块在断电时处于 “复位状态”相当于 “休眠锁定”“退出复位” 就是唤醒并解锁这些模块让它们进入 “可以工作的状态” 比如存储器准备好存数据、总线准备好传数据、处理器核心准备好执行程序。处理器核心 0 和核心 1 开始执行引导程序所有硬件准备完成后两个处理器核心被唤醒开始执行芯片内置的 bootrom 引导程序硬件控制的引导流程到此结束。2.处理器控制的引导顺序处理器控制的引导顺序是bootrom 引导程序开始执行后的 “任务分配 启动方式选择流程”此时硬件已经准备好bootrom芯片里的 “启动管理员”会先给两个核心分工再判断 “从哪里加载用户程序”要么从外部 Flash 读程序要么进入 USB 模式等用户烧录程序整个流程是通过 “判断各种硬件信号 执行预设逻辑” 自动完成的。图2.21 RP2040 处理器控制引导顺序流程图第一部分是双核的初始分工流程图左侧两个核心Core0、Core1都进入 bootrom 后先完成 “职责划分”“Which core am I”我是哪个核心两个核心同时运行但通过之前讲的 “CPUID 寄存器” 区分身份如果是 Core1进入 “Sleep until given entry point”休眠等 Core0 给它分配任务如果是 Core0继续执行后续的启动逻辑Core0 是 “主启动核心”。“PoR rescue flag set”上电复位救援标志是否开启这是芯片的 “故障救援开关”如果这个标志开了说明之前启动失败过Core0 会 “Clear flag and halt”清除标志并暂停等待人工排查问题。“Watchdog boot-to-SRAM set”看门狗是否要求从 SRAM 启动看门狗是芯片的 “故障重启工具”如果看门狗要求从 SRAM 启动Core0 会 “Set SP and jump to entry point”设置栈指针 SP跳转到 SRAM 里的程序入口这是 “紧急启动模式”通常用于调试。“100us delay (pullup on flash CSn)”延迟 100 微秒给 Flash 的 CSn 引脚加上拉电阻“CSn” 是外部 Flash 的 “片选引脚”相当于 Flash 的 “开关”上拉电阻是让这个引脚先处于 “高电平”默认不选中 Flash给 Flash 留足启动时间。“Read flash CSn”读取 Flash 的 CSn 引脚电平通过 CSn 引脚的电平判断 “有没有外部 Flash”如果是 High高电平说明 Flash 存在走 “Flash 启动” 的流程跳转到流程图右侧如果是Low低电平说明没有 Flash走 “USB 启动” 的流程后续会进入 USB 模式等用户通过 USB 烧录程序。第二部分是启动方式选择流程图右侧Core0 确定 “Flash 存在” 后开始尝试从 Flash 启动否则进入 USB 模式分支 1尝试 Flash 启动“Configure SSI and connect to pads”配置 SSI 模块连接到引脚SSI 是控制 QSPI 接口的模块之前讲过这一步是让芯片和外部 Flash 建立通信连接。“Load 256 bytes from flash”从 Flash 读取 256 字节数据先读 Flash 里的 “启动头数据”用来验证 Flash 里的程序是否有效。“Checksum pass”校验和是否通过“校验和” 是 Flash 程序的 “身份证”相当于给程序算个 “数字指纹”如果通过Y说明 Flash 里的程序没问题进入 “Enter flash second stage”执行 Flash 里的二级启动程序最终加载用户程序如果不通过N继续判断 “启动时间是否超过 0.5 秒”。“Longer than 0.5s since boot”启动时间超过 0.5 秒了吗如果没超过调整 Flash 的通信参数CPOL/CPHA 是 SPI 的 “时钟极性 / 相位”相当于 “调整 Flash 的通信协议”再延迟 100 微秒重新尝试读 Flash如果超过说明 Flash 启动失败切换到 “USB 启动” 流程。分支 2USB 启动Flash 启动失败后“Start crystal oscillator”启动晶振晶振是更精准的时钟源USB 通信需要稳定的时钟所以先启动晶振。“Crystal present”晶振存在吗如果晶振不存在Core0 “Halts”暂停启动失败如果晶振存在继续下一步。“Start PLLs. Sys, USB clocked at 48 MHz”启动锁相环 PLL把系统时钟、USB 时钟调到 48MHzPLL 是 “时钟加速器”把晶振的低频时钟升到 USB 需要的 48MHzUSB 通信的标准时钟。“Enter USB device mode bootcode”进入 USB 设备模式的引导程序此时芯片会变成 “USB 设备”比如电脑识别的 “U 盘”用户可以通过 USB 把程序烧录到 Flash 或 SRAM 里。