深入解析TI AM18xx Bootloader与AIS引导脚本实战

📅 2026/7/22 13:50:26 👁️ 阅读次数 📝 编程学习
深入解析TI AM18xx Bootloader与AIS引导脚本实战

1. 项目概述与核心价值

在嵌入式开发领域,尤其是基于德州仪器(TI)AM18xx系列处理器的项目中,系统启动是项目成功的第一道门槛,也是最容易“翻车”的地方。我见过不少工程师,代码写得漂亮,功能调试顺利,最后却卡在了“板子怎么都起不来”这个环节,一折腾就是好几天。问题的根源,往往在于对Bootloader,特别是其支持的多种启动模式以及核心的AIS引导脚本机制理解不够透彻。

AM18xx的Bootloader固化在芯片的ROM中,是芯片上电后运行的第一段代码。它的核心任务很简单:找到你的应用程序,把它搬到正确的地方,然后跳过去执行。但“怎么找”、“怎么搬”、“搬之前要不要做点什么准备”,这里面的门道就深了。它支持从NOR Flash、NAND Flash、UART、SPI、I2C甚至HPI等多种媒介启动,每种方式都有其特定的硬件连接要求、配置字格式和初始化流程。而将这些复杂流程统一起来的,就是TI专有的Application Image Script (AIS) 格式。你可以把AIS想象成一份给Bootloader的“搬家清单”和“操作手册”,上面不仅写了要把哪些代码段(Section)放到内存的哪个地址,还包含了配置PLL时钟、初始化DDR内存、设置引脚复用等硬件初始化命令。

手动编写这份二进制的“操作手册”无疑是噩梦,好在TI提供了AISgen这个图形化工具。它把晦涩的AIS命令封装起来,让你通过勾选配置、填写参数就能生成最终的.bin文件,极大地降低了使用门槛。但工具好用不代表可以无脑用,理解其背后的原理,才能在你遇到“用AISgen生成的镜像烧进去不启动”、“换了个Flash型号就启动失败”这类问题时,快速定位到是配置错误、时序问题还是命令序列不对。

本文将深入拆解AM18xx Bootloader的完整工作流程,重点剖析AIS脚本的构成与每一条命令的底层含义,并详解如何利用AISgen工具进行高效、可靠的配置。我会结合自己在实际项目中趟过的坑,分享从启动模式选择、AIS脚本生成到最终烧录验证的全套实战经验,目标是让你读完就能在自己的AM18xx板卡上,构建起稳定可靠的启动方案。

2. AM18xx启动模式深度解析

AM18xx的Bootloader之所以强大,在于它提供了极其灵活的启动路径选择。芯片上电后,Bootloader ROM代码首先会读取特定的硬件引脚(Boot Pin)的状态,根据这些引脚的电平组合,决定本次启动从哪个“入口”开始。这个选择过程,直接决定了后续所有的硬件初始化流程和数据加载方式。

2.1 启动模式的选择与硬件配置

启动模式的选择完全由硬件决定。在AM18xx芯片上,有一组专用的启动配置引脚(例如BOOT[7:0])。在设计电路板时,你需要通过上拉或下拉电阻,将这些引脚设置为特定的电平组合。芯片复位释放的瞬间,Bootloader会锁存这些引脚的状态,并查询内置的“启动模式选择表”(详见官方文档附录),从而确定本次的启动源。

常见的启动模式及其硬件接口如下:

  • NOR Flash启动 (EMIFA CS2):通过外部存储器接口A(EMIFA)连接并行NOR Flash。支持8位或16位数据宽度。这是最传统、也最快速的启动方式之一,因为NOR Flash支持芯片内执行(XIP),但成本较高。
  • NAND Flash启动 (EMIFA CS3):通过EMIFA连接NAND Flash。成本低,容量大,是存储大量固件(如Linux内核+文件系统)的常用选择。但需要Bootloader具备坏块管理和ECC处理能力(AM18xx Bootloader支持部分型号的NAND)。
  • SPI EEPROM/Flash启动:通过SPI接口连接串行Flash。接线简单,占用PCB空间小,是空间受限应用的理想选择。
  • I2C EEPROM启动:通过I2C接口连接EEPROM。容量通常较小,适用于存储精简的引导程序或配置信息。
  • UART启动:通过UART接口,从上位机(如PC)下载程序。这不是一种生产环境启动方式,而是极其重要的开发调试手段。当你的Flash还是空白,或者程序损坏导致无法启动时,可以通过UART将程序先加载到RAM中运行,为后续的Flash编程提供桥梁。
  • HPI启动:通过主机端口接口,由外部主机(如DSP或FPGA)直接向AM18xx的内存加载代码。用于多处理器协同工作的场景。

