一篇文章讲解清楚ARM9芯片启动流程
SAM9X60 ARM9 boot启动流程关键词介绍:
- 第一级bootloader - 也叫boot ROM,是集成在MPU内部的ROM里面
它的主要功能是执行对MPU的基本初始化和配置,查找并将第二级bootloader从外部NVM中读取出来并放到MPU内部的SRAM.
可以让MPU强制停留在第一级bootloader(boot ROM)阶段,然后配合Microchip提供的SAM-BA在系统编程工具去完成NVM(NOR、NAND、eMMC/SD卡)的擦写、编程写入等操作,或者配置MPU启动配置字,让MPU工作在所需要设定的模式(比如默认从QSPI0或者QSPI1启动,更改管脚默认映射关系等)。
- NVM - Non-Volatile Memory 非易失存储器,指MPU外部用来存储用户代码的各种闪存设备,可以是SPI/QSPI/并行 Nor Flash、Nand Flash或者eMMC/SD卡等。
- 第二级bootloader - 也是常提到的at91bootstrap,是Microchip原厂提供的,用于在MPU上电后运行的第一级bootloader(boot ROM)后去加载并继续运行的一小段代码,完成MPU的进一步初始化和配置,然后去外部NVM中寻找并加载第三级的用户代码(可以是RTOS代码或者U-boot、或Linux内核)到外部DRAM中。
- 第三级bootloader - 也是大家熟悉的U-Boot,它是一个开源的bootloader,通常用来配置和初始化外设,加载和运行Linux OS,Microchip有专门维护针对其处理器MPU的U-Boot代码并放在github上供下载 - https://github.com/linux4microchip/。
SAM9X60 MPU boot启动流程详解:
1. 处理器(MPU)复位
系统上电后,SAM9X60 MPU开始执行boot启动流程,由RSTC(Reset Controller)负责处理MPU所有的复位相关事情。 包括下图所示的各种机制产生的复位事件输入:
- VDDBU POR - VDD Backup备份电源POR(Power On Reset上电复位)
- VDDIN33 POR - VDD 3.3V输入电源POR(Power On Reset上电复位)
- VDDCORE POR - VDD CORE内核电源POR(Power On Reset上电复位)
- NRST - 外部复位管脚低电平输入
并根据设定的机制来决定是否输出以下事件:- RSTC Interrupt - 复位事件输出中断(可以在低功耗模式下作为MPU唤醒源)
- Processor and Peripheral Reset - 执行处理器和外设的复位操作

复位状态控制器(Reset State Manager)开始根据优先级处理各种复位事件源。复位事件源和其对应的优先级如下图:
| 优先级 | 复位状态 | 复位在什么情况下产生时 |
|---|---|---|
| 1 | 通用状态 | 检测到VDDBU POR |
| 2 | 退出Backup模式 | 当设备从Backup模式退出 |
| 3 | 32.768KHz时钟出错 | PMC电路监测到32.768K输入失效 |
| 4 | 看门狗超时 | 看门狗超时错误发生 |
| 5 | 软复位 | 往RSTC_CR(复位控制寄存器)写软复位操作 |
| 6 | 用户NRST复位管脚检测到低电平 | NRST管脚检测到低电平输入且此时RSTC_MR(复位控制管理寄存器)的URSTEN=1(用户复位输入管脚使能) |

RSTC状态寄存器会记录上次的复位源,复位后MPU的程序计数器PC会被复位成0x0000 0000并开始执行集成在芯片内部的第一级bootloader(boot ROM):

2. 复位后运行MPU内部集成的ROM CODE
系统复位后,SAM9X60 MPU首先运行内部的第一级bootloader - ROM CODE
ROM CODE将完成下述初始化操作:
- 初始化处理器CPU Clock和Master Clock.
第一级bootloader首先会初始化处理器时钟(Processor Clock - CPU_CLK)和主时钟(Master Clock - MCK),主RC Oscillator(时钟发生器模块)会通过快速启动来唤醒整个系统,这时主时钟MAINCK这块也是使用RC Oscillator,由PMC(Power Management Controller)负责将MAINCK作为CPU Clock(CPU_CLK)和Master Clock(MCK).

紧接着第一级bootloader会初始化PLLA锁相环,将系统频率倍频到396MHz并等待PLLA倍频后的频率能够稳定工作,此时PMC里的处理器时钟控制器(Processor Clock Controller)会选择PLLA的输出作为CPU Clock(CPU_CLK)和Master Clock(MCK)的输入时钟源.

