深入解析TI C66x DSP内核架构与关键外设配置实战

1. 项目概述与C66x DSP核心价值

在通信基站、雷达信号处理或者高端医疗影像设备里,我们常常会遇到一个核心挑战:如何在极短的时间内,完成海量数据的实时计算与处理。比如,一个5G基站需要同时处理成百上千个用户的信号,进行复杂的波束成形和信道均衡;一部相控阵雷达需要在微秒级内完成目标回波信号的滤波、检测与跟踪。这些场景对处理器的计算密度、能效和实时性提出了近乎苛刻的要求。通用CPU往往力不从心,而专用ASIC又缺乏灵活性,这时,像德州仪器(TI)TMS320C665x系列这样的高性能多核DSP(数字信号处理器)就成了不二之选。

我接触C6000系列DSP超过十年,从早期的C64x、C674x到如今的C66x多核架构,亲眼见证了其性能的飞跃。今天要深入聊的TMS320C6652和TMS320C6654,正是基于KeyStone多核架构的明星产品。它们不仅仅是一颗处理器,更是一个高度集成的片上系统(SoC)。其真正的技术价值在于,它将一个甚至两个经过大幅强化的C66x DSP内核,与一整套为高带宽、低延迟数据流量身定制的外设和内存子系统,封装在了一颗芯片里。这意味着,你可以在单芯片上完成从高速数据采集(通过uPP或McBSP)、复杂算法处理(在C66x内核上),到结果输出或网络交互(通过EMAC、PCIe)的完整链路,极大地简化了系统设计,提升了可靠性和性能。

简单来说,如果你正在设计一个需要处理大量复数乘法、FFT(快速傅里叶变换)、FIR滤波或矩阵运算的系统,并且对功耗和实时性有严格要求,那么深入理解C665x的架构、外设和启动机制,将是项目成功的关键第一步。接下来,我将从一个资深工程师的视角,带你拆解这颗芯片的核心,从内核的运算单元到外设的配置细节,再到系统上电的第一行代码如何被加载执行。

2. C66x DSP内核架构深度解析

C66x DSP内核是TMS320C665x系列的力量源泉,它并非凭空而来,而是在经典的C64x+(主打定点计算)和C674x(主打浮点计算)架构基础上的一次重大进化。它的设计哲学非常明确:在保持C6000系列超长指令字(VLIW)架构高指令级并行性的同时,极大地增强单指令多数据(SIMD)和浮点处理能力,以满足现代通信和图像处理中对向量和浮点运算日益增长的需求。

2.1 数据通路与功能单元:并行计算的引擎

打开C66x的内核框图,你会看到其对称且精妙的结构。核心是两个数据通路(Data Path A和B),每个通路包含四个功能单元(.L, .S, .M, .D)和一个包含32个32位寄存器的通用寄存器文件。这种对称设计是并行性的基础。

  • .M单元(乘法单元):这是DSP的“算力担当”。C66x的.M单元能力极其恐怖。除了支持从8x8到32x32的各种定点乘法组合(例如单周期可做4个32x32乘或16个16x16乘),它最大的亮点在于对复数运算浮点运算的硬件支持。例如,一条CMPY指令可以完成一个16位复数乘法,这在做通信解调、波束成形时效率提升是数量级的。浮点方面,它支持单精度(SP)和双精度(DP)浮点乘加,特别是双精度性能相比C674x有巨大提升,延迟槽从10个减少到4个,这对于科学计算和需要高精度处理的雷达算法至关重要。
  • .L与.S单元(逻辑与算术单元):它们负责加法、减法、移位、逻辑运算、数据打包/解包以及分支控制。C66x增强了这些单元对64位宽操作数的支持,使得单条指令能处理更多数据。例如,新的指令可以同时完成多个32位整型到单精度浮点的转换,减少了循环开销。
  • .D单元(数据存取单元):负责所有与内存的交互,即加载(Load)和存储(Store)。C66x支持非对齐访问和增强的寻址模式,这对于处理来自ADC或网络的不规则数据流非常友好。

这八个功能单元在理想情况下,一个时钟周期可以同时执行8条指令(每个单元一条)。编程的关键(无论是手写汇编还是利用编译器)就在于尽可能让这些单元“忙”起来,把计算任务均匀地填满这两个数据通路。

2.2 寄存器文件与数据类型的支持

