news 2026/2/9 9:05:59

Mini2440 启动流程分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Mini2440 启动流程分析

Mini2440是一块非常经典的入门开发板。本文将讲透这张启动图背后的概念。

上电启动

一切始于电平。在 S3C2440 芯片上,有两个特殊的引脚:OM0 和 OM1。当然一般都是用的开关就实现了(图右下角)。

当系统复位(Reset)信号失效的瞬间,芯片内部逻辑会采样这两个引脚的电平状态,从而决定 CPU 的第一条指令从哪里读取。

OM1OM0启动模式解释
00NAND Flash 启动Mini2440 最常用的模式。此时片内 SRAM 被映射到 0 地址。
0116-bit ROM 启动通常指 NOR Flash 启动。NOR Flash 被映射到 0 地址。
1032-bit ROM 启动同上,只是总线宽度不同。
11Test Mode测试模式,一般不用。

核心差异

  • NOR Flash 启动:NOR Flash 像内存一样,支持随机访问,支持片上执行(XIP, eXecute In Place)。CPU 可以直接读取 NOR Flash 里的指令执行。

  • NAND Flash启动:NAND Flash 像硬盘,只能按块访问,不支持 XIP。CPU 无法直接去 NAND 里取指令。这就引出了 S3C2440 最精妙的设计——Steppingstone

什么是 Steppingstone?

S3C2440 SOC芯片内部集成了一块容量极小的SRAM (StaticRAM),大小只有4KB

在官方数据手册中,这块 SRAM 被称为"Steppingstone"。它的作用正如其名——它是系统启动的一块垫脚石。因为 4KB 太小,跑不了操作系统,甚至跑不下完整的 u-boot,但它足够用来完成最基本的硬件初始化和代码搬运。

当你点击“编译”时,工具链(gcc/ld)做了一件至关重要的事情:排座位

通过链接脚本(.lds),start.s被安排在了最前面,main.c紧随其后。假如最终生成的.bin二进制文件结构如下:

  • 0x0000 - 0x0020:start.s的机器码(关看门狗、设栈、跳转)。

  • 0x0020 - 0x0xxx:main.c的机器码(配置寄存器、循环)。

Steppingstone 里的内容就是你通过Makefile或者keil编译生成的bin(axf、hex)文件的前 4KB 数据,说白了就是start.s的内容。

内存映射

这是初学者最容易混淆的地方。ARM CPU 启动时永远只认地址0x00000000。但是,物理上的存储器连接位置是固定的,如何让 CPU 在不同模式下看到不同的东西?答案是地址重映射

场景 A:NOR Flash 启动

  • Bank 0 (nGCS0):连接着外部的 NOR Flash。

  • 映射结果:硬件直接把NOR Flash映射到0x00000000

  • 执行流:CPU 直接从 NOR Flash 读取指令运行。

场景 B:NAND Flash 启动

  • Bank 0 (nGCS0):虽然原理图上可能还连着 NOR Flash(如果有的话),但在逻辑上被断开了。

  • Steppingstone (SRAM):原本只能通过特定内部地址访问,现在被硬件强制映射到了0x00000000

  • 自动拷贝机制

    • 上电复位瞬间,NAND Flash 控制器自动启动。

    • 它自动将 NAND Flash 中的前 4KB 数据拷贝到这块Steppingstone (SRAM)中。

    • 在这个拷贝过程中,CPU 处于复位保持状态(不运行)。

    • 拷贝完成后,CPU 复位释放,开始从0x00000000(也就是 Steppingstone 的起始位置)执行代码。

Bootloader 第一阶段:SRAM

SRAM既然只有 4KB,代码必须极度精简(通常由汇编语言编写,比如keil提供的S3C2440.s)。这 4KB 代码需要在几毫秒内完成以下“规定动作”:

4.1. 关看门狗 (Disable Watchdog)

  • 原因:看门狗默认开启,如果不在规定时间内“喂狗”,它会复位 CPU。启动初期我们没空喂狗,所以必须先把它关掉。

  • 代码:向WTCON寄存器写 0。

4.2. 关中断 (Disable Interrupts)

  • 原因:此时系统刚启动,中断向量表还没建立,堆栈也没准备好。如果来了中断,CPU 跳到乱七八糟的地方就挂了。

  • 代码:操作 CPSR 寄存器屏蔽 IRQ 和 FIQ。

4.3. 初始化系统时钟 (Clock Setup)

  • 原因:外部晶振通常只有 12MHz,CPU 跑得太慢。

  • 动作:配置 PLL (MPLL),将系统主频 (FCLK) 提升到 400MHz(或其他频率),并设置分频系数给外设使用。

4.4. 初始化 SDRAM

  • 这是最关键的一步!

  • Steppingstone 只有 4KB,跑不完后续代码。我们需要启用板载的大容量内存(SDRAM,例如 64MB)。

  • 动作:配置存储管理器(Bank 6 对应的寄存器),设定行/列地址宽度、刷新频率等,让 SDRAM 准备好接收数据。

4.5. 设置栈 (Stack Setup)

  • 原因:后续如果要调用 C 语言函数(或者进行复杂的逻辑跳转),必须有栈空间来保存现场。

  • 动作:将栈指针 SP (r13) 指向 SRAM 的顶端或者刚刚初始化好的 SDRAM 的某块区域。

4.6. 代码搬运

  • 核心逻辑:这 4KB 代码要把自己(完整的 Bootloader)或者操作系统内核,从 NAND Flash 中读出来,搬运到 SDRAM 中。

  • 为什么?因为 NAND Flash 不能直接运行代码,而 4KB SRAM 又太小。

  • 实现:通过读写 NAND Flash 控制器的寄存器(NFCONF,NFCMD,NFADDR,NFDATA),循环读取数据并写入 SDRAM 地址(通常是0x30000000以后)。

