2. DSP启动模式详解:启动模式分类、引脚配置与状态机

大家好,欢迎来到第二章。上一章我们聊了DSP上电后那“惊心动魄”的第一秒,这一章咱们深入聊聊DSP的“出身选择”——启动模式。

说白了,DSP就是个“死脑筋”,它上电后不知道自己该干嘛。它得先看看几个引脚的电平,然后决定:我是从内部ROM启动?还是从外部Flash启动?还是等着别人给我灌代码?

我个人习惯把启动模式理解成DSP的“投胎方式”。选对了,事半功倍;选错了,板子可能连灯都不闪。

2.1 启动模式分类:五花八门的“投胎”方式

不同系列的DSP支持的启动模式略有差异,但主流模式就那么几种。我列个表,大家先混个脸熟:

启动模式 接口类型 典型应用场景 速度
HPI启动 并行主机接口 多处理器系统,由主CPU加载
PCI启动 PCIe总线 PCIE插卡设备,由主机加载
EMIF启动 外部存储器接口 从NOR Flash/NAND Flash启动
I2C启动 I2C总线 从I2C EEPROM加载小代码
SPI启动 SPI总线 从SPI Flash加载,最常用
UART启动 串口 调试阶段,从PC下载代码

嗯,这里要注意:不是所有DSP都支持所有模式。比如C2000系列就没有PCI启动,而C6000系列对HPI支持得比较好。选型的时候一定要看数据手册的Boot Mode章节。

2.2 启动引脚配置:DSP的“八字”

DSP怎么知道自己该用哪种模式?靠的是启动引脚(Boot Mode Pins)。

这些引脚通常在芯片复位时被采样,然后锁存到内部寄存器里。我见过不少新手,板子画好了,结果启动引脚没拉对,焊上去死活跑不起来。

举个例子,TI的C6748 DSP,它的启动模式由BOOT[7:0]这8个引脚决定。比如:

  • BOOT[7:0] = 0x01:SPI Flash启动
  • BOOT[7:0] = 0x02:I2C EEPROM启动
  • BOOT[7:0] = 0x04:UART启动
  • BOOT[7:0] = 0x08:EMIF NOR Flash启动
我曾经踩过的坑: 有一次做项目,板子回来发现DSP不启动。查了两天,最后发现是启动引脚的上拉电阻虚焊了。复位时引脚电平不确定,DSP随机选了个启动模式,结果自然是不工作。从那以后,我每次画板子都会在启动引脚上加测试点,方便万用表量。

配置方式一般有两种:

  1. 硬件拉高/拉低:通过电阻直接接到VCC或GND。简单可靠,但改模式要换电阻。
  2. 通过GPIO复用:有些DSP允许在复位后通过GPIO重新配置启动模式。灵活,但需要额外代码。

2.3 启动流程状态机:DSP的“人生轨迹”

DSP的启动过程,本质上是一个状态机。我画了张图,大家感受一下:

复位状态 采样启动引脚 加载Bootloader 校验与跳转 用户程序运行 校验失败,重新采样 图:DSP启动流程状态机示意图

这个状态机其实不复杂,我拆开来讲:

第一步:复位状态

上电或按下复位键后,DSP进入复位状态。此时所有外设复位,CPU停止执行。内部PLL开始锁定,大概需要几百微秒到几毫秒。

第二步:采样启动引脚

复位释放后,DSP的第一件事就是采样启动引脚。它会读取这些引脚的电平,然后查内部的一张“启动模式表”,决定下一步怎么走。

小技巧: 有些DSP允许在复位期间改变启动引脚的电平。比如先用默认模式启动,然后通过软件复位,再切换到另一个模式。这在调试时特别有用。

第三步:加载Bootloader

根据采样结果,DSP会从对应的外设加载一小段代码——也就是Bootloader。这段代码通常很小,几KB到几十KB不等。

你想想看,如果是从SPI Flash加载,DSP会先初始化SPI控制器,然后发送读命令,把Flash里的数据搬进内部RAM。如果是从UART加载,那就得等PC发数据过来。

第四步:校验与跳转

代码加载完成后,DSP会做校验。常见的有CRC校验、Magic Number校验。如果校验通过,就跳转到加载的代码入口地址执行。如果失败,有些DSP会尝试下一个启动模式,有些则直接死循环。

避坑指南: 我曾经遇到过一个问题:Bootloader加载成功了,但跳转后程序跑飞。查了半天,发现是链接脚本里入口地址写错了。Bootloader加载到0x8000,但跳转地址写成了0x8004。嗯,从那以后我每次都会仔细核对.map文件里的入口地址。

第五步:用户程序运行

跳转成功后,DSP就开始执行用户程序了。这时候Bootloader的任务就完成了,它占用的RAM也可以被用户程序覆盖掉。

2.4 各启动模式的特点与选型建议

说了这么多,到底该选哪种启动模式?我根据经验给点建议:

  • SPI启动:最常用,性价比高。SPI Flash便宜、容量大、引脚少。适合大多数嵌入式产品。
  • EMIF启动:速度快,适合需要快速启动的场景。但NOR Flash贵,引脚多,占PCB面积大。
  • I2C启动:引脚最少(只需要两根线),但速度慢,容量小。适合代码量很小的场景。
  • UART启动:调试专用。产品量产时基本不会用,因为需要PC配合,太慢了。
  • HPI/PCI启动:多处理器系统专用。DSP作为协处理器,由主CPU加载代码。

我个人习惯是:量产产品用SPI启动,调试阶段用UART启动。这样既保证了量产时的可靠性,又保留了调试的灵活性。

好了,这一章的内容就到这里。启动模式是DSP开发的“第一道坎”,跨过去后面就顺了。下一章我们开始动手写Bootloader代码,到时候会用到今天讲的知识。


公众号:蓝海资料掘金营,微信deep3321