一篇文章讲解清楚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模式退出
332.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启动:
    1. SDMMC0(IOSET0).
    2. SDMMC1(IOSET0).
    3. QSPI0(IOSET0).
    4. SPI0(IOSET0).
    5. NAND0(IOSET0).
    6. 使能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个中断向量表在使用SAM-BA工具烧录的时候插入.bin文件大小信息。

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

QSPI Flash烧录文件存储示范样例

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

SD卡烧录后文件存储示范样例

4. 如果没找到at91bootstrap则转为SAM-BA Monitor模式等待sam-ba命令连接

JTAG接口在执行第一级ROM BOOT的时候是禁止掉的,在以下条件下重新被使能:

  1. 如果在外部NVM中找到at91bootstrap,在完成at91bootstrap加载、SRAM的重映射、PC重新复位并设置为0且开始跳转执行。
  2. 如果在外部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的作用就不在这里多做介绍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/981760.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaSE-6】数组的定义与使用

1、数组的基本概念 1.1、为什么使用数组 为了方便将同一种数据类型的数据进行存储。 1.2、什么是数组 指的是一种容器,可以同来存储同种数据类型的多个值。但是数组容器在存储数据的时候,需要结合隐式转换考虑。如:定义一个int类型的数组…

基于eRDMA实测DeepSeek开源的3FS

DeepSeek昨天开源了3FS分布式文件系统, 通过180个存储节点提供了 6.6TiB/s的存储性能, 全面支持大模型的训练和推理的KVCache转存以及向量数据库等能力, 每个客户端节点支持40GB/s峰值吞吐用于KVCache查找. 发布后, 我们在阿里云ECS上进行了快速的复现, 并进行了性能测试, ECS…

Linux网络编程(20250301)

网络通信:进行不同主机的进程间通信 解决硬件与软件的互联互通 主机-->交换机-->路由器-->广域网-->路由器-->交换机-->主机 IP地址:区分不同主机 MAC地址:计算机硬件地址 端口号:区分主机上的不同进程 1…

JAVA安全—手搓内存马

前言 最近在学这个内存马,就做一个记录,说实话这个内存马还是有点难度的。 什么是内存马 首先什么是内存马呢,顾名思义就是把木马打进内存中。传统的webshell一旦把文件删除就断开连接了,而Java内存马则不同,它将恶…

HarmonyOS学习第11天:布局秘籍RelativeLayout进阶之路

布局基础:RelativeLayout 初印象 在 HarmonyOS 的界面开发中,布局是构建用户界面的关键环节,它决定了各个组件在屏幕上的位置和排列方式。而 RelativeLayout(相对布局)则是其中一种功能强大且灵活的布局方式&#xff0…

【Bootstrap5】Bootstrap5学习笔记

目的 学完Blazor以后,我自己用这个写了一个小工具,但是我发现自己对前端粗浅的认知确实很难把UI层的组件弄出我想要的样子,所以我思来想去决定再把前端知识补一补.记录基于菜鸟教程的Bootstrap5教程,然后有些不清楚的我还补充一些…

【JMeter】JMeter之MQTT压测

文章目录 MQTT概念Jmeter压测MQTTMQTT服务器下载Jmeter MQTT插件测试MQTT测试思路和解决方法 MQTT概念 MQTT是什么 MQTT是用于物联网(IoT)的OASIS标准消息传递协议。它被设计为一种非常轻量级的发布/订阅消息传输,非常适合使用较少的代码占用…

Android U 分屏——SystemUI侧处理

WMShell相关的dump命令 手机分屏启动应用后运行命令:adb shell dumpsys activity service SystemUIService WMShell 我们可以找到其中分屏的部分,如下图所示: 分屏的组成 简图 分屏是由上分屏(SideStage)、下分屏(MainStage)以及分割线组…

一键安装Nginx部署脚本之Linux在线安装Nginx,脚本化自动化执行服务器部署(附执行脚本下载)