实操心得:启动引脚配置的坑我曾经遇到一个诡异的故障:板卡小批量生产后,有大约5%的板子无法启动。排查了很久,最后发现是Boot配置引脚的上拉电阻阻值选择不当。在常温下测试正常,但在高温或低温环境下,由于电阻精度和芯片输入漏电流的影响,引脚电平发生了漂移,导致Bootloader误判了启动模式。教训是:务必参考芯片数据手册的推荐值选择上下拉电阻(通常建议10kΩ),并在设计允许的情况下,尽量让配置模式与默认电平(上拉或下拉)一致,以增强抗干扰能力。对于关键产品,需要进行高低温环境下的启动可靠性测试。

2.2 非AIS启动模式详解

并非所有启动模式都使用AIS脚本。为了兼容更传统的方案或特殊需求,Bootloader保留了几种“直通”式的启动方式。

2.2.1 NOR Flash启动的三种子模式

当Bootloader配置为从NOR Flash启动时,它会首先读取NOR Flash基地址(0x60000000)处的第一个32位字。这个字被称为“NOR启动配置字”,它的结构决定了后续行为:

位域字段名描述
[31:12]Reserved保留,必须为0
[11:8]COPY仅用于Legacy模式。定义从NOR复制到内部RAM的数据大小(1KB - 16KB)。
[7:6]Reserved保留,必须为0
[5:4]METHOD启动方法:00=Legacy;01=Direct;10=AIS
[3:1]Reserved保留,必须为0
[0]ACCESSEMIFA访问模式:0=8-bit;1=16-bit

1. Legacy NOR Boot (METHOD=0x0):这是最“原始”的模式。Bootloader根据COPY字段的值,将NOR Flash开头指定大小的数据块,原封不动地拷贝到内部RAM(0x80000000)的开头。然后,跳转到内部RAM的0x80000004地址执行。这里有个关键细节:拷贝完成后,Bootloader就认为自己的任务结束了。因此,存放在NOR Flash开头的必须是一个完整的、位置无关的、且入口地址在0x80000004的二级引导程序或应用程序。这种方式常见于非常早期的引导方案或需要极简引导的场景。

2. Direct NOR Boot (METHOD=0x1):更直接的模式。Bootloader在读取配置字后,直接跳转到NOR Flash的0x60000004地址去执行代码。这意味着你的应用程序必须被编译成在NOR Flash地址空间(0x6xxxxxxx)上直接运行(XIP)。这省去了拷贝时间,但对代码设计有要求(比如常量池、函数指针的地址都需要是NOR Flash地址)。

3. AIS NOR Boot (METHOD=0x2):这是我们重点关注的模式。Bootloader将NOR Flash的0x60000004地址开始的内容,当作一个AIS脚本来解析和执行。这是最灵活、最强大的NOR启动方式,也是AISgen工具主要支持的场景之一。

2.2.2 HPI启动模式

HPI启动是一种完全的“从属”启动模式。AM18xx作为从设备,等待外部主机通过HPI接口来“喂养”它。流程如下:

  1. Bootloader设置HPIC寄存器的HINT位,向主机发出中断,宣告“我准备好了”。
  2. 主机清除HINT位,表示收到。
  3. 主机将应用程序镜像写入AM18xx的内存(地址由主机决定)。
  4. 主机将应用程序的入口点地址写入AM18xx内存的0x80000000���置。
  5. 主机回读最后写入的数据,确保所有HPI写操作已完成。
  6. 主机设置HPIC寄存器的DSPINT位,中断Bootloader,告知“程序加载完毕”。
  7. Bootloader清除DSPINT位,然后从0x80000000地址读取入口点,并跳转执行。

