MPC8272通过HDI16接口引导MSC711x DSP的实战指南
1. 项目概述与核心价值
在嵌入式系统开发,尤其是涉及多处理器协同工作的复杂场景里,如何让一个“空白”的从处理器(Slave)在加电后顺利跑起来,是每个工程师都会遇到的第一个硬骨头。今天要聊的这个项目,就是基于飞思卡尔(Freescale,现为NXP的一部分)经典的MSC711x系列DSP和MPC8272通信处理器,通过HDI16接口实现启动引导的实战技术。这不仅仅是把代码从一个芯片搬到另一个芯片那么简单,它涉及到硬件接口的精确配置、底层通信协议的握手、内存控制器的微指令编程,以及一整套确保数据完整性的校验机制。如果你正在折腾一个以MPC8272为主控、MSC711x为协处理器的通信或网络设备,比如某些早期的网关、基站或工业控制器,那么这套从主机引导从机的技术,就是你绕不开的必修课。它的核心价值在于,允许你将主处理器的丰富外设(如Flash、网络)作为存储介质,来引导一个没有独立非易失存储器的DSP,极大地简化了系统设计,降低了成本。
2. 启动引导基础原理深度解析
2.1 MSC711x的启动“基因”
当MSC711x设备(以MSC7115为例)从复位状态唤醒时,其内部是一片“荒芜”——用户代码尚未就位。此时,救世主登场:固化在芯片内部ROM中的Bootloader程序。这个Bootloader是芯片出厂时就烧录好的,它的唯一使命就是初始化芯片,并从外部世界“搬运”第一段代码进来。
MSC711x提供了多种“搬运”路径,具体走哪条路,由两个关键的硬件引脚BM[1:0]在上电复位(PORESET)的上升沿被采样决定。这个选择就像给设备定下了“出生设定”:
| BM1 | BM0 | 启动源 |
|---|---|---|
| 0 | 0 | 通过HDI16接口从外部主机启动,且PLL(锁相环)被禁用。 |
| 0 | 1 | 通过I2C端口启动。 |
| 1 | 0 | 通过HDI16接口从外部主机启动,且PLL被启用。 |
| 1 | 1 | 保留(通常无效)。 |
注意:
BM[1:0]的采样是一次性的,仅在每次上电复位(PORESET)时发生。后续的硬复位(HRESET)或软复位不会重新采样这些引脚,这意味着一旦上电,启动模式就固定了,除非你重新断电上电。
选择HDI16启动,意味着MPC8272这位“主机”将扮演代码搬运工的角色。整个启动流程可以概括为:MSC711x复位 → 执行ROM Bootloader → Bootloader通过HDI16等待主机连接 → 主机(MPC8272)发送代码块 → MSC711x接收并校验代码 → 跳转到用户代码执行。
2.2 两级引导:小引导程序与大应用程序
在实际工程中,我们很少直接将庞大的应用程序通过HDI16一股脑塞进去。更常见的是一种“两级引导”策略:
- 加载用户引导程序(User Boot Program):利用ROM Bootloader,通过HDI16先将一个体积小巧、功能专一的用户引导程序加载到MSC711x的M1内存中。这个程序通常只有几KB,它的唯一任务就是为加载真正的应用程序做准备。
- 加载应用程序(Application Code):用户引导程序接管后,它可以利用更复杂的逻辑(例如,从主机的SDRAM、通过其他更快的接口如Enhanced Local Bus),将庞大的最终应用程序加载到MSC711x的EMI(外部存储器接口)或其他内存区域。
这样做的好处显而易见:灵活性。ROM Bootloader的功能是固定的、简单的,而用户引导程序是你可以完全自定义的。你可以在用户引导程序里初始化更复杂的时钟(如使能PLL到更高频率)、配置DMA、甚至进行一些简单的硬件自检,为加载和运行最终应用创造一个更完善的环境。
2.3 复位后的芯片状态
了解芯片从复位状态出来时的“默认配置”至关重要,这决定了你的引导程序最初运行的环境:
- 指令缓存(ICache):被禁用。这意味着最初的代码执行效率会较低,所有指令都直接从内存读取。
- 锁相环(PLL):根据
BM[1:0]的采样值,可能被旁路(使用外部输入时钟直接分频)或使能。如果选择BM[1:0]=00(PLL禁用),则芯片以较低的核心频率运行,这会直接影响HDI16接口的通信速度,主机侧的UPM时序必须匹配这个“慢速模式”。 - 软件看门狗定时器:被禁用。在引导加载期间,你不用担心它会超时复位芯片。
- 中断:可屏蔽中断被禁用,不可屏蔽中断(NMI)被使能。引导过程通常不希望被普通中断打扰。
3. HDI16接口启动编程详解
3.1 从机(MSC711x)侧配置
对于通过HDI16启动,MSC711x侧的Bootloader已经将端口配置为一种特定的“从机轮询模式”:
- 模式:非DMA模式。数据传输由主机主动发起,从机被动接收。
- 操作模式:轮询模式。MSC711x的Bootloader会轮询HDI16的状态寄存器,等待主机数据。
- 数据格式:主机必须以64位(4个16位字)为一个基本单元进行写入。这4个字被写入MSC711x HDI16的四个发送寄存器:
TX0(最高有效字),TX1,TX2,TX3(最低有效字)。Bootloader会一次性将这64位数据取走。 - 数据对齐与字节序:加载地址必须对齐在16字节边界。数据必须为大端格式(Big-Endian),即高位字节存放在低地址。
3.2 主机(MPC8272)侧的核心:UPM编程
MPC8272的内存控制器是其与外部设备通信的桥梁,而其中的用户可编程机器(UPM)则是实现与MSC711x HDI16这种“非标准”内存设备接口的关键。UPM本质上是一个微序列器,它通过执行存储在内部RAM数组中的“微指令”(或称“模式字”),来精确控制每个时钟周期下地址线、数据线、片选、读写等信号的电平和时序。
为什么必须用UPM?因为HDI16接口的时序(建立时间、保持时间、读写周期长度)并非标准的SDRAM或SRAM时序。通用片选机器(GPCM)虽然简单,但其时序是固定的,无法满足HDI16握手信号(如HREQ/HACK)的精确控制需求。UPM提供了单周期级别的可编程能力,允许我们“画”出HDI16通信所需的任何波形。
UPM编程基本步骤:
- 设置基址/选项寄存器(BRx/ORx):划定一个地址空间映射到HDI16接口。例如,将CS6片选空间映射到HDI16的地址范围,并配置相应的位宽(16位)、端口大小等。
- 编写模式字到RAM数组:这是最核心也最繁琐的一步。你需要根据MPC8272参考手册和HDI16的时序要求,编写一系列32位的模式字。每个字控制一个
UPWAIT(可理解为半个总线时钟周期)内各信号线的行为。你需要为读操作、写操作、甚至空闲周期分别编写对应的模式序列。 - 配置刷新定时器(如需要):对于DRAM类设备需要,HDI16是静态接口,通常不需要。
- 设置机器模式寄存器(MxMR):选择UPM的工作模式,例如触发我们编写好的读/写序列。
实操心得:编写UPM模式字时,务必对照MPC8272参考手册中关于UPM RAM数组位定义的表格,以及MSC711x数据手册中HDI16接口的时序图。一个常见的坑是
GPLx(通用输出线)与BCTLx(字节使能/控制线)的配置混淆。GPLx通常用于生成像HRW(读写)、HDS(数据选通)这样的控制信号,而BCTLx可能与字节使能相关。在连接HDI16时,我们通常用GPL0模拟HRW,用GPL1模拟HDS。
3.3 主机侧引导加载流程拆解
主机(MPC8272)上的引导加载程序,需要严格遵循一个状态机流程来与MSC711x的ROM Bootloader对话:
- 初始化与等待:主机首先配置好自己的UPM、GPIO等,然后复位MSC711x。之后,主机需要轮询HDI16的
ISR[HF5]位。这个标志位由MSC711x的SC1400内核设置,当HDI16端口初始化完成并准备好接收数据时,该位会被置起。这是主机与从机建立通信的第一步握手。 - 设置校验标志(可选):如果希望进行校验和验证以确保数据传输无误,主机应在开始传输数据前,设置
ICR[HF3]位。这会告知MSC711x的Bootloader:“请对每个数据块进行校验和检查”。 - 数据传输循环: a. 主机准备一个符合格式的“数据记录”(下文详述)。 b. 主机将记录的64位数据写入MSC711x的
TX3-TX0寄存器(注意顺序:先写TX3(LSW),最后写TX0(MSW)以触发传输?这里需要澄清:根据文档,写入TX0(地址0x4)会触发传输,但数据必须已就绪。稳妥做法是按TX3->TX2->TX1->TX0的顺序写入,最后写入TX0作为触发)。 c. 写入后,主机轮询ISR[TXDE]位。当该位为1,表示发送寄存器空,可以接收下一组64位数据。 d. 重复b-c,直到一个数据记录发送完毕。 - 块结束与校验:一个数据记录发送完成后,MSC711x会计算校验和并与记录中附带的校验和对比。如果启用了校验(
HF3=1)且对比失败,MSC711x会设置ISR[HF7]错误标志位(此位是粘滞的,一旦置位将持续到传输结束)。主机应在发送完所有数据后检查此位。 - 流程结束与跳转:所有数据记录发送完毕后,主机需要发送一个特殊的“结束记录”(块大小为0)。这个记录里包含了一个“目标地址”。当MSC711x收到结束记录并完成最后的数据加载后,便会跳转到这个目标地址开始执行用户代码。同时,MSC711x会设置
ISR[HF4]位,通知主机加载已完成。
4. HDI16引导数据记录结构剖析
数据在传输时并非杂乱无章的字节流,而是被组织成具有严格格式的“记录”。每个记录都包含一个“数据块”,用于加载到内存的某个特定区域。
一个标准数据记录包含以下字段(按传输顺序):
- 块大小(32位):指明本记录中包含的16位数据字的数量(N)。注意,整个记录的长度(从块大小字段开始到校验和字段结束)必须是8字节(64位)的整数倍。因此,N必须满足公式:
N = 4 * M + 2(M为整数)。最后的“+2”是为两个16位的校验和预留的。最小的N是2(当M=0时),即一个只有块大小、加载地址和两个校验和的“空”数据块。 - 加载地址(32位):指定本记录数据要加载到MSC711x内存中的起始地址。必须16字节对齐。
- 引导数据(N x 16位):实际的程序代码或数据。必须是大端格式。
- 校验和1(16位):预期的校验和值的反码(One‘s complement)。
- 校验和2(16位):预期的校验和值。
校验和计算(可选但推荐):如果主机设置了ICR[HF3],MSC711x的Bootloader会对每个记录计算校验和。计算范围通常包括:块大小、加载地址和所有的引导数据字。计算方式通常是这些16位字的累加和(或XOR),具体算法需参考MSC711x的Bootloader源码或详细文档。主机在生成记录时,必须用同样的算法预先计算好校验和并填入记录末尾的两个字段。
结束记录:整个引导数据流的终结由一个特殊的记录标识,其块大小字段为0x00000000。这个记录的结构是固定的8个字(128位):
- 字1-2:
0x0000 - 字3-4:目标地址(32位,需16字节对齐)。Bootloader在完成所有加载后,将跳转到此地址。
- 字5-6: 该结束记录的校验和(计算时包含目标地址)。
- 字7-8:
0x0000
注意事项:记录中的“字”都是指16位。在通过32位或64位总线的主机(如MPC8272)上组织这些数据时,要特别注意字节序的转换和内存对齐。一个常见的错误是在主机内存中把数据结构定义错了,导致发送的字节顺序不符合MSC711x的大端要求。
5. 硬件连接与开发板配置实战
5.1 信号连接与CPLD的作用
在典型的评估板(如MSC711xADS)上,MPC8272与MSC711x的HDI16接口并非直接相连,中间通常会经过一个Altera CPLD(复杂可编程逻辑器件)。这个CPLD扮演了“信号翻译官”和“逻辑胶合”的角色:
- 信号缓冲与驱动:增强信号驱动能力。
- 信号复用与选择:例如,将MPC8272的
DREQ2/DACK2(DMA请求/应答)信号路由到HDI16的HREQ/HACK引脚。 - 极性控制:根据拨码开关
SW5-7(HDPOL)的设置,统一控制HRW、HDS等信号的活跃电平(高有效或低有效)。开发板默认设置为低有效。 - 模式选择:根据
SW5-8(H8BIT)设置总线宽度(16位/8位)。对于HDI16引导,必须设置为16位模式(H8BIT=0)。
关键信号连接示意:
MPC8272数据线[0:15]<->缓冲器<->MSC711x HDI数据线[15:0]MPC8272地址线[28,30]<->缓冲器<->MSC711x HDI地址线[2:0](注:HA3未使用)MPC8272片选CS6/CS7<->CPLD<->MSC711x HCS1/HCS2MPC8272读写控制<->CPLD->MSC711x HRW, HDSMPC8272 DREQ2/DACK2<->CPLD<->MSC711x HREQ/HACK
5.2 开发板拨码开关与跳线设置
正确的硬件配置是成功的第一步。以MSC711xADS板卡为例,需要关注以下开关:
- SW4 (MSC711x上电配置):
BM0,BM1: 这决定了启动模式。要通过HDI16从MPC8272启动,通常需要根据是否使能PLL来设置。例如,设置为01(BM1=0, BM0=1)?不对,查阅输入材料Table 1,从MPC8272主机通过HDI16启动,应选择BM[1:0] = 10(PLL使能)或00(PLL禁用)。具体根据你的时钟设计选择。假设使用PLL使能模式,则BM1=1, BM0=0。SWTE: 测试模式使能,通常关闭(OFF)。DBREQ: 调试请求,通常关闭(OFF)。
- SW5 (事件引脚与HDI配置):
SW5-7 (HDPOL): HDI信号极性。设置为ON(Active Low)或OFF(Active High)需与UPM中GPLx输出极性匹配。板子默认可能是ON(低有效)。SW5-8 (H8BIT): HDI总线宽度。必须设置为OFF(0)以选择16位模式。MSC711xADS不支持8位HDI总线引导。
- SW6 (JTAG链选项):根据你的调试器连接选择。
- JP6 (MPC8272硬复位连接):决定MPC8272的硬复位是否联动MSC711x的硬复位。工厂默认是断开(Disconnected),这意味着你可以独立复位两个处理器。在引导调试时,有时需要联动复位以确保状态同步。
- JP8 (主机使能):必须设置为Enabled,将MPC8272与MSC711x DSP连接起来。
踩坑记录:最容易被忽略的是
SW5-8 (H8BIT)。如果你误设为8位模式,主机将以8位方式访问HDI16,但MSC711x的Bootloader在16位模式下期望64位(4x16)数据传输,这会导致严重的对齐错误和通信失败,现象可能是主机一直轮询不到HF5就绪标志。务必在硬件连接前确认此开关状态。
6. 主机侧引导加载程序实现要点
6.1 程序流程与代码框架
主机侧的引导加载程序(Bootloader)通常运行在MPC8272上,可以用C语言结合内联汇编来编写,特别是UPM模式字的设置部分。其核心流程如下:
// 伪代码框架 int main() { // 1. 硬件初始化 mpc8272_early_init(); // 初始化时钟、内存控制器等 init_uart(); // 可选,用于调试输出 printf("MPC8272 Host Bootloader Start...\n"); // 2. 配置UPM(例如UPMB)用于HDI16接口 // 这是最关键也是最易错的部分 configure_upm_for_hdi16(); // 3. 复位MSC711x (通过GPIO控制其复位引脚) assert_msc711x_reset(); mdelay(10); // 保持复位一段时间 deassert_msc711x_reset(); printf("MSC711x Reset Released.\n"); // 4. 等待MSC711x HDI16就绪 (轮询 ISR[HF5]) while(!is_hdi16_ready()) { // 可加入超时机制 } printf("MSC711x HDI16 Ready.\n"); // 5. (可选)设置校验和使能标志 ICR[HF3] enable_checksum(); // 6. 加载并发送用户引导程序 // 6.1 准备数据记录 struct boot_record *boot_code = get_user_bootloader_image(); // 6.2 发送所有记录 send_boot_records(boot_code); // 7. 检查传输是否成功 (轮询 ISR[HF4] 和 ISR[HF7]) if (is_load_complete() && !is_checksum_error()) { printf("Boot Code Load Success!\n"); } else { printf("Boot Code Load Failed! HF7 error: %d\n", is_checksum_error()); return -1; } // 8. 如果之前是PLL禁用模式,现在可以切换UPM到快速时序(PLL使能后) if (booting_with_pll_disabled()) { switch_upm_to_fast_mode(); printf("UPM switched to fast mode.\n"); } // 9. (验证步骤)向MSC711x发送测试数据并读回验证 run_boot_verification_test(); printf("MSC711x Boot from HDI16 Completed.\n"); return 0; }6.2 UPM配置代码示例
以下是一个简化的UPM模式字配置示例,用于生成符合HDI16写操作的时序。请注意,具体的模式字数值严重依赖于你的MPC8272核心频率、总线频率以及HDI16所需的时序参数(如tDS, tDH, tAS等),必须根据数据手册计算得出。
// 假设使用UPMB,基地址为UPMB_BASE // 定义一些UPM寄存器偏移量 #define UPMB_MPTPR (UPMB_BASE + 0x04) // 刷新定时器,HDI16不用可设0 #define UPMB_MDR (UPMB_BASE + 0x10) // 模式数据寄存器 #define UPMB_MCR (UPMB_BASE + 0x00) // 模式控制寄存器 // UPM RAM数组偏移(对于UPMB) #define UPMB_MAR (UPMB_BASE + 0x108) // 模式地址寄存器 #define UPMB_MDR (UPMB_BASE + 0x10) // 模式数据寄存器 // 示例:编写一个简单的写操作序列到UPM RAM // 这是一个极度简化的示例,真实序列可能包含10-20条指令 void program_upm_ram(void) { volatile uint32_t *upm_ram_ptr = (volatile uint32_t *)UPMB_BASE; // 指向UPM RAM起始 // 将UPM设置为“写模式字”状态 out_be32(&UPMB_MCR, 0x00001000); // 设置OP=01 (Write), MAD=0 // 向UPM RAM写入模式字序列 // 指令格式:每个32位字控制一个UPWAIT周期内各信号的行为 // 假设我们定义一个简单的写周期:CS有效 -> 输出地址/数据 -> 写选通有效 -> 写选通无效 -> CS无效 -> 等待 upm_ram_ptr[0] = 0x0FFF0C00; // CSn=0, GPL0(HRW)=1(写), GPL1(HDS)=1(无效), 其他信号... upm_ram_ptr[1] = 0x0FFF0C04; // 输出地址和数据 upm_ram_ptr[2] = 0x0FFF0C00; // 保持 upm_ram_ptr[3] = 0x0FFF0C08; // 断言HDS (GPL1=0) upm_ram_ptr[4] = 0x0FFF0C00; // 取消断言HDS upm_ram_ptr[5] = 0xFFFF0C00; // 取消断言CSn upm_ram_ptr[6] = 0xFFFF0C00; // 等待状态 // ... 更多指令,可能包括读操作、空闲循环等 // 结束序列,通常最后一条指令跳回起始或空闲状态 upm_ram_ptr[7] = 0xFFFF0C00 | (0 << 2); // 例如,跳转到条目0 // 将UPM设置回运行模式 out_be32(&UPMB_MCR, 0x00000000); }6.3 数据发送函数实现
发送一个64位数据块到MSC711x的TX寄存器的函数需要仔细处理字节序和触发机制。
// 假设已将HDI16接口映射到主机内存地址 hdi16_base #define HDI16_TX0 (*(volatile uint16_t*)(hdi16_base + 0x4)) #define HDI16_TX1 (*(volatile uint16_t*)(hdi16_base + 0x5)) #define HDI16_TX2 (*(volatile uint16_t*)(hdi16_base + 0x6)) #define HDI16_TX3 (*(volatile uint16_t*)(hdi16_base + 0x7)) #define HDI16_ISR (*(volatile uint16_t*)(hdi16_base + 0x2)) #define ISR_TXDE (1 << 1) // 假设TXDE是ISR寄存器的第1位 void send_64bit_block(uint64_t data) { uint16_t word3, word2, word1, word0; // 从64位数据中提取4个16位字(大端序) // data的高16位是word0,低16位是word3 word0 = (uint16_t)((data >> 48) & 0xFFFF); word1 = (uint16_t)((data >> 32) & 0xFFFF); word2 = (uint16_t)((data >> 16) & 0xFFFF); word3 = (uint16_t)(data & 0xFFFF); // 等待发送寄存器空 while (!(HDI16_ISR & ISR_TXDE)) { // 可加入超时处理 } // 按顺序写入TX3到TX0。根据文档描述,写入TX0会触发传输。 // 为确保数据在触发前已就绪,先写TX3, TX2, TX1,最后写TX0。 HDI16_TX3 = word3; HDI16_TX2 = word2; HDI16_TX1 = word1; HDI16_TX0 = word0; // 写入TX0触发64位数据传输 }7. 常见问题排查与调试技巧
7.1 问题速查表
| 现象 | 可能原因 | 排查步骤 |
|---|---|---|
主机轮询不到ISR[HF5]就绪 | 1. MSC711x未正确复位或未启动。 2. BM[1:0]引脚设置错误,未进入HDI16启动模式。3. HDI16硬件连接错误(如片选、时钟)。 4. 主机UPM时序配置错误,导致写操作无法被MSC711x识别。 | 1. 测量MSC711x复位引脚波形,确认复位序列完成。 2. 用示波器或逻辑分析仪检查 BM0/BM1引脚在上电时的电平,并与SW4设置对比。3. 检查 HCS1/HCS2、HRW、HDS等关键信号在主机访问时是否有有效跳变。4. 仔细核对UPM模式字,用逻辑分析仪捕获完整的总线周期,与HDI16时序图对比。 |
数据传输中途卡住,TXDE位一直不置起 | 1. MSC711x侧未能及时取走TX寄存器中的数据。2. 数据记录格式错误,导致MSC711x Bootloader解析失败并挂起。 3. 校验和错误且 HF3被设置,导致MSC711x停止等待。 | 1. 确认MSC711x的PLL(如果使用)是否已锁定?在PLL禁用模式下,时钟很慢,主机需等待更久。 2. 检查发送的数据记录:块大小计算是否正确?加载地址是否16字节对齐?校验和计算是否准确? 3. 暂时禁用校验和( ICR[HF3]=0)进行测试。 |
| 加载完成后,MSC711x不跳转或跑飞 | 1. 结束记录中的“目标地址”错误或未对齐。 2. 加载到M1内存的用户引导程序本身有错误。 3. 内存配置(如M1的访问权限、等待状态)在用户引导程序中未正确初始化。 | 1. 确认结束记录的目标地址是用户引导程序在M1中的正确入口点(通常是第一条指令地址)。 2. 使用仿真器(如JTAG)连接到MSC711x,在加载完成后暂停内核,查看PC指针和目标地址内存内容。 3. 在用户引导程序开头添加简单的“灯闪”或串口输出代码,验证其是否被执行。 |
| 使能PLL后通信失败 | 1. 主机UPM时序未从“慢速模式”切换到“快速模式”。 2. PLL配置参数(倍频、分频)错误,导致MSC711x核心频率与预期不符。 | 1. 在发送结束记录、MSC711x跳转到用户代码并配置PLL后,主机程序需要重新配置UPM,使用更短的等待状态以适应更快的时钟。 2. 检查MSC711x用户引导程序中PLL配置寄存器的值。 |
7.2 调试技巧与工具
- “灯闪”大法:在MPC8272和MSC711x的用户引导程序最开始,分别加上控制GPIO点亮LED的代码。这是判断程序是否运行到某个阶段最直观的方法。
- 串口打印:在MPC8272侧初始化一个串口,用于打印调试信息(如“等待HF5...”、“开始发送记录X”、“校验和错误”等)。在MSC711x侧,如果其用户引导程序包含了串口驱动,也可以输出信息,实现双向调试。
- 逻辑分析仪:这是调试HDI16通信问题的终极武器。连接逻辑分析仪到
HD[15:0],HA[2:0],HCS1,HRW,HDS,HREQ,HACK等关键信号上。可以清晰地看到:- 主机发出的读写周期波形是否符合UPM配置。
- MSC711x是否在主机访问后给出了
HACK应答。 - 数据线上的数据是否与预期一致。
- 通信是否在某个特定阶段停滞。
- JTAG仿真器:用于深度调试MSC711x。可以在Bootloader运行、用户引导程序、应用程序等不同阶段连接仿真器,设置断点,查看内存和寄存器状态,尤其是当程序跑飞时,查看PC指针和异常寄存器。
- 寄存器查看:在MPC8272侧,通过内存映射访问MSC711x的HDI16控制寄存器(如
HPCR,HCR,ISR,ICR),确认其配置和状态是否符合预期。这需要你熟知这些寄存器的位定义。
7.3 关于广播启动的补充
输入材料中提到了“广播启动设施”。这在多DSP系统中非常有用。其核心思想是:主机通过一个“广播片选”信号同时选中多个MSC711x设备,从而将相同的引导代码一次性发送给所有从设备。这要求所有从设备的BM[1:0]配置相同,并且硬件上要将它们的HCS2(广播片选)引脚连接在一起。在软件上,主机在发送引导数据时,同时断言普通片选和广播片选即可。需要注意的是,所有设备将加载到相同的内存地址,因此这种模式适用于对称多处理(SMP)或需要运行完全相同镜像的场景。
