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即波特率1152008位数据位无奇偶校验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即可。命令是APEX erase lnand:128k128k这个命令的意思是从逻辑地址128KB开始擦除大小为128KB的区域。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 0x30008000123456 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后执行APEX copy ext2://1/my_app.bin 0x30008000这条命令会从SD卡设备1根目录读取my_app.bin到内存。速度比串口快几个数量级。后续的copy到NAND的命令不变。通过以太网TFTP烧录这需要你的EA3131基板是v2.x版本并且连接到了局域网。首先你需要一个TFTP服务器软件如Tftpd64并设置好共享目录。确保开发板和TFTP服务器在同一网段且防火墙放行了TFTP端口69。在APEX中执行APEX copy tftp://192.168.1.100/my_app.bin 0x30008000将192.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:128ksize 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等都有很高的参考价值区别主要在于具体的引导程序命令和地址参数。
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即波特率1152008位数据位无奇偶校验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即可。命令是APEX erase lnand:128k128k这个命令的意思是从逻辑地址128KB开始擦除大小为128KB的区域。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 0x30008000123456 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后执行APEX copy ext2://1/my_app.bin 0x30008000这条命令会从SD卡设备1根目录读取my_app.bin到内存。速度比串口快几个数量级。后续的copy到NAND的命令不变。通过以太网TFTP烧录这需要你的EA3131基板是v2.x版本并且连接到了局域网。首先你需要一个TFTP服务器软件如Tftpd64并设置好共享目录。确保开发板和TFTP服务器在同一网段且防火墙放行了TFTP端口69。在APEX中执行APEX copy tftp://192.168.1.100/my_app.bin 0x30008000将192.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:128ksize 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等都有很高的参考价值区别主要在于具体的引导程序命令和地址参数。