TMS320DM643x系列DSP的ROM Bootloader是固化在芯片内部ROM中的一段启动代码,起始地址为0x00100000。这段代码在芯片上电复位(POR)后首先执行,负责完成硬件初始化和应用程序加载的关键任务。
Bootloader的核心工作机制是通过读取BOOTCFG寄存器的值来确定启动模式。这个寄存器在上电复位时由硬件自动配置,其值取决于芯片特定引脚(如BOOTMODE[3:0]、PCIEN、FASTBOOT等)的电平状态。这种设计允许开发者通过简单的硬件连线选择不同的启动方式。
关键提示:BOOTCFG寄存器的配置是在POR复位信号的上升沿被锁存的,这意味着在系统运行期间修改这些引脚电平不会影响当前的启动模式,必须通过硬件复位才能改变启动配置。
Bootloader支持三大类启动模式,每种模式下又有若干子模式:
在这种模式下,设备在启动期间工作在默认的PLL旁路模式,CPU时钟直接来源于输入时钟CLKIN(通常为27MHz)。这种模式的特点是:
这种模式下,Bootloader会根据固定的PLL倍频系数加速设备启动。特点包括:
这是最灵活的启动模式,允许用户通过PLLMS[2:0]引脚选择PLL倍频系数。特点包括:
EMIFA(External Memory Interface)启动是DM643x最常用的启动方式之一,分为三种子模式:
这是最简单的启动方式,硬件直接跳转到EMIFA存储器地址0x42000000执行代码,不经过Bootloader软件干预。特点包括:
这种模式下,Bootloader会先配置PLL提高系统时钟,然后从EMIFA地址0x42000000读取AIS格式的镜像文件。启动流程为:
与带AIS的模式类似,但不需要AIS格式。Bootloader配置PLL后直接跳转到0x42000000执行。这种模式:
I2C启动模式下,Bootloader会配置I2C外设为主设备,从连接的EEPROM中读取AIS格式的镜像。关键配置点包括:
重要限制:I2C启动仅在CLKIN频率为21-30MHz时可用,且只支持16位地址宽度的EEPROM。
这种模式使用McBSP0接口模拟SPI主设备,支持需要16位地址、8位数据的SPI EEPROM。关键特性:
连接示意图:
code复制SPI EEPROM McBSP0
----------- ------
Sn (片选) -> FSX0
C (时钟) -> CLKX0
D (数据输入)-> DX0
Q (数据输出)<- DR0
UART启动是唯一的交互式启动模式,Bootloader会与主机进行握手通信:
两种UART模式的区别:
在这种模式下,Bootloader进入软件循环等待仿真器连接。所有FASTBOOT选项都被忽略,PLL工作在旁路模式,CPU时钟保持为CLKIN频率。
HPI模式下DSP作为从设备,等待主机通过HPI接口加载代码。流程包括:
PCI启动要求FASTBOOT=1以确保满足PCI时序要求。带自动初始化的模式(0010b)需要I2C EEPROM存储PCI配置数据,起始地址为0x400,格式必须符合规范。
DM643x包含两个PLL控制器(PLLC1和PLLC2),Bootloader主要使用PLLC1来加速CPU时钟。PLL配置涉及三个关键参数:
CPU频率计算公式:
code复制CPU频率 = (CLKIN × PLLM) / CLKDIV1
例如,CLKIN=27MHz,PLLM=x20,CLKDIV1=/2时:
code复制CPU频率 = (27 × 20) / 2 = 270MHz
这种模式下PLL倍频系数固定为:
通过PLLMS[2:0]引脚可选择以下倍频:
| PLLMS[2:0] | 倍频 | 27MHz时的CPU频率 |
|---|---|---|
| 000 | x20 | 270MHz |
| 001 | x15 | 202MHz |
| 010 | x16 | 216MHz |
| 011 | x18 | 243MHz |
| 100 | x22 | 297MHz |
| 101 | x25 | 337MHz |
| 110 | x27 | 364MHz |
| 111 | x30 | 405MHz |
必须注意以下时钟限制:
AIS(Application Image Script)是TI专有的引导镜像格式,本质上是一种包含命令和数据的脚本语言。使用AIS格式可以:
典型的AIS文件包含:
| 命令 | 操作码 | 功能描述 |
|---|---|---|
| SET | 0x58535901 | 设置寄存器值 |
| LOAD | 0x58535905 | 加载数据到内存 |
| JUMP_CLOSE | 0x5853590B | 跳转到指定地址并关闭AIS引擎 |
| CRC | 0x58535908 | 计算/验证CRC |
以下是SPI EEPROM中AIS镜像的典型布局:
| 偏移量 | 内容 | 说明 |
|---|---|---|
| 0x0000 | 保留 | 必须为0 |
| 0x0004 | 0x41504954 | AIS魔术数字 |
| 0x0008 | SET命令 | 配置PLL/外设 |
| ... | ... | 更多SET命令 |
| 0x0100 | LOAD命令 | 加载代码到IRAM |
| ... | 应用程序代码 | 实际的程序二进制 |
| 0x8000 | JUMP_CLOSE | 跳转到应用程序入口 |
code复制DSP引脚 EEPROM引脚
------- -----------
I2C_SCL SCL
I2C_SDA SDA
GND A0,A1,A2 (接地)
VCC WP (写保护,通常接地)
code复制DSP引脚(McBSP0) EEPROM引脚
--------------- -----------
FSX0 Sn (片选)
CLKX0 C (时钟)
DX0 D (数据输入)
DR0 Q (数据输出)
在实际项目中,我们曾遇到一个典型案例:客户使用I2C启动时经常失败,最终发现是I2C上拉电阻值过大导致信号上升时间不满足要求。将4.7kΩ电阻改为2.2kΩ后问题解决。这提醒我们,Bootloader调试不仅要关注软件配置,硬件设计同样关键。