每个数据通路拥有32个32位寄存器(A0-A31, B0-B31)。这些寄存器是功能单元的“工作台”。C66x支持丰富的数据类型以适应不同算法:

  • 打包数据(Packed Data):这是SIMD的基石。例如,一个32位寄存器可以打包成4个8位数据(用于图像像素处理)或2个16位数据(用于音频样本)。.M单元可以直接对这些打包数据进行并行运算。
  • 宽数据:40位和64位长数据存储在寄存器对中(如A1:A0),用于扩展精度累加,防止滤波等算法中的溢出。C66x甚至支持128位数据,用四个连续的寄存器(如A3:A2:A1:A0)存储,用于极宽向量的操作。
  • 一个关键技巧:在分配寄存器时,要特别注意寄存器对的规则(40/64位数据必须从偶数寄存器开始)和寄存器四倍组的规则(128位数据必须从4的倍数的寄存器开始)。错误的对齐会导致运行时错误或性能下降。

2.3 增强的SIMD与向量处理能力

这是C66x相对于前代的革命性提升。传统的SIMD可能是2路或4路,而C66x通过其宽寄存器和对新指令集的支持,将向量处理能力推向了新高度。例如,QMPY32指令能一次性完成两个包含四个32位元素的向量的逐元素乘法。对于通信中常见的矩阵运算,.M单元甚至支持一个[1x2]的复数向量与一个[2x2]的复数矩阵在单周期内完成乘法。这意味着一些底层的小型矩阵变换几乎可以“免费”完成,无需展开循环。

实操心得:要榨干C66x的性能,必须转变思维,从“标量思维”转向“向量思维”。在编写C代码时,要善用TI编译器提供的内联函数(intrinsics),如_dotp2_cmpy_dmv等。这些内联函数会直接映射到底层的高效SIMD指令。同时,确保数据在内存中的布局是“向量友好”的(例如结构体数组AoS应转换为数组结构体SoA),以便于一次性加载一个向量到寄存器中进行批量处理。

2.4 内存屏障指令:MFENCE的重要性

在多核、多级缓存(L1D, L1P, L2, MSMC)和DMA并发的复杂系统中,内存操作的顺序性是个大问题。C66x引入了MFENCE指令,这是一个非常重要的同步原语。

当你执行MFENCE后,DSP内核会停滞,直到所有由该内核发起的未完成的内存事务全部完成。这包括:

  • Cache行的填充(Cache line fills)
  • 从L1D到L2或到MSMC/其他端点的写操作
  • victim缓存写回
  • 块或全局一致性操作
  • 缓存模式更改
  • 未完成的XMC预取请求

为什么需要它?假设一个场景:CorePac0通过DMA将计算结果写入MSMC的某块共享内存,然后设置一个标志位(flag)通知CorePac1来读取。如果没有MFENCE,由于写操作可能还在缓存或写缓冲区中,CorePac1可能会在数据实际到达共享内存之前就看到了被设置的标志位,从而读到错误(旧)的数据。在MFENCE之后执行标志位的写入,可以确保数据先行到达,从而保证正确的同步逻辑。

注意事项MFENCE会导致流水线停顿,过度使用会严重影响性能。因此,它只应在关键的同步点使用,而不是随意插入。通常,在释放一个锁(lock)或通知其他核心数据就绪之前,使用一次MFENCE是稳妥的做法。

3. 关键外设模块详解与配置要点

C665x的强大不仅在于内核,更在于其围绕内核构建的一整套高效外设生态系统。这些外设负责与外部世界进行高速、可靠的数据交换,是DSP从“计算器”变为“系统控制器”的关键。

3.1 64位定时器:不仅仅是计时

C6654/C6652共有7个64位定时器。Timer0固定给CorePac作为看门狗,也可用作通用定时器。其余6个均为通用定时器。

三种核心模式

  1. 64位模式:作为一个完整的64位计数器工作。时钟源可以是内部VBUS时钟,也可以是外部引脚(TINPLx)的上升沿。可以产生周期性的输出脉冲(TOUTLx)和内部中断事件(TINTLx)。64位的宽度意味着在低速时钟下也能实现极长的定时周期。
  2. 双32位模式:一个定时器被拆分成两个独立的32位定时器(高32位和低32位)。它们有独立的输入(TINPLx, TINPHx)和输出(TOUTLx, TOUTHx)引脚。这在需要两个相关但独立的定时场景中非常有用,且节省了外设资源。
  3. 看门狗模式(仅Timer0):计数器递减,软件必须在计数到零前“喂狗”(写定时器),否则会触发复位事件。这是系统可靠性的最后防线。