最后第一级bootloader会读取启动配置字(Boot Configuration Packet),它是存储在MPU内部的一块OTP(One Time Programmable)区域,这块区域的配置可以用于控制以下内容:
- 禁止或者使能串口UART或者DBGU端口(看配置字的设定)
- 禁止或者使能JTAG口(看配置字的设定)
- 设定连接外部NVM的IO采用哪组配置组合
- 禁止或者使能化外部NVM(Non-Volatile Memory)控制器接口.
- 禁止或者使能SAM-BA Monitor(在系统编程应用)
如果在OTP区域没有写入配置字,则第一级bootloader会使用默认配置:
- 配置DBGU(115200波特率)端口用于串口调试和SAM-BA通信
- 使能JTAG口用于调试
- 初始化NVM接口并按照先后顺序从以下NVM启动:
- SDMMC0(IOSET0).
- SDMMC1(IOSET0).
- QSPI0(IOSET0).
- SPI0(IOSET0).
- NAND0(IOSET0).
- 使能SAM-BA Monitor(运行在系统编程应用)
- 例如第一级bootloader首先会根据IOSET0的配置尝试初始化SDMMC0接口,如果没有通过SDMMC0接口读取到有效的第二级bootloader,则会将SDMMC0接口的配置还原成原来的配置,接下来尝试从SDMMC1寻找有效的第二级bootloader,后面以此类推。
3. 从外部存储NVM中寻找到第二级bootloader - at91bootstrap:
- 加载at91bootstrap到芯片内部SRAM中运行.
- 将芯片内部SRAM映射到地址0x0.
- 复位PC的值到0x0并执行跳转

前面提到的寻找有效的第二级bootloader,包括以下的操作:
- ARM中断向量表的检测 - 适合于Nand、SPI/QSPI Flash启动
- boot.bin文件的检测 - 适合eMMC/SD卡启动,寻找FAT分区里的boot.bin文件

ARM中断向量表的检测是指将测中断向量表第6个位置,在ARM系统里面默认第6个中断向量表为预留且默认为0,在Microchip MPU中则利用这个位置来存储第二级bootloader文件大小信息。也就是生成的第二级bootloader烧录.bin文件,从地址0开始存放的都是ARM中断向量表入口地址,第6个中断向量表在at91bootstrap编译时就插入.bin文件大小信息。


第一级的bootloader(boot ROM)在依次扫描外部NVM的时候,会在读取存储在NVM里面中断向量表内容时检查存储第6个中断向量表的内容,如果该位置含有有效内容(非0xFF且值小于内部SRAM的大小),则认为找到了有效的第二级bootloader。

同样查找到FAT分区里的boot.bin文件,也需要判断.bin文件应小于内部SRAM的大小。

4. 如果没找到at91bootstrap则转为SAM-BA Monitor模式等待sam-ba命令连接
JTAG接口在执行第一级ROM BOOT的时候是禁止掉的,在以下条件下重新被使能:
- 如果在外部NVM中找到at91bootstrap,在完成at91bootstrap加载、SRAM的重映射、PC重新复位并设置为0且开始跳转执行。
- 如果在外部NVM中没有找到at91bootstrap,则转为SAM-BA Monitor模式,禁止访问内部ROM