2.2.3 仿真调试启动

严格来说,这不算一种“启动”模式,而是一种“等待调试器连接”的状态。选择此模式后,ARM核心在复位后不会尝试加载任何程序,而是直接进入一个空闲循环。此时,必须通过JTAG接口连接仿真器(如XDS系列),才能进行程序下载、内存查看、单步调试等操作。这是裸机开发初期最常用的模式。

3. AIS引导脚本:Bootloader的“指挥棒”

AIS是TI为其Bootloader设计的一套精炼的二进制命令集。它就像一个指挥家手中的乐谱,告诉Bootloader在跳转到用户程序前,需要按什么顺序、执行哪些动作。理解AIS的每个命令,是进行高级启动配置和故障排查的基础。

3.1 AIS文件结构总览

一个完整的AIS文件是一个二进制流,以小端序(Little-Endian)格式组织。其结构非常清晰:

  1. 魔数(Magic Word):固定为0x41504954(ASCII是“APIT”)。Bootloader首先检查这个魔数,如果匹配,才认为这是一个合法的AIS文件。
  2. 一系列AIS命令:紧接魔数之后,是一条接一条的AIS命令。Bootloader会顺序解析并执行它们。
  3. 跳转关闭命令(Jump & Close):作为整个AIS脚本的结束标志。执行此命令后,Bootloader关闭启动所用外设,并将控制权交给应用程序。

每一条AIS命令都由三部分组成(后两部分可选):

  • 操作码(Opcode):1个字(4字节),指明命令类型。
  • 参数(Arguments):0个或多个字,提供命令执行所需的具体信息,如地址、大小等。
  • 数据(Data):0个或多个字节,是命令操作的对象,如要加载的程序段数据。如果数据长度不是4的倍数,会自动用0填充对齐。

3.2 核心AIS命令逐条精讲

下面我们拆解几个最核心的AIS命令,看看它们是如何工作的。

3.2.1 段加载命令 (Opcode: 0x58535901)这是AIS脚本的“主力军”,负责将应用程序的各个已初始化段(如.text, .data)从存储设备加载到指定的内存地址。

[Opcode: 0x58535901] [Argument1: 目标地址] [Argument2: 段大小] [Data: 段的原始数据...]
  • 工作原理:Bootloader读取该命令后,会从AIS文件流中紧接着读取段大小字节的数据,并将其写入目标地址开始的内存中。
  • CRC处理:如果在此命令之前执行了“启用CRC”命令,那么目标地址段大小这两个参数,以及后续加载的所有段数据,都会被纳入CRC计算。这用于保证加载数据的完整性。
  • 链接器脚本的对应关系:这个命令中的目标地址段大小,正是由你的链接器脚本(.cmd文件)中定义的加载地址(Load Address)和段长度决定的。AISgen工具在解析你的.out文件时,会自动提取这些信息并生成对应的Section Load命令。

3.2.2 段填充命令 (Opcode: 0x5853590A)这是一个优化命令。如果你的某个内存段(通常是.bss段,用于存放未初始化的全局变量)需要被统一填充为一个特定值(通常是0),使用这个命令比用Section Load命令加载一大片全是0的数据要高效得多。

[Opcode: 0x5853590A] [Arg1: 目标地址] [Arg2: 填充大小] [Arg3: 访问类型] [Arg4: 填充模式]
  • 访问类型(Type Word):指定填充操作的单位。0表示按8位(字节)填充,1表示按16位(半字)填充,2表示按32位(字)填充。这会影响填充的速度和生成的AIS文件大小。
  • 填充模式(Pattern):一个32位的值,但只有低8位、16位或32位有效(取决于访问类型)。例如,要将.bss段清零,模式就是0x00000000