配置要点与避坑指南

  • 时钟源选择:通过CTL寄存器的CP位选择内部时钟或外部输入。做精确时间测量时,外部时钟更准;做内部延时或PWM生成,用内部时钟。
  • 周期与比较寄存器PRD(周期)寄存器决定溢出周期;CMP(比较)寄存器用于在PWM模式下设置占空比。在64位模式下,它们都是64位寄存器(由两个32位寄存器组成,如PRD12PRD34),写入时必须先写高字,后写低字,因为写低字会触发重载。这是一个常见的坑。
  • 中断与事件触发:定时器溢出(TIEN中断使能)和比较匹配(CMPIE中断使能)都可以产生中断。更重要的是,它可以向EDMA3发送同步事件,实现定时器触发DMA传输的自动化操作,极大减轻CPU负担。
  • 看门狗复位配置:看门狗超时后产生何种复位(全局复位、局部复位)是通过TIOCP_CFG寄存器中的SOFT_RESET等位配置的。务必根据你的系统需求设置,比如在调试阶段可能希望只产生中断而非复位。

3.2 增强型信号量:多核共享资源的守门员

在C665x的多核系统中,多个核心或主设备(如EDMA)可能需要访问同一块物理内存或硬件资源。为了防止冲突,就需要信号量(Semaphore)来实现原子化的“锁”操作。

C665x的信号量模块有32个独立的信号量资源。其关键特性是仅允许PrivID为0的主设备访问,通常就是CorePac 0。这意味着信号量的分配和管理软件应由运行在Core 0上的主控任务或操作系统来完成。

两种访问方式

  1. 直接访问:核心直接读取信号量寄存器。如果信号量值为0(空闲),硬件会将其原子性地置为1并返回“获取成功”;如果为1(已被占用),则返回“获取失败”。这个过程是硬件保证的原子操作,不会被打断。
  2. 间接访问:核心向一个已被占用的信号量执行写操作(请求)。当该信号量被释放时,模块会向核心产生一个中断,通知其资源可用。这种方式避免了轮询,节省了CPU资源。

实操心得

  • 软件映射:硬件信号量本身没有预定义用途,需要软件建立映射表。例如,可以约定信号量0保护MSMC中的共享数据区A,信号量1保护某个硬件FIFO的访问权。
  • 避免死锁:使用信号量必须非常小心,确保获取和释放成对出现,且在任何错误路径或中断退出前都要释放锁。在多核编程中,建议采用严格的锁获取顺序来预防死锁。
  • 性能考量:直接访问速度快,但忙等待(busy-wait)会浪费CPU周期。对于持有时间较短的资源,直接访问合适;对于可能被长时间持有的资源,使用间接访问+中断通知更高效。

3.3 多通道缓冲串行端口:经典的音频与通信接口

McBSP是一个高度可配置的同步串行接口,常用于连接音频编解码器、模拟接口芯片或其他串行ADC/DAC。

核心功能与配置

  • 全双工通信:独立的发送和接收通道。
  • 时钟与帧同步:可以内部生成或由外部提供,极大提高了与不同设备的兼容性。
  • 多通道选择:最多支持128个时分复用通道,通过RCERE/XCERE寄存器组使能,可以只接收/发送感兴趣的通道数据,非常灵活。
  • FIFO支持:C665x的McBSP集成了深度可配置的FIFO,可以更好地应对DMA延迟,允许接口以更高的采样率运行。

一个关键配置陷阱:当使用内部采样率生成器(CLKGS)作为时钟源时,采样率生成器寄存器(SRGR)中的CLKGDV字段必须设置为大于或等于1的值CLKGDV决定了内部时钟(CLKG)与输入时钟源(CLKSRG)的分频比。如果误设为0,会导致时钟停止,McBSP无法工作。我曾在调试一个语音项目时,因为忽略了这一点,花了半天时间排查为何McBSP没有数据输出。

典型连接示例:连接一个I2S格式的音频编解码器。需要配置McBSP为:

  • 时钟模式:收发使用相同的内部CLKX和FSX作为主时钟和帧同步。
  • 帧长度:一帧包含左右两个通道(比如32位x2)。
  • 字长:16位或24位,根据编解码器而定。
  • 时钟极性与相位:根据编解码器数据手册设置CLKXPCLKRPFSXPFSRP,确保数据在正确的时钟边沿被采样。

