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启动
配置方式一般有两种:
- 硬件拉高/拉低:通过电阻直接接到VCC或GND。简单可靠,但改模式要换电阻。
- 通过GPIO复用:有些DSP允许在复位后通过GPIO重新配置启动模式。灵活,但需要额外代码。
2.3 启动流程状态机:DSP的“人生轨迹”
DSP的启动过程,本质上是一个状态机。我画了张图,大家感受一下:
这个状态机其实不复杂,我拆开来讲:
第一步:复位状态
上电或按下复位键后,DSP进入复位状态。此时所有外设复位,CPU停止执行。内部PLL开始锁定,大概需要几百微秒到几毫秒。
第二步:采样启动引脚
复位释放后,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