其他注意事项:
- SAM-BA Monitor模式默认是启用的,除非在OTP配置区域中禁止它
- 如果SAM-BA Monitor只使用串口,则不需要用到外部的晶振
- 如果SAM-BA Monitor还需要使用USB口,则需要接上外部的晶振
5. 第二级bootloader - at91bootstrap
- at91bootstrap是一个开放的用户程序,支持功能订制,具备高度的灵活性
- at91bootstrap存储在外部的NVM中,需要被加载到MPU内部SRAM运行
- 加载后SRAM地址会重映射到0、PC重新复位并设置为0且开始跳转执行。
6. 第三级bootloader - U-Boot
- 关于U-Boot的作用就不在这里多做介绍
相关文章:
一篇文章讲解清楚ARM9芯片启动流程
SAM9X60 ARM9 boot启动流程关键词介绍: 第一级bootloader - 也叫boot ROM,是集成在MPU内部的ROM里面 它的主要功能是执行对MPU的基本初始化和配置,查找并将第二级bootloader从外部NVM中读取出来并放到MPU内部的SRAM. 可以让MPU强制停留在第一…...
setlocale()的参数,“zh_CN.UTF-8“, “chs“, “chinese-simplified“的差异。
在 C/C 中,setlocale() 函数的参数 zh_CN.UTF-8、chs 和 chinese-simplified 均用于设置中文简体环境,但它们的语义、平台支持和编码行为存在显著差异: 1. zh_CN.UTF-8(推荐) 含义: zh_CN: 中文&…...
Python项目-基于Django的在线教育平台开发
1. 项目概述 在线教育平台已成为现代教育的重要组成部分,特别是在后疫情时代,远程学习的需求显著增加。本文将详细介绍如何使用Python的Django框架开发一个功能完善的在线教育平台,包括系统设计、核心功能实现以及部署上线等关键环节。 本项…...
【2025】Electron + React 架构筑基——从零到一的跨平台开发
引言 源代码仓库: Github仓库【electron_git】 你是否厌倦了在命令行中反复输入git status,却依然无法直观看到文件变化? 是否羡慕VS Code的丝滑Git集成,却苦恼于无法定制自己的专属工具? 本专栏将为你打开一扇新的…...
Vue3实战学习(IDEA中打开、启动与搭建Vue3工程极简脚手架教程(2025超详细教程)、Windows系统命令行启动Vue3工程)(2)
目录 一、命令行中重新启动已搭建好的Vue3工程。(快速上手) (0)Windows环境下使用命令行从零到一手动搭建Vue3工程教程。 (1)首先找到已建Vue3工程的目录。 (2)无需再下载依赖包,直接执行npm ru…...
【ArcGIS】地理坐标系
文章目录 一、坐标系理论体系深度解析1.1 地球形态的数学表达演进史1.1.1 地球曲率的认知变化1.1.2 参考椭球体参数对比表 1.2 地理坐标系的三维密码1.2.1 经纬度的本质1.2.2 大地基准面(Datum)的奥秘 1.3 投影坐标系:平面世界的诞生1.3.1 投…...
Redis- 切片集群
切片集群 切片集群什么是Redis Cluster吗?为什么需要切片集群?Redis Cluster的数据分片机制是怎样的?哈希槽的算法是什么基本算法流程 待填坑 切片集群 什么是Redis Cluster吗?为什么需要切片集群? Redis Cluster是R…...
Oxidized收集H3C交换机网络配置报错,not matching configured prompt (?-mix:^(<CD>)$)
背景:问题如上标题,H3C所有交换机配置的model都是comware 解决方案: 1、找到compare.rb [rootoxidized model]# pwd /usr/local/lib/ruby/gems/3.1.0/gems/oxidized-0.29.1/lib/oxidized/model [rootoxidized model]# ll comware.rb -rw-r--…...
力扣146 - LRU缓存
视频讲解 哈希 双向链表 为什么要用双向链表? 快速删除节点(O(1)) 如果是单链表的话,删除一个节点时,需要从头遍历,找到前驱节点,才能修改 prev->next,导致 O(n)…...
单例模式:确保一个类只有一个实例
目录 引言 1. 单例模式的核心思想 2. 单例模式的实现方式 2.1 饿汉式单例 2.2 懒汉式单例 2.3 线程安全的懒汉式单例 2.4 双重检查锁定(Double-Checked Locking) 2.5 静态内部类实现单例 2.6 枚举实现单例 3. 单例模式的使用场景 4. 单例模式…...
doris: SQL Server
Doris JDBC Catalog 支持通过标准 JDBC 接口连接 SQL Server 数据库。本文档介绍如何配置 SQL Server 数据库连接。 使用须知 要连接到 SQL Server 数据库,您需要 SQL Server 2012 或更高版本,或 Azure SQL 数据库。 SQL Server 数据库的 JDBC 驱动…...
【ubuntu20】--- 搭建 gerrit 最新最详细
在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。 【ubuntu20】--- 搭建 gerrit 最新最详细…...
RtlLookupAtomInAtomTable函数分析之RtlpAtomMapAtomToHandleEntry函数的作用是验证其正确性
第一部分: NTSTATUS RtlLookupAtomInAtomTable( IN PVOID AtomTableHandle, IN PWSTR AtomName, OUT PRTL_ATOM Atom OPTIONAL ) { NTSTATUS Status; PRTL_ATOM_TABLE p (PRTL_ATOM_TABLE)AtomTableHandle; PRTL_ATOM_TABLE_ENTRY a; …...
Python----数据分析(Matplotlib五:pyplot的其他函数,Figure的其他函数, GridSpec)
一、pyplot的其他函数 1.1、xlabel 在matplotlib中, plt.xlabel() 函数用于为当前活动的坐标轴(Axes)设置x轴的 标签。当你想要标识x轴代表的数据或单位时,这个函数非常有用。 plt.xlabel(xlabel text) 1.2、ylabel 在matplotl…...
C语言——链表
大神文献:https://blog.csdn.net/weixin_73588765/article/details/128356985 目录 一、链表概念 1. 什么是链表? 1.1 链表的构成 2. 链表和数组的区别 数组的特点: 链表的特点: 二者对比: 二…...
使用免费IP数据库离线查询IP归属地
一、准备工作 1.下载免费IP数据库 首先,访问 MaxMind官网(https://www.maxmind.com/en/home)如果你还没有MaxMind账号,可以通过此链接地址(https://www.maxmind.com/en/geolite2/signup)进行账号注册&…...
MySQL(单表)知识点
文章目录 1.数据库的概念2.下载并配置MySQL2.1初始化MySQL的数据2.2注册MYSQL服务2.3启动MYSQL服务2.4修改账户默认密码2.5登录MYSQL2.6卸载MYSQL 3.MYSQL数据模型3.1连接数据库 4.SQL简介4.1SQL的通用语法4.2SQL语句的分类4.3DDL语句4.3.1数据库4.3.2表(创建,查询,修改,删除)4…...
1.15-16-17-18迭代器与生成器,函数,数据结构,模块
目录 15,Python3 迭代器与生成器15-1 迭代器15-1-1 基础知识15-1-2 迭代器与for循环工作原理 15-2 生成器(本质就是迭代器)15-2-1 yield 表达式15-2-2 三元表达式15-2-3 列表生成式15-2-4 其他生成器(——没有元祖生成式——&…...
window下的docker内使用gpu
Windows 上使用 Docker GPU需要进行一系列的配置和步骤。这是因为 Docker 在 Windows 上的运行环境与 Linux 有所不同,需要借助 WSL 2(Windows Subsystem for Linux 2)和 NVIDIA Container Toolkit 来实现 GPU 的支持。以下是详细的流程: 一、环境准备 1.系统要求 Window…...
CVE-2025-0392:JeeWMS graphReportController.do接口SQL注入漏洞复现
文章目录 CVE-2025-0392:JeeWMS graphReportController.do接口SQL注入漏洞复现0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.构造POC2.复现CVE-2025-0392:JeeWMS graphReportController.do接口SQL注入漏洞复现 0x01 前言 免责声明:请勿利用文章内的相…...
DR和BDR的选举规则
在 OSPF(开放最短路径优先)协议中,DR(Designated Router,指定路由器) 和 BDR(Backup Designated Router,备份指定路由器) 的选举是为了在广播型网络(如以太网…...
Java 大视界 -- Java 大数据在智能家居能源管理与节能优化中的应用(120)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
第七课:Python反爬攻防战:Headers/IP代理与验证码
在爬虫开发过程中,反爬虫机制成为了我们必须面对的挑战。本文将深入探讨Python爬虫中常见的反爬机制,并详细解析如何通过随机User-Agent生成、代理IP池搭建以及验证码识别来应对这些反爬策略。文章将包含完整的示例代码,帮助读者更好地理解和…...
MySql的安装及数据库的基本操作命令
1.MySQL的安装 1.1进入MySQL官方网站 1.2点击下载 1.3下拉选择MySQL社区版 1.4选择你需要下载的版本及其安装的系统和下载方式 直接安装以及压缩包 建议选择8.4.4LST LST表明此版本为长期支持版 新手建议选择红框勾选的安装方式 1.5 安装包下载完毕之后点击安装 2.数据库…...
VsCode导入时选择相对路径
自动导入时总是以db://开头了,而我们通常需要的是相对路径,对VsCode进行如下设置: 打开 VSCode 设置: 使用快捷键 Ctrl ,(Windows/Linux)或 Cmd ,(Mac)。 或者在菜单栏中选择 …...
计算机视觉|3D卷积网络VoxelNet:点云检测的革新力量
一、引言 在科技快速发展的背景下,3D 目标检测技术在自动驾驶和机器人领域中具有重要作用。 在自动驾驶领域,车辆需实时、准确感知周围环境中的目标物体,如行人、车辆、交通标志和障碍物等。只有精确检测这些目标的位置、姿态和类别&#x…...
创新监管,保障生产安全
在现代工业生产中,电气焊作业是不可或缺的一环,但同时也伴随着一定的安全风险。为了提高焊接作业的安全性,迪格特电子科技有限公司开发了电气焊安全作业管理平台,该平台通过智能化监管系统,实现了对焊机联网的全面监管…...
深入解析 C# 中的泛型:概念、用法与最佳实践
C# 中的 泛型(Generics) 是一种强大的编程特性,允许开发者在不预先指定具体数据类型的情况下编写代码。通过泛型,C# 能够让我们编写更灵活、可重用、类型安全且性能优良的代码。泛型广泛应用于类、方法、接口、委托、集合等多个方…...
AI数字人源码开发---SaaS化源码部署+PC+小程序一体化
#数字人#数字人分身#123数字人#数字人分身源码部署搭建 AI数字人源码开发步骤 确定功能需求:首先确定需要实现的功能和特性,包括语音识别、自然语言处理、人脸识别等功能。这些功能将构成AI数字人的核心功能。 开发AI数字人源码:使用合适的…...
Mysql-经典故障案例(1)-主从同步由于主键问题引发的故障
故障报错 Could not execute Write_rows event on table test.users; Duplicate entry 3 for key PRIMARY, Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the events master log mysql-bin.000031, end_log_pos 329 这是由于从库存在与主库相同主键值,…...