3.4 通用并行端口:面向高速数据流的利器

uPP是一个为高速并行数据流设计的外设,常见于连接高速ADC、DAC或FPGA。它不像传统并行总线那样有一堆地址和控制线,而是用最少量的控制信号(START, ENABLE, WAIT)实现高速、流式的数据传输。

核心特性

  • 高带宽:支持单数据率(SDR)和双数据率(DDR)模式。在DDR模式下,数据在时钟的上升沿和下降沿都有效,理论上带宽翻倍。
  • 独立I/O通道:支持两个独立的通道(I和Q),每个通道数据宽度可独立配置为8/16位。这两个通道可以配置为同向(都发送或都接收)或反向(一个发一个收,即全双工)。
  • 内置DMA:uPP自带DMA控制器,可以自动从内存搬运数据到发送通道,或从接收通道搬运数据到内存,无需CPU干预。这是实现高吞吐量的关键。
  • 数据对齐与打包:支持左对齐、右对齐(带0扩展或符号扩展),方便处理不同位宽的数据。

配置流程与心得

  1. 引脚复用配置:首先,需要通过PINMUX寄存器将相关引脚功能设置为uPP。C665x的引脚通常是复用的,这一步绝对不能忘。
  2. 通道与控制寄存器配置:在UPCTL寄存器中使能uPP模块,并配置通道方向(发送/接收/全双工)、数据宽度、时钟极性等。
  3. DMA描述符设置:这是uPP使用的核心。你需要在内存在设置好DMA描述符链表,告诉uPP DMA数据缓冲区的地址、长度、传输模式(单次、连续)以及下一个描述符的地址。描述符格式在UPID0/UPID1/UPID2等寄存器组中定义。
  4. 启动传输:配置完成后,使能DMA通道,uPP就会开始自动传输。

一个常见问题:当uPP与FPGA对接时,时钟相位和数据对齐很容易出错。我的经验是,先用示波器或逻辑分析仪抓取START、ENABLE、DATA和CLK的时序,与FPGA端的接收逻辑进行严格比对。特别是DDR模式下的数据建立和保持时间,需要根据PCB走线长度进行微调。通常,在uPP的UPICR寄存器中调整时钟延迟(CLK_DELAY)可以解决大部分时序问题。

4. 内存映射与系统地址空间规划

理解C665x的内存映射是进行系统软件设计和优化的基础。它定义了CPU、DMA以及所有外设“看到”的地址空间。C665x采用统一的32位逻辑地址空间,但内部通过内存保护与地址扩展单元(MPAX)可以映射到更大的36位物理地址空间,主要用于访问超过4GB的DDR内存。

4.1 关键内存区域解析

查看内存映射表,我们可以识别出几个最关键的区域:

  • L1和L2 SRAM(核心本地内存)

    • L1P SRAM:地址0x00E0 0000-0x00E0 7FFF(32KB)。这是程序缓存(L1P)的底层SRAM,可以被配置为缓存或直接映射的RAM。对于最关键的、要求绝对确定性的代码段(如中断服务程序),可以锁定在L1P RAM中,避免缓存抖动带来的延迟不确定性。
    • L1D SRAM:地址0x00F0 0000-0x00F0 7FFF(32KB)。这是数据缓存(L1D)的底层SRAM,同样可配置为缓存或RAM。用于存放最频繁访问的数据或需要极低延迟的缓冲区。
    • L2 SRAM:地址0x0080 0000-0x008F FFFF(1MB)。这是共享的二级缓存/SRAM,速度比DDR快得多,容量又比L1大。它是系统性能优化的主战场。通常将整个应用程序的代码和数据段放在L2中,并将L2配置为部分缓存(比如256KB)、部分SRAM(比如768KB)的混合模式。
  • 外设配置空间(CFG Space)

    • 地址范围大致在0x01C0 0000-0x02FF FFFF。所有外设的控制寄存器都映射在这个区域。例如,Timer0在0x0220 0000, GPIO在0x0232 0000, EDMA3CC在0x0274 0000等。CPU通过加载/存储指令访问这些地址来配置和控制外设。
  • DDR3外部内存

    • 默认映射起始于0x8000 0000,容量可达2GB(通过MPAX可扩展)。这是系统的主内存,用于存放大量的应用程序代码、数据和缓冲区。访问DDR的延迟远高于片上SRAM,因此必须通过合理的缓存策略和DMA预取来隐藏延迟
  • 引导ROM

    • 地址0x20B0 0000-0x20B1 FFFF(128KB)。里面固化了一级引导加载程序(RBL),负责最开始的设备初始化和二级引导加载程序(如UBL)的加载。