3.2.3 CRC校验相关命令在可靠性要求高的场合,数据完整性校验至关重要。AIS提供了完整的CRC支持。

  • 启用CRC命令 (0x58535903):此命令之后的所有Section Load/Fill命令加载的数据都会被用于计算一个运行中的CRC值。
  • 禁用CRC命令 (0x58535904):停止CRC计算。
  • 验证CRC命令 (0x58535902):这是校验的触发点。该命令带有两个参数:期望的CRC值回溯偏移量(Seek Value)
    • 主模式(Master Mode)流程:Bootloader从存储设备中读出“期望的CRC值”,与自己计算出的CRC进行比较。如果匹配,继续执行下一条命令;如果不匹配,Bootloader会将当前AIS读取位置向后移动回溯偏移量个字节,然后从那个位置重新开始执行命令(通常是重新加载出错的段)。这是一种简单的硬件端容错机制。
    • 从模式(Slave Mode)流程:在UART、I2C等从模式启动时,Bootloader在收到此命令后,会将自己计算出的CRC值发送给主机(如PC)。主机负责将这个计算值与AIS脚本中预存的期望值进行比较。如果出错,主机需要发送一个特殊的重开始命令(Start-Over, 0x58535908)给Bootloader,让其复位CRC计算器并准备重新接收数据。这意味着在从模式下的CRC校验和错误恢复,是由上位机软件(如UART Boot Host GUI)主导的。

3.2.4 跳转与关闭命令 (Opcode: 0x58535906)这是每个AIS脚本的“句号”。收到此命令后,Bootloader会:

  1. 关闭启动所使用的外设控制器(如SPI、I2C、EMIFA等)。
  2. 将之前为启动而修改的一些设备状态恢复为默认值(具体行为与芯片和模式有关)。
  3. 跳转到该命令参数所指定的应用程序入口地址,并将CPU的控制权彻底移交给应用程序。这个入口地址,就是你的程序镜像中定义的_c_int00或类似的启动例程地址。

3.2.5 函数执行命令 (Opcode: 0x5853590D)这是AIS脚本的“瑞士军刀”,它允许你调用Bootloader ROM中预定义好的一系列硬件初始化函数。这是实现复杂启动配置的关键。

[Opcode: 0x5853590D] [Arg1: 函数ID与参数个数] [Arg2: 参数1] [Arg3: 参数2] ...
  • 第一个参数的低16位指定要调用的ROM函数编号(Function ID),高16位指定传递给该函数的参数个数(N)。
  • 后面紧跟的N个参数,就是传递给这个函数的实参。
  • ROM函数库:Bootloader ROM里“烧录”了很多常用硬件初始化函数,例如:
    • 配置PLL0/PLL1:设置系统核心时钟、外设时钟。
    • 配置EMIF/SDRAM/DDR2控制器:初始化外部存储器接口时序。
    • 配置引脚复用(Pinmux):将芯片引脚配置为特定功能。
    • 配置电源与睡眠控制器(PSC):打开或关闭特定外设模块的时钟。AISgen工具的核心工作之一,就是根据你在图形界面上的配置,自动生成一系列正确的Function Execute命令,将这些硬件初始化工作在你应用程序运行前全部完成。

3.2.6 启动表命令 (Opcode: 0x58535907)这是一个更底层的命令,用于向设备的任意内存地址(通常是寄存器地址)写入一个8位、16位或32位的值,并可以指定写入后的延迟周期数。它可以实现Function Execute命令覆盖不到的、非常具体的寄存器位操作��

[Opcode: 0x58535907] [Arg1: 类型字] [Arg2: 目标地址] [Arg3: 数据值] [Arg4: 延迟周期数]
  • 类型字(Type Word):定义了写入操作的位宽(8/16/32位),甚至支持只写入一个32位寄存器中的某几个特定位(通过START和STOP位域定义),而保持其他位不变。这在精细配置寄存器时非常有用。

4. AISgen工具实战:从配置到生成

理解了AIS的原理,我们再来使用AISgen工具就会知其然也知其所以然。AISgen将上述复杂的二进制命令生成过程,封装成了一个直观的Windows图形界面。

4.1 工具安装与项目准备

  1. 环境准备:确保系统已安装Microsoft .NET Framework 2.0或更高版本。
  2. 获取工具:从TI官网下载SPRABA5软件包(通常是一个ZIP文件),解压后运行安装程序。建议安装到默认路径。
  3. 准备应用程序:在Code Composer Studio (CCS)中,将你的工程编译链接生成一个可执行的.out文件。这个文件包含了代码段、数据段、符号表等所有信息,是AISgen生成引导镜像的原料。