相关链接 一键安装Nginx部署脚本之Linux在线安装Nginx一键安装Redis部署脚本之Linux在线安装Redis一键安装Mysql部署脚本之Linux在线安装Mysql一键安装JAVA部署脚本之Linux在线安装JDKXshell客户端免费版无需注册XFtp客户端免费版无需注册 前言 简化服务器部署操作&#xff0…

yum源选要配置华为云的源,阿里云用不了的情况

curl -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo

软考中级-数据库-3.2 数据结构-数组和矩阵

数组 一维数组是长度固定的线性表,数组中的每个数据元素类型相同。n维数组是定长线性表在维数上的扩张,即线性表中的元素又是一个线性表。 例如一维数组a[5][a1,a2,a3,a4,a5] 二维数组a[2][3]是一个2行2列的数组 第一行[a11,a12,a13] 第二行[a21,a22,a23…

微服务组件详解——sentinel

1.启动sentinel: 下载jar sentinel-dashboard-1.8.0.jar 使用以下命令直接运行 jar 包(JDK 版本必须≥ 1.8): java -Dserver.port9999 -jar D:\sentinel-dashboard-1.8.0.jar 控制台访问地址:http://localhost:9999…

网络安全清单

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 自主访问控(DAC:Discretionary Access Control) 自主访问控制(DAC)是一个访问控制服务,其执行一个基于系统实体身份的安全政策和它们的授权来访问系统…

unity学习62,尝试做第一个小游戏项目:flappy bird

目录 学习参考 1 创建1个unity 2D项目 1.1 2D项目模板选择 1.1.1 2D(built-in-Render pipeline) 1.1.2 universe 2D 1.1.3 这次选择 2D(built-in-Render pipeline) 1.2 创建项目 1.2.1 注意点 1.2.2 如果想修改项目名 2 导入美术资源包 2.1 下载一个flappy bird的…

tauri2+typescript+vue+vite+leaflet等的简单联合使用(一)

项目目标 主要的目的是学习tauri。 流程 1、搭建项目 2、简单的在项目使用leaflet 3、打包 准备项目 环境准备 废话不多说,直接开始 需要有准备能运行Rust的环境和Node,对于Rust可以参考下面这位大佬的文章,Node不必细说。 Rust 和…

【FastGPT】如何新增用户修改密码

【FastGPT】如何新增用户&修改密码 摘要查看运行中的容器进入mongo容器登录mongo数据库切换数据库查询用户集合数据新增用户查询团队表数据创建团队查询团队成员集合数据把用户加入团队FastGPT用户密码的加密规则介绍加密算法Java版参考代码&单元测试代码修改密码 摘要…

复试准备日常

实验室目前投了 aiot 这周四 感知计算面试3.5号下午2点开始(面完了他问我有没有项目) 532图像处理实验室(我的项目大多也是图像处理的)(预计下周末)提前到3.4号下午6点 我不在第一批里面 软专不知道要几个 …

HiRT:利用分层机器人Transformer 增强机器人控制

25年2月来自清华、伯克利分校和上海姚期智研究院的论文“HiRT: Enhancing Robotic Control with Hierarchical Robot Transformers”。 大型视觉-语言-动作 (VLA) 模型利用强大的预训练视觉-语言模型 (VLM) 后端,由于其深刻的泛化能力而在机器人控制方面显示出良好…

Netty笔记3:NIO编程

Netty笔记1:线程模型 Netty笔记2:零拷贝 Netty笔记3:NIO编程 Netty笔记4:Epoll Netty笔记5:Netty开发实例 Netty笔记6:Netty组件 Netty笔记7:ChannelPromise通知处理 Netty笔记8&#xf…

MySQL-高级查询

查询处理 排序(默认不是按主键排序的) order by 字段1[,字段2] [asc|desc] 默认是升序排序也可以指定 select 列表中列的序号进行排序如果是多个字段,那么在上一个字段排序完的基础上排序下一个 限制数量 limit 行数&#xff0…