4.2 内存保护单元:系统稳定的卫士

C665x提供了多个MPU,用于定义不同主设备(如CPU、EDMA)对不同内存区域的访问权限(读、写、执行)。这对于构建健壮的多任务或多核系统至关重要,可以防止错误代码覆盖关键数据或执行非法内存区域。

配置MPU的一般步骤

  1. 定义区域:每个MPU可以定义多个重叠的区域。每个区域由起始地址、结束地址和访问权限组成。
  2. 设置权限:为每个区域设置哪些主设备(通过PrivID标识)可以读、写或执行。
  3. 启用MPU:配置完成后,启用MPU。任何违反权限的访问都会触发一个异常(如总线错误)。

经验之谈:在系统初始化早期,就应该配置MPU。一个基本的保护策略是:将引导ROM和关键外设配置寄存器区域设置为只读;将未使用的内存区域设置为不可访问,以捕捉非法指针访问;为每个任务或核心分配独立的数据段,并设置相应的读写权限,实现内存隔离。

5. 启动流程深度剖析与实战配置

系统上电或复位后,DSP如何开始执行你的代码?这个过程就是启动。C665x的启动流程灵活且强大,支持从多种设备引导,是硬件设计者和底层软件工程师必须掌握的核心知识。

5.1 启动模式引脚与DEVSTAT寄存器

启动过程始于硬件。芯片上有一组BOOTMODE[12:0]引脚,在上电复位时,这些引脚的电平状态会被锁存到设备状态(DEVSTAT)寄存器中。Boot ROM中的代码会读取DEVSTAT的值,从而决定后续的引导行为。

BOOTMODE[12:0]这13位被分为几个字段:

  • BOOTMODE[2:0] - 引导设备选择:这是最关键的三位,决定了从哪个外设加载二级引导程序。
  • BOOTMODE[9:3] - 设备配置字段:根据选择的引导设备,这7位用于配置该外设的具体参数,如波特率、数据宽度等。
  • BOOTMODE[12:10] - 其他配置:可能包含PLL倍频设置、I2C/SPI从设备地址等。

5.2 主流启动模式详解与硬件设计

5.2.1 I2C EEPROM启动(BOOTMODE[2:0] = 5‘b101)

这是最常用、最可靠的启动方式之一。Boot ROM会作为I2C主设备,从一个外部EEPROM(如24LC系列)的指定地址开始读取数据。

  • 硬件连接:将DSP的I2C时钟(SCL)和数据(SDA)引脚连接到EEPROM。通常需要上拉电阻。BOOTMODE[12:10]用于指定EEPROM的7位I2C从地址。
  • 软件镜像格式:存储在EEPROM中的数据不是原始的二进制(.bin),而是TI特定的格式,通常是一个包含大小端信息、目标地址、数据段等的引导表。需要使用TI的hex6x工具和AISgen工具将.out文件转换成.ais格式,再烧录到EEPROM。
  • 优点:电路简单,成本低,可靠性高,适合中小规模代码。
  • 注意事项:I2C速度较慢,不适合引导非常大的镜像。要确保EEPROM的地址与BOOTMODE引脚设置一致。
5.2.2 SPI Flash启动(BOOTMODE[2:0] = 5‘b110)

与I2C类似,但从SPI Flash(如W25Q系列)启动。速度通常比I2C EEPROM快。

  • 硬件连接:连接DSP的SPI引脚(CLK, SOMI, SIMO, CS)到Flash。BOOTMODE[9:3]中的某些位用于配置SPI的模式(时钟极性、相位)和片选。
  • 镜像格式:同样需要生成.ais格式的镜像。SPI Flash通常容量更大,可以存放多个镜像或文件系统。
  • 优点:速度较快,存储容量大,是更通用的选择。
5.2.3 EMIF16 NOR Flash启动(BOOTMODE[2:0] = 5‘b000, Submode=4)

