EA3131开发板NAND Flash启动全流程:从UART加载到固件烧录
1. 项目概述
如果你手头有一块NXP EA3131开发板,想把你的应用程序固化到板载的NAND Flash里,实现上电就能自己跑起来,那这篇笔记就是为你准备的。我最近在折腾一个基于LPC313x系列芯片的工业控制器项目,核心需求就是脱离仿真器和调试器,让设备能独立、可靠地从NAND Flash启动。这个过程看似只是“烧个程序”,但里面涉及到启动模式选择、引导程序加载、Flash操作协议等一系列细节,任何一个环节没配好,板子就“变砖”或者卡在启动阶段。网上关于这块老板子的中文资料比较零散,官方应用笔记(AN10901)又写得比较简略,很多实操中的“坑”都没提。所以,我结合自己的踩坑经历,把从UART加载APEX引导程序,到最终把应用程序烧进NAND Flash并成功启动的完整流程,以及背后的原理和注意事项,系统地梳理出来。无论你是刚开始接触嵌入式启动流程的新手,还是正在为量产固件部署发愁的工程师,这份指南都能提供一个清晰、可复现的参考。
2. 核心原理与硬件配置解析
2.1 嵌入式系统启动流程与NAND Flash的角色
要理解我们为什么要做这些配置,得先搞清楚嵌入式系统上电后到底发生了什么。对于ARM架构的微控制器,比如EA3131上这颗LPC313x,芯片内部有一段固化的代码,叫做Boot ROM。一上电或复位,CPU首先执行的就是这段ROM里的代码。它的核心任务就一个:找到用户程序(也就是你的应用程序)并跳转过去执行。
Boot ROM支持多种寻找程序的途径,也就是启动模式。常见的有从内部RAM、外部存储器(如NOR Flash、NAND Flash)、串口(UART)或者USB启动。EA3131开发板通过一组叫做“Boot Config”的跳线帽,告诉Boot ROM这次该从哪儿找程序。我们的目标是从NAND Flash启动,但这里有个关键矛盾:Boot ROM本身功能简单,它可能不支持直接读取复杂的NAND Flash(需要处理坏块管理、ECC校验等)。因此,我们需要一个“中间人”——这就是APEX引导程序(Bootloader)。
整个启动链条是这样的:上电 -> Boot ROM(根据跳线设置为UART模式)-> 通过UART接收APEX引导程序到内存(SDRAM)并运行 -> APEX引导程序(功能强大,支持NAND操作)从NAND Flash中读取用户程序到内存 -> 跳转到用户程序执行。而我们的工作,就是搭建好这个链条,并把最终的用户程序稳稳地放进NAND Flash的指定位置。
2.2 EA3131开发板关键跳线配置详解
硬件配置是第一步,也是最容易出错的一步。EA3131板子上的跳线比较多,我们需要关注其中几组,它们直接决定了信号的走向和外围器件的使能状态。请对照你的板子(版本号很重要,我的是Base Board v2.0)找到以下位置:
2.2.1 Boot Config跳线:决定启动路径这组跳线是大脑的“启动指令”。它直接连接到了LPC313x芯片的某个或某几个专用启动配置引脚(通常是GPIO引脚,在上电复位时被采样)。跳线帽的不同连接方式,改变了这些引脚的上拉/下拉状态,从而被Boot ROM识别为不同的启动模式。
- UART Boot模式:如图3a所示,将跳线帽连接到标有“UART”标识的两个针脚上。这个模式下,Boot ROM会傻傻地等待从UART接口发送过来的有效程序数据。这是我们最初加载APEX引导程序时必须设置的模式。
- NAND Boot模式:如图3b所示,将跳线帽连接到标有“NAND”标识的两个针脚上。设置为此模式后,Boot ROM会尝试去访问连接在外部总线上的NAND Flash芯片,并从其预定的起始地址读取数据。只有在完成整个烧录流程后,才能切换到该模式。
注意:切换启动模式后,必须对开发板进行一次硬件复位(按下复位按钮),新的启动配置才会生效。Boot ROM只在复位后的极短时间内采样这些配置引脚。
2.2.2 UART Selection跳线:选择调试通道这组跳线决定了芯片UART引脚连接到哪里。EA3131板载了USB转串口芯片和标准的RS-232电平转换芯片,方便连接。
- 连接至USB:如图4a,跳线帽连接“USB”侧。此时,通过Micro-USB线连接电脑,电脑会识别出一个虚拟COM口。优点是只需一根线同时完成供电和通信,非常方便。
- 连接至RS-232/XBee:如图4b,跳线帽连接“RS232”侧。此时需要再通过2.2.3的跳线选择具体是RS-232还是XBee。
2.2.3 RS-232 / XBee跳线:二选一当UART信号被路由到此处后,需要决定是给板载的DB-9接口(RS-232)还是XBee插座。我们使用RS-232,因此按照图5,将跳线帽连接至标有“RS232”的针脚。这样,就可以用一根RS-232串口线连接开发板和电脑(或USB转串口适配器)。
2.2.4 DBUF_EN跳线:避免总线冲突的关键这是最容易忽略但可能导致启动失败的关键点!在LPC31xx Base Board v1.x和v2.0版本上,LCD和以太网模块的缓冲区使能信号由一个与门(AND Gate)控制。在NAND Flash启动的初期,芯片的相关GPIO和总线控制器可能还未初始化到正确的状态,这个使能信号可能会意外生效,导致LCD或以太网控制器也试图访问外部总线,与NAND Flash产生总线争用(Bus Contention)。结果就是数据线打架,CPU读回来的数据全是错的,自然无法启动。
- 解决方案:在进行NAND Flash启动时,必须按照图6所示,将
DBUF_EN跳线帽拔掉,物理上断开使能信号,禁用LCD和以太网模块。待系统从NAND启动完成后,如果应用程序需要用到这些外设,再在软件中对其进行正确初始化,之后可以重新插上跳线帽。 - 硬件修改方案(可选):如果你觉得每次拔插跳线麻烦,且确定产品不需要从NOR Flash启动(因为此修改可能影响其他启动模式),可以参考图7,将板上的U11芯片(一个74系列与门)更换为一个同封装的XNOR门。这样修改后,缓冲区使能逻辑发生变化,可以避免在NAND启动时的冲突,就无需再操作跳线了。此操作需要一定的焊接技巧,且会使板卡失去官方保修,请谨慎评估。
2.3 串口终端配置要点
无论选择USB虚拟串口还是RS-232物理串口,与开发板通信的终端软件配置必须正确。
- 波特率与格式:LPC313x Boot ROM和APEX引导程序默认使用的串口参数是115200, 8, N, 1(即波特率115200,8位数据位,无奇偶校验,1位停止位)。必须在终端软件中精确设置为此参数。
- 终端软件选择:官方笔记推荐Tera Term Pro,因为它支持二进制文件发送和XMODEM协议。像Windows自带的超级终端(HyperTerminal)就不支持发送二进制文件,无法使用。PuTTY虽然是个好终端,但也不支持文件传输协议,所以不适合这个场景。
- 驱动与COM口:如果使用USB连接,首次连接需要安装Embedded Artist官网提供的USB转串口驱动。安装成功后,在Windows设备管理器的“端口(COM和LPT)”下会看到一个新的串行端口,比如
COM6。一个重要的经验是:尽量将开发板始终插在电脑的同一个USB口上。如果换了USB口,系统可能会为其分配一个新的COM号(如COM7),你需要在终端软件里重新选择端口,有点麻烦。
3. APEX引导程序加载与NAND Flash操作实战
3.1 初始连接与引导程序加载
一切配置就绪后,我们开始实操。第一步是把功能强大的APEX引导程序搬进开发板的内存里。
- 硬件状态准备:确保
Boot Config跳线设置为UART Boot模式,DBUF_EN跳线保持连接(因为现在是从UART启动,不涉及NAND总线冲突)。通过USB或RS-232连接好电脑与开发板。 - 打开终端并复位:打开Tera Term Pro,选择正确的COM端口,设置波特率为115200-8-N-1。这里有个顺序问题:如果你先打开终端软件,再给开发板上电,Boot ROM的启动提示信息可能已经在你连接之前就发送完了,导致终端一片空白。更可靠的做法是:打开终端软件,配置好端口和参数后,先按一下开发板上的复位按钮。这样能确保你捕获到完整的启动输出。
- 捕获启动提示:复位后,你应该在终端窗口看到类似
“Boot from UART... Waiting for image...”的提示信息(如图9)。这表明Boot ROM已经就绪,正在等待你通过串口发送程序。 - 发送APEX引导程序:在Tera Term的菜单栏选择
File -> Send file...。在弹出的对话框中,找到你的apex.bin文件(必须是1.6.8或更高版本,旧版本可能不支持NAND操作)。关键一步:务必勾选对话框下方的Binary(二进制)选项(如图10)。然后点击打开,文件传输开始。你会看到终端上显示传输进度。 - 引导程序运行:传输完成后,APEX引导程序会被Boot ROM加载到内存并自动执行。终端上会显示APEX的命令行提示符,通常是类似
“APEX>”的样子(如图11)。至此,指挥权已经从简单的Boot ROM移交给了功能丰富的APEX引导程序,我们可以开始操作NAND Flash了。
3.2 NAND Flash的擦除与编程原理
NAND Flash在写入新数据前,必须对目标区域进行擦除(Erase)。擦除操作的基本单位是“块”(Block),而写入/读取的基本单位是“页”(Page)。APEX引导程序为了简化操作,将NAND Flash的地址空间进行了逻辑映射,用lnand:来表示逻辑NAND设备。
- 理解地址映射:在APEX中,
lnand:128k这个地址指的是NAND Flash的128KB偏移处。为什么是128K?因为APEX将NAND Flash划分为若干个128KB大小的逻辑块(Logical Block)。Block 0从地址0开始,Block 1就从128KB开始。LPC313x的Boot ROM在NAND启动模式下,约定俗成地会去Block 1的起始位置(即128KB处)寻找并加载应用程序。因此,我们的程序必须烧录到这个位置。 - 擦除操作:我们不需要擦除整个Flash,只擦除要存放程序的Block 1即可。命令是:
这个命令的意思是:从逻辑地址128KB开始,擦除大小为128KB的区域。APEX> erase lnand:128k+128k+128k指定了擦除的长度。执行后,APEX会反馈擦除成功的信息。 - 加载应用程序到内存:擦除完成后,需要先把要烧录的应用程序二进制文件(比如
my_app.bin)从电脑传输到开发板的内存(SDRAM)中。这里使用XMODEM协议,它自带校验,比直接发送文件更可靠。命令如下:APEX> xreceive 0x300080000x30008000是SDRAM的一个地址。执行此命令后,APEX会等待接收文件。此时需要在Tera Term菜单选择File -> Transfer -> XMODEM -> Send...,然后选择你的my_app.bin文件(如图13、14)。传输完成后,终端会显示接收到的字节数,务必记下这个数字,例如“Received 123456 bytes.”。
3.3 烧录应用程序与验证
现在,内存0x30008000处有了程序,NAND Flash的Block 1也已经擦除干净,是时候把程序“刻”进Flash了。
执行烧录命令:使用
copy命令,将内存中的数据复制到NAND Flash的指定位置。命令格式如下:APEX> copy 0x30008000+<接收的字节数> lnand:128k将
<接收的字节数>替换为你刚才记下的数字,例如123456。完整命令如:APEX> copy 0x30008000+123456 lnand:128k这个命令告诉APEX:从内存地址
0x30008000开始,复制123456个字节的数据,到逻辑NAND设备lnand的128k偏移地址处。执行后会有复制进度和完成提示(如图15)。切换启动模式与最终测试:这是最后一步,也是验证是否成功的一步。
- 首先,关闭终端软件或断开串口连接。这一步很重要,防止终端软件占用串口线,影响后续启动。
- 更改跳线:将
Boot Config跳线从UART模式改为NAND模式。同时,务必拔掉DBUF_EN跳线帽(如果是v1.x/v2.0板子)。 - 上电复位:给开发板重新上电,或者按下复位按钮。此时,Boot ROM会读取NAND启动配置,并尝试从NAND Flash的Block 1加载程序。
- 观察现象:如果一切顺利,你的应用程序应该开始运行了。你可以通过观察板载LED的闪烁模式、通过另一个串口打印日志、或者执行应用程序设计的功能来验证。如果系统没有任何反应,或者又回到了类似等待UART下载的状态,说明启动失败,需要回到前面的步骤排查。
4. 高级技巧与深度问题排查
4.1 使用SD卡或网络(TFTP)加速烧录
通过UART和XMODEM烧录,速度受限于115200的波特率,对于几百KB的程序尚可忍受,如果程序上MB就会非常慢。APEX引导程序提供了更快的替代方案:
- 通过SD卡烧录:如果你的应用程序最终文件是
my_app.bin,可以将其复制到一张格式化为ext2文件系统的SD卡根目录。将SD卡插入开发板的SD卡槽。在APEX命令行中,无需先通过UART加载APEX,只要你的板子支持并从SD卡能启动APEX(或通过UART进入APEX后),执行:
这条命令会从SD卡(设备1)根目录读取APEX> copy ext2://1/my_app.bin 0x30008000my_app.bin到内存。速度比串口快几个数量级。后续的copy到NAND的命令不变。 - 通过以太网TFTP烧录:这需要你的EA3131基板是v2.x版本,并且连接到了局域网。首先,你需要一个TFTP服务器软件(如Tftpd64),并设置好共享目录。确保开发板和TFTP服务器在同一网段,且防火墙放行了TFTP端口(69)。在APEX中执行:
将APEX> copy tftp://192.168.1.100/my_app.bin 0x30008000192.168.1.100替换为你的TFTP服务器IP地址。这是最快的方法,特别适合频繁烧录调试。
4.2 启动失败问题排查指南
从NAND启动失败,通常表现为上电后无任何反应,或者串口输出乱码后停止。可以按照以下流程排查:
| 现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 上电完全无反应,LED也不亮 | 1. 电源问题。 2. Boot Config跳线设置错误或接触不良。 3. 核心板或芯片损坏。 | 1. 检查电源适配器或USB线供电是否正常,测量板子供电点电压。 2. 重新拔插 Boot Config跳线帽,确保牢固连接在NAND位置。用万用表测量对应引脚电平是否与跳线设置一致。3. 切换回 UART模式,看能否正常连接APEX,以排除芯片问题。 |
| 串口有输出乱码或卡住,程序不运行 | 1. 串口参数(波特率、停止位等)不对。 2. DBUF_EN跳线未断开,导致总线冲突。3. 烧录的程序本身有错误或启动地址不对。 4. NAND Flash损坏或焊接不良。 | 1. 确认终端软件参数为115200-8-N-1,与Boot ROM设定严格一致。 2.重点检查:确认在NAND启动模式下, DBUF_EN跳线已断开(针对v1.x/v2.0板)。3. 切换回 UART模式,通过APEX的md(显示内存)命令检查0x30008000处的数据是否和你的bin文件头部一致。检查编译链接脚本,确保程序入口地址正确。4. 在APEX下尝试读取NAND内容: md lnand:128k,看读出的数据是否是你烧录的程序开头部分。如果全是FF或00,可能是擦除/编程失败或Flash硬件问题。 |
| 能启动但运行不稳定或功能异常 | 1. 程序烧录不完整或传输过程有误码。 2. SDRAM初始化参数在应用程序中与Bootloader阶段不一致。 3. 应用程序中未正确重新初始化相关外设(如拔掉的 DBUF_EN对应的外设)。 | 1. 比较烧录前后文件的一致性。在APEX下用copy lnand:128k+<size> 0x31000000将Flash内容读回内存另一处,再用cmp命令比较0x30008000和0x31000000两块内存区域是否一致。2. 检查你的应用程序启动代码(通常是汇编或C初始化部分),确保SDRAM控制器的配置与APEX引导程序使用的配置兼容,避免内存访问错误。 3. 如果你的应用要用到LCD或以太网,需要在应用程序中,在相关驱动初始化代码执行之后,再将 DBUF_EN对应的GPIO控制引脚置为有效,或者重新插上跳线帽(需确保软件初始化已完成)。 |
4.3 关于Boot ROM大小限制的深入理解
官方文档图1提到了“Boot ROM size restriction”。这里需要澄清:这个限制通常指的是芯片内部Boot ROM代码所能加载和搬运的第一阶段引导程序的大小,而不是指最终你烧录到NAND Flash的应用程序的大小。对于LPC313x,通过UART加载的APEX引导程序镜像(apex.bin)不能超过这个限制(可能是几KB到几十KB)。而APEX本身运行在SDRAM中,再由它去加载NAND Flash中可能很大的应用程序(例如你的my_app.bin),这个应用程序的大小只受限于可用的Flash空间和SDRAM容量。因此,只要你使用的apex.bin文件是官方提供的合规版本,就不需要担心这个问题。真正需要关注的是你的应用程序的链接脚本,确保代码、数据等段的总和不要超过你板载NAND Flash的可用空间。
5. 生产环境下的部署考量
当你的产品从原型进入量产阶段,通过串口一个个烧录显然不现实。基于上述流程,可以衍生出高效的量产方案:
- 制作量产工装:可以设计一个简单的夹具,通过探针或连接器,同时连接多块板卡的UART和电源。由一台工控机运行脚本,通过多串口卡,同时向多块板卡发送APEX引导程序和应用程序。
- 预烧录引导程序:在贴片生产环节,可以要求芯片厂或贴片厂通过编程器,将APEX引导程序(或者一个更精简的、只包含NAND驱动和USB DFU功能的引导程序)直接烧录到NAND Flash的Block 1。这样板卡上电后,直接就是NAND启动模式,APEX会自动运行,并等待通过USB或其他接口接收最终的应用程序进行更新。这省去了手动设置UART模式和加载APEX的步骤。
- 实现OTA升级:在你的应用程序中,集成一个备份引导程序和Flash驱动。当需要升级时,通过以太网、Wi-Fi等渠道下载新的应用程序到SDRAM或Flash的另一个块(如Block 3),验证通过后,由当前运行的程序将新镜像安全地复制到Block 1,然后重启。重启后,Boot ROM会自动从Block 1加载并运行新版本。这就是一个完整的无线升级(OTA)闭环。关键点在于:升级过程中写操作Block 1时,必须保证电源稳定,且要有回滚机制(比如在Block 2保存一个已知良好的旧版本),防止升级失败变砖。
折腾EA3131的NAND启动,本质上是在理解一个经典的嵌入式二级引导流程:ROM Bootloader -> Secondary Bootloader (APEX) -> Application。每个环节的配置都环环相扣。我最深的体会有两点:一是硬件跳线千万别想当然,特别是像DBUF_EN这种为了规避硬件设计初期遗留问题而设置的跳线,一定要严格按照文档操作;二是善用引导程序提供的工具,比如在APEX下多用md、cmp命令去查看和对比内存、Flash内容,能快速定位是传输错误、烧录错误还是程序本身的问题。这套流程虽然是以EA3131为例,但其思路——配置启动媒介、加载中间引导程序、通过引导程序操作外部Flash、最终切换启动模式——对于其他使用NAND Flash或类似存储介质的ARM芯片(如i.MX系列、STM32MP1等)都有很高的参考价值,区别主要在于具体的引导程序命令和地址参数。