4.7. 跳转 (Jump to RAM)

  • 动作:搬运完成后,修改 PC 指针,跳到 SDRAM 中去执行。

  • 指令ldr pc, =0x3000xxxx(使用绝对跳转指令)。

  • 结果:至此,Steppingstone 完成了历史使命,CPU 开始在宽阔的 SDRAM 中通过 u-boot 的第二阶段(C语言部分)继续狂奔。

总结图解

如果你再看一遍 Mini2440 的启动图,脑海中应该有这样一个动态过程:

  1. 上电-> 硬件检测 (NAND模式)。

  2. 硬件动作-> NAND Flash 前 4KB自动复制到内部 SRAM。

  3. 地址映射-> 内部 SRAM 变身为地址 0

  4. CPU 运行-> 运行 SRAM 里的S3C2440.s

  5. 初始化->S3C2440.s初始化外部 SDRAM。

  6. 搬运->S3C2440.s读取 NAND 中剩余的几百 KB 代码到 SDRAM。

  7. 跳转-> PC 指针跳入 SDRAM,Linux 启动之路正式开始。

这就是为什么这块小小的 4KB 区域被称为"Steppingstone"—— 它虽然小,却是连接静态存储(NAND)与动态运行环境(SDRAM)的唯一桥梁。

JLINK 调试

很多开发者使用 JLINK(配合 J-Flash 或 IDE)进行裸机程序调试。你可能会遇到这样的情况:为什么我用 JLINK 直接下载程序到 SDRAM (0x30000000) 会失败?

这需要结合我们上面讲的启动原理来看。

6.1 初始化 SDRAM

回顾第 4.4 节,SDRAM 并不是上电就能用的,它需要配置存储控制器寄存器(设置列地址、刷新率等)之后才能被读写。

  • 正常启动时:Steppingstone 里的S3C2440.s帮我们完成了初始化 SDRAM 的工作。

  • JLINK 调试时:通过 JTAG 连接板子时,CPU 通常处于复位或暂停状态,S3C2440.s还没来得及运行(或者被跳过了)。此时 SDRAM 控制器处于未配置状态,SDRAM 就是一片荒原,根本无法写入数据。

6.2 调试脚本 (Init Script) 的作用

为了解决这个问题,在使用 JLINK调试 S3C2440 时,我们必须挂载一个初始化脚本(keil里是.ini)。

这个脚本的作用就是代替 Steppingstone,通过 JTAG 指令直接操作 CPU 寄存器:

  1. 关看门狗:防止调试一半重启。

  2. 配置时钟:让 CPU 跑快点。

  3. 初始化存储控制器这是最关键的一步!脚本会向 Memory Controller 寄存器写入正确的值,瞬间“点亮” SDRAM。

6.3 调试的标准流程

有了初始化脚本,调试流程就变成了:

  1. 连接 JLINK:CPU 暂停。

  2. 运行初始化脚本:此时 SDRAM 变为可读写状态。

  3. Download:将编译好的程序(.bin.elf)直接下载到 SDRAM(例如0x30000000)。

  4. Set PC:手动将 PC 指针修改为0x30000000

  5. Run:程序开始直接在内存中狂奔。

总结:JLINK 调试其实就是绕过了“NAND -> SRAM”的搬运过程,利用上帝视角(JTAG)手动初始化内存并注入代码。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/7 13:52:57

复制字符串而不是直接赋值指针

复制字符串而不是直接赋值指针 (LeetCode:2418.按身高排序) 1.why?数据独立性: 复制字符串使返回结果与输入数据完全独立 修改返回数组中的字符串不会意外影响原始数据(可移植性) 原始数据被释放…

作者头像 李华
网站建设 2026/2/6 22:31:09

Kotaemon:基于Gradio的RAG文档对话工具安装与配置

Kotaemon:基于Gradio的RAG文档对话工具安装与配置 在企业知识管理日益复杂的今天,如何让AI真正“读懂”内部文档,并以自然语言准确作答,成为智能客服、知识助手等场景的核心挑战。传统的问答系统常因信息孤岛或上下文缺失而表现不…

作者头像 李华
网站建设 2026/2/6 16:20:39

基于Android的大学生校园互帮APP的设计与实现(源码+lw+部署文档+讲解等)

课题介绍本课题聚焦大学生校园内需求匹配低效、互助渠道单一的痛点,设计实现基于 Android 的大学生校园互帮 APP。系统以 Java 为核心开发语言,基于 Android 原生框架搭建移动端应用,搭配轻量后端服务架构,处理需求发布、技能匹配…

作者头像 李华
网站建设 2026/2/8 21:46:22

LobeChat:全栈开发现代化AI聊天应用

LobeChat:构建现代 AI 聊天应用的全栈实践 在生成式 AI 浪潮席卷各行各业的今天,一个直观、灵活且可定制的对话界面,已成为连接用户与大模型能力的关键入口。然而,从零开发一套稳定、美观、功能完整的 AI 聊天系统——支持多模型切…

作者头像 李华
网站建设 2026/2/4 6:19:42

LobeChat能否取代官方ChatGPT客户端?对比评测来了

LobeChat能否取代官方ChatGPT客户端?对比评测来了 在企业越来越依赖大模型构建智能系统、开发者渴望更自由AI交互入口的今天,一个开源项目正悄然改变游戏规则——LobeChat。它不再只是“另一个聊天界面”,而是试图成为连接人与多模态AI能力的…

作者头像 李华
网站建设 2026/2/7 3:18:21

vue基于Springboot框架的大学生就业服务平台四个角色sdae9ber

目录已开发项目效果实现截图开发技术系统开发工具:核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式&…

作者头像 李华