从并行NOR Flash启动,可以获得最快的引导速度,因为它是16位并行接口。

  • 硬件连接:将DSP的EMIF16地址线、数据线(D[15:0])、控制线(CE, OE, WE)连接到NOR Flash。BOOTMODE[9:3]用于配置数据宽度(8/16位)、是否使能等待(Wait Enable)和使用的片选(Chip Select)。
  • 一个关键限制:根据数据手册,EMIF16启动目前固定从CS2(EMIFCE0)引导,BOOTMODE中关于片选的配置位暂时无效。硬件设计时必须将NOR Flash连接到EMIF的CS2上。
  • 镜像放置:NOR Flash是线性地址映射的。经过转换的引导镜像(通常是.ais或纯二进制)需要从NOR Flash的起始地址(对应EMIF CS2的基地址0x70000000)开始存放。Boot ROM会直接从该地址读取并执行。
  • 优点:引导速度极快,适合对启动时间要求苛刻的应用。
  • 缺点:占用EMIF总线,引脚数较多。
5.2.4 以太网启动(仅C6654, BOOTMODE[2:0] = 5‘b010)

这是KeyStone架构的高级特性,允许通过以太网(SGMII接口)从远程主机下载程序。通常用于工厂批量生产烧录或现场远程更新。

  • 流程:Boot ROM会初始化以太网MAC和PHY,然后尝试通过TFTP或BOOTP协议从网络服务器获取引导镜像。
  • 配置:需要正确配置BOOTMODE[9:3]来设置MAC地址获取方式(从EEPROM或通过引脚状态)、IP地址获取方式(DHCP或静态)等。
  • 优点:无需物理接触设备即可更新程序,非常灵活。
  • 挑战:需要网络环境支持,且Boot ROM支持的协议可能有限,通常需要搭配主机端的特定服务器软件。
5.2.5 无启动模式(No Boot)

BOOTMODE[2:0]=000且Submode=0时,设备进入无启动模式。Boot ROM不会从任何外设加载代码,而是直接将CPU释放,从地址0x20B00000(Boot ROM入口)开始执行。这通常用于通过仿真器(JTAG)直接加载和调试程序,是开发阶段最常用的模式。

5.3 二级引导加载程序:从AIS到你的应用

Boot ROM完成的工作被称为一级引导(RBL)。它通常只负责初始化最基本的外设(如PLL、DDR)并从存储设备加载一个二级引导加载程序到内存(通常是L2 SRAM的指定区域0x008EFD00-0x008FFFFF),然后跳转执行。

这个二级引导程序(在TI的SDK中通常是UBL或自定义的引导程序)功能更强大,它可以:

  1. 初始化更复杂的外设(如DDR3控制器、更精确的PLL)。
  2. 从Flash中读取多个应用程序镜像。
  3. 进行镜像的完整性校验(如CRC)。
  4. 根据不同的情况(如按键状态)选择加载不同的应用程序。
  5. 最终将应用程序搬移到其运行地址(如DDR中),并跳转执行。

实战配置流程

  1. 硬件设计:根据选择的启动模式,正确连接存储器件(EEPROM、SPI Flash、NOR Flash)到DSP的对应引脚,并通过电阻准确设置BOOTMODE引脚的上拉/下拉状态。
  2. 生成引导镜像:在CCS中,你的应用程序编译链接后生成.out文件。使用hex6x工具将其转换为.hex文件,再使用AISgen图形化工具(或脚本)根据你的硬件配置(启动模式、PLL频率、DDR参数等)生成最终的.ais二进制镜像。对于NOR Flash启动,有时也可以直接使用纯二进制(.bin)格式。
  3. 烧录存储器件:通过编程器(如Flash烧录器)或DSP本身的仿真器接口,将.ais镜像写入到EEPROM/Flash的指定偏移地址(I2C/SPI)或起始地址(NOR)。
  4. 上电测试:给板卡上电,用示波器测量相关引脚(如UART TX)或通过仿真器连接,查看DSP是否成功运行到你的应用程序。

一个经典的排查问题:如果DSP无法启动,首先检查BOOTMODE引脚电平是否正确(用万用表量)。其次,用仿真器连接,在“No Boot”模式下,单步跟踪Boot ROM代码(如果TI提供符号文件),看它在哪里出错。常见问题包括PLL配置失败(检查输入时钟)、DDR初始化失败(检查配置参数与硬件是否匹配)、从外设读取数据失败(检查连线、上拉电阻和器件地址)。