4.2 基础配置流程详解

启动AISgen,主界面(General标签页)是配置的起点。

4.2.1 设备与镜像设置

  • Device Type (ROM Revision)这是第一个关键选择!你必须根据芯片的ROM版本号来选择。错误的版本号可能导致生成的AIS镜像无法被Bootloader识别。如何查看?按照文档说明,在CCS中连接芯片,查看内存地址0xFFFD0008处的值。常见的版本有d800k002,d800k004,d800k006,d800k008。如果不确定,选d800k008(最新版)的兼容性通常最好,但最稳妥的方法是实际读取确认
  • Device Type (ARM):选择ARM,因为我们是为ARM核心生成引导镜像。
  • ARM Application:通过浏览按钮,选择你编译好的.out文件。
  • AIS File:指定输出的AIS二进制文件路径和名称,例如C:\my_project\boot.ais.bin

4.2.2 启动模式与外围设备配置Boot Mode下拉框中,选择你硬件设计对应的启动方式,例如SPI1 Master Boot

  • Flash标签页(仅NOR/NAND模式出现):这里配置EMIFA接口的时序参数,如建立时间、保持时间、读写周期等。除非你非常清楚你的Flash芯片型号和时序要求,否则建议先使用默认值。不正确的时序是导致“能烧写但无法启动”的常见原因。你可以从Flash芯片的数据手册中找到这些时序参数,并据此调整。
  • Peripheral标签页(SPI/I2C/UART模式出现):
    • SPI/I2C速度:你可以输入一个期望的速度(如I2C 400kHz, SPI 20MHz)。AISgen会根据你后续的PLL配置,计算并显示实际能达到的最近似速度。注意:这个速度不能超过你外接存储芯片支持的最大通信速率。
    • Enable Sequential Read强烈建议勾选(如果你的存储芯片支持)。对于SPI Flash或I2C EEPROM,启用顺序读模式可以大幅提升启动速度。在顺序读模式下,Bootloader发送一次读命令和起始地址后,就可以连续读取数据,而无需为每个字节都发送地址。这能显著减少通信开销。

4.3 高级硬件初始化配置

这是AISgen最强大的部分,它允许你在Bootloader阶段就完成复杂的硬件初始化,让你的应用程序一“上路”就运行在最佳状态。

4.3.1 PLL时钟配置你的应用程序可能需要在更高的主频下运行,而芯片刚复位时,PLL是旁路(Bypass)模式,使用低速的参考时钟。

  • 勾选“Configure PLL0”:会出现PLL0标签页。
  • 输入时钟源:在General页设置输入时钟频率(如24MHz晶振)。
  • 配置倍频与分频
    • PLL Multiplier: 设置倍频系数(例如,输入24MHz,想得到456MHz,则倍频系数为19)。
    • PLL Predivider/PLL Postdivider: 设置前后分频器。
    • DIV1, DIV3, DIV5, DIV7: 这些是可配置的分频器,用于产生ARM子系统、外设等的时钟。
    • 关键观察:修改这些参数时,下方的CPU FrequencyDDR Clock等会实时计算并显示。确保它们在你的芯片和数据手册规定的范围内。

4.3.2 外部存储器配置如果你的应用程序需要用到外部SDRAM或DDR2内存,必须在跳转到应用程序前初始化它们。

  • SDRAM配置:勾选Configure SDRAM,在对应标签页填写EMIFA SDRAM控制器的寄存器值。这些值高度依赖于你使用的SDRAM芯片型号(位宽、容量、行列地址位数、刷新周期等)。最可靠的方法是参考TI SDK或评估板提供的初始化代码来填写这些十六进制数值。
  • DDR2配置:勾选Configure DDR2,会自动同时勾选Configure PLL1(因为DDR控制器时钟通常由PLL1提供)。DDR的配置更为复杂,涉及多个时序参数寄存器(如SDRAM_TIMING, SDRAM_CONFIG)。对于初学者,强烈建议直接导入一个已知可用的配置(如从TI的例程中获取),而不是自己从头计算。

