一篇文章讲解清楚ARM9芯片启动流程

ops/2025/3/6 5:56:42/

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的作用就不在这里多做介绍

http://www.ppmy.cn/ops/163515.html

相关文章

计算机网络基础:服务器远程连接管理(Telnet命令)

目录 1. 服务器远程管理 2. 图形化连接 3. Telnet 连接 4. 查看端口 1. 服务器远程管理 两种远程管理:图形化、命令行 远程的条件: 1. 能ping 通 2. 服务器开了远程服务 3. 拥有远程管理权限(组)的用户 2. 图形化连接 图形化…

基于java SSM springboot学生信息管理系统设计和实现

基于java SSM springboot学生信息管理系统设计和实现 🍅 作者主页 网顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统 …

Tomcat原理:HTTP协议与HTTPS协议

一、URL统一资源定位符 在介绍HTTP协议与HTTPS协议之前,我们首先要了解统一资源定位符URL,用来表示从互联网上得到的资源位置和访问这些资源的方法。 (一)表示方法 URL分为以下几个部分:协议://主机地址:端口号//文件…

MetaGPT发布的MGX与Devin深度对比

家人们,搞编程的都知道,工具选对了,效率能翻倍!今天必须给大伙唠唠MetaGPT发布的MGX编程助手和Devin编程助手 。 先看MGX,简直是编程界的王炸!它就像一个超神的虚拟开发团队,一堆智能助手分工明…

在Qt中使用QFont设置字体样式

在Qt中使用QFont设置字体样式的步骤如下: 1. 创建QFont对象 QFont font;2. 设置字体属性 字体家族:使用setFamily()方法,建议提供备选字体。 font.setFamily("Arial, sans-serif"); // 备选通用字体字体大小: 点大小&…

除了合并接口,还有哪些优化 Flask API 的方法?

除了合并接口,还有许多其他方法可以优化 Flask API,以下从性能优化、代码结构优化、安全性优化、错误处理优化等方面详细介绍: 性能优化 1. 使用缓存 内存缓存:可以使用 Flask-Caching 扩展来实现内存缓存,减少对数…

Mayavi一个强大的python库

Mayavi 介绍 Mayavi 是一个用于 Python 的科学数据可视化库,提供了一种便捷的方式来创建复杂的 3D 可视化效果。它基于 VTK(Visualization Toolkit)构建,能够处理各种类型的数据,包括标量、矢量和张量数据,广泛应用于科学研究和数据分析领域。 主要特点 丰富的可视化选…

docker默认网段和宿主机环境冲突时的处理

文章目录 修改 docker0 默认网段场景:处理: 修改docker_gwbridge 默认网段场景:处理第一步:修改docker配置文件第二步:停止docker服务第三步:删除local-kv.db文件第四步: 启动docker 服务验证是否生效&…