4.3.3 PSC与Pinmux配置

  • PSC配置:勾选Configure PSC。这里可以指定哪些低功耗睡眠控制器(LPSC)模块在启动时被开启、关闭或置于同步复位状态。务必谨慎!Bootloader会自动开启启动所用外设的模块。你在这里额外开启的模块会增加功耗;而错误地关闭关键模块(如ARM本身或启动外设)会导致启动失败。通常只有在你需要提前启用某个特殊外设(如用于启动后立即通信的UART)时才需要配置这里。
  • Pinmux配置:勾选Configure Pinmux。Bootloader会自动配置启动引脚所需的功能复用。你在这里的配置,是在此基础上进行追加或修改。例如,你的应用需要将某个Bootloader未使用的引脚配置为GPIO输出高电平。你需要知道该引脚对应的Pinmux寄存器编号和位域值。警告:不要覆盖Bootloader已经设置好的启动引脚复用配置,否则系统将无法启动。

避坑指南:配置的保存与复用一个复杂的启动配置(尤其是PLL、DDR部分)往往需要多次调试才能稳定。AISgen提供了File -> Save Configuration功能,可以将当前所有标签页的设置保存为一个.cfg文件。强烈建议为每个成功的硬件配置保存一个配置文件。当需要重新生成镜像或移植到类似硬件时,使用File -> Load Configuration加载即可,避免重复输入和出错。这也是团队协作和版本管理的好习惯。

完成所有配置后,点击Generate AIS按钮。如果配置无误,下方状态栏会显示“AIS generation succeeded”并给出生成的.bin文件大小。这个.bin文件,就是你可以烧录到Flash中,或者通过UART Boot Host工具发送给芯片的最终引导镜像。

5. 多模式启动实操与问题排查

掌握了AIS和AISgen,我们就可以针对不同的启动模式进行实际操作。这里以最常用的SPI Flash启动UART下载启动为例,讲解完整流程和常见问题。

5.1 SPI Flash启动全流程

目标:将应用程序通过AISgen打包成.bin文件,并烧录到板载的SPI Flash中,实现上电自启动。

步骤:

  1. 硬件连接:确保AM18xx的SPI1引脚(MOSI, MISO, CLK, CS)正确连接到SPI Flash芯片,且Boot引脚配置为SPI1 Master Boot模式。
  2. 生成AIS镜像
    • 在AISgen中,Boot Mode选择SPI1 MASTER Boot
    • Peripheral标签页,根据你的SPI Flash芯片手册,设置合适的SPI速度(如20MHz),并勾选Enable Sequential Read
    • 根据需要配置PLL、DDR等。
    • 指定ARM应用文件(.out)和输出AIS文件路径。
    • 点击生成,得到app_spi.ais.bin
  3. 烧录SPI Flash
    • 方法一(在线烧录):先将芯片设置为UART启动模式仿真模式,通过CCS和仿真器,编写一个简单的内存加载程序,将app_spi.ais.bin文件的内容通过SPI控制器写入到外部SPI Flash的起始地址(通常是0x0)。TI的SDK中通常提供这样的烧写工具(如flash_writer例程)。
    • 方法二(离线烧录):使用专用的SPI Flash编程器,将app_spi.ais.bin文件直接烧录到空白Flash芯片中,再将芯片焊接到板子上。
  4. 验证启动:将板卡Boot引脚设置为SPI启动模式,重新上电。如果一切正常,应用程序应该能自动运行。

5.2 UART启动模式与Host工具使用

UART启动模式是开发和调试阶段的“救命稻草”。当Flash为空或程序损坏时,可以通过它从PC直接加载程序到RAM并执行。

步骤:

  1. 硬件连接:连接AM18xx的UART0(通常是调试串口)到PC的USB转串口工具。Boot引脚配置为UART0 Boot模式。
  2. 准备AIS镜像:在AISgen中,Boot Mode选择UART Boot。UART波特率在Boot阶段是固定的(通常为115200),无法在AISgen中更改(但受PLL配置影响的实际波特率会在Peripheral页显示)。生成app_uart.ais.bin
  3. 使用UART Boot Host工具
    • 这个工具通常包含在TI的软件包中(如UART_Boot_Host)。
    • 打开工具,选择正确的COM端口和波特率(115200)。
    • 点击ConnectOpen Port。此时给目标板重新上电,工具界面会显示与Bootloader的握手信息。
    • 点击Load AIS File,选择刚才生成的app_uart.ais.bin文件。
    • 点击SendBoot。工具会将AIS文件通过串口发送给AM18xx的Bootloader。Bootloader解析并执行AIS命令,将程序加载到RAM,最后跳转执行。
    • 如果程序包含串口输出功能,你可以在工具的接收窗口看到应用程序的打印信息。

5.3 典型问题排查实录

即使按照步骤操作,启动失败也常有发生。下面是一个排查思路的实录:

问题现象:通过UART Boot Host工具发送AIS镜像后,工具显示发送完成,但板卡毫无反应,应用程序没有运行。

排查步骤:

  1. 检查基础通信

    • 确认串口线连接正确,COM端口号无误。
    • 给板卡上电时,观察UART Boot Host工具是否有任何输出?Bootloader在启动时会打印特定的握手字符(如'C''A')。如果什么都没收到,可能是Boot引脚配置错误、串口引脚连接错误、或板卡未正常复位上电。
  2. 检查AISgen配置

    • ROM版本:这是最高频的错误原因。确认AISgen中选择的ROM版本号与芯片实际版本完全一致。用CCS内存查看器确认0xFFFD0008的值。
    • 入口地址:确认AISgen中指定的ARM应用.out文件是有效的、针对当前板卡编译的。一个常见的错误是,用于UART启动的.out文件链接地址是0x80000000(内部RAM),但你却生成了一个需要加载到DDR(0x80000000)的镜像,而你的AIS脚本里没有配置DDR控制器。结果就是Bootloader试图把代码加载到一个未初始化的、无法访问的内存,导致失败。
    • 简化测试:在AISgen中,取消所有高级配置(不勾选Configure PLL0, DDR, SDRAM等),只选择UART Boot模式,生成一个最简单的镜像。用这个镜像测试UART启动。如果成功,说明问题出在高级配置上。
  3. 检查硬件初始化

    • 如果简化镜像成功,问题可能出在PLL或DDR配置上。
    • PLL配置错误:计算出的CPU频率超出芯片范围,导致锁相环失锁,系统挂死。检查AISgen中计算的频率值。
    • DDR/SDRAM配置错误:这是最难排查的。不正确的时序参数会导致内存初始化失败,后续加载代码到该内存时就会出错。建议:使用一个已知在评估板上可用的DDR配置(从TI例程获取.cfg文件),加载到AISgen中,再与你自己的配置对比差异。重点检查SDRAM_TIMING,SDRAM_CONFIG等关键寄存器值。
  4. 利用仿真器调试

    • 将板卡设置为仿真模式,通过JTAG连接CCS。
    • 在CCS中,你可以单步跟踪Bootloader的早期代码(如果有符号文件),或者更简单地,在应用程序的入口函数(如main()_c_int00)处设置断点。
    • 然后通过UART Boot Host发送镜像。如果程序能停在断点,说明加载和跳转成功,问题可能在应用程序初始化部分。如果根本停不住,说明在Bootloader执行AIS脚本的过程中就出错了。
    • 你还可以在内存浏览器中查看AIS脚本应该加载代码的区域(如0x80000000),对比是否与.out文件中的二进制内容一致,以判断加载过程是否成功。
  5. 查看Bootloader默认设置

    • 参考文档中的“Boot Requirements, Constraints and Default Settings”章节。例如,在I2C Slave Boot模式下,PLL0有特殊的默认配置。如果你的应用假设了不同的时钟,而AIS脚本中没有重新配置PLL,就会导致UART波特率计算错误,通信失败。

一个真实案例:我曾遇到UART启动成功,但SPI Flash启动失败的情况。排查后发现,在AISgen的Flash标签页中,EMIF Wait Cycle配置值对于我使用的SPI Flash型号来说太短了。Bootloader在读取AIS魔数时能正确读取(因为最初几次读取时序裕量可能够),但在快速连续读取后续命令和数据时,由于时序紧张,偶尔会读错数据,导致CRC校验失败或命令解析错误。将等待周期增加2个时钟后,问题解决。教训:存储器的时序配置必须留有余量,尤其是在高低温环境下。