DSP boot load

 


1.内存系统

上述DSP memory支持访问16M(百万)32bit的程序、数据和I/O空间,并允许将表、系数、程序代码或数据存储在RAM或ROM中。通过这种方式,可以最大限度地提高内存使用率,并根据需要分配内存空间。RAM block0和1分别为1Kx32bit。上述memory映射中还包含一个引导ROM。通过操作一个外部引脚(MCBL/MP非)可以配置memory的前1000h个word以寻址片上ROM或外部RAM。每个片上RAM和ROM block可以在单个周期内支持两次CPU访问。独立的程序总线、数据总线和DMA总线允许并行程序获取、数据读/写和DMA操作。

2. 内存映射

内存映射取决于处理器是在微处理器模式(MCBL/MP非 =0)下运行还是在微型计算机模式(MCBL/MP非=1)下运行。这些模式的内存映射相似。

位置 800000h−807FFFh保留。 所有外设总线寄存器的memory映射都位于 808000h−8097FFh 位置。 在这两种模式下,RAM block 0 位于地址 809800h−809BFFh,RAM block 1 位于地址 809C00h−809FFFh。 位置 80A000h−0FFFFFFh通过外部存储器端口访问(STRB非 激活)。

2.1 微处理器模式内存映射

在微处理器模式下,引导加载程序未映射到 '内存映射‘中。 位置 0h-03Fh 由中断向量、陷阱向量和保留位置组成,所有这些都通过外部存储器端口访问(STRB非 激活)。 位置 040h−7FFFFFh 也可以通过外部存储器端口访问。

2.2 微机模式内存映射

在微型计算机模式下,引导加载程序 ROM 映射到位置 0h−0FFFh。 内部 RAM 块 1 的最后 63 个字(809FC1h 到 809FFFh)用于中断和陷阱分支。 位置 1000h−7FFFFFh 通过外部存储器端口访问(STRB非 激活)。

2.3 复位/中断/陷阱向量映射

复位、中断和陷阱向量的地址为 00h-3Fh。 复位向量包含复位routine的地址。
在微处理器模式下,存储在位置0h-3Fh的复位中断和陷阱向量是各自复位、中断和陷阱例程的开始地址 . 例如,在复位时,内存位置 00h(复位向量)的内容被加载到 PC 中,然后从该地址开始执行。
在微型计算机/引导加载程序模式下,存储在位置 809FC1h-809FFFh 中的中断和陷阱向量是分支指令,用于开始相应的中断和陷阱routine.

3. bootloader 

引导加载程序允许加载和执行从主机处理器、EPROM 或其他标准存储设备接收的程序。 要加载的程序驻留在标识为 Boot 1、Boot 2 和 Boot 3 的三个内存映射区域之一,或者通过串行端口接收。 引导加载程序支持用户定义的字节、半字和字数据格式,以及来自串行端口的 32 位固定突发加载。 
引导加载程序代码从片上 ROM 中的位置 0x45 开始。

3.1 引导加载程序模式选择

引导加载程序采用内存引导加载程序或串行端口引导加载程序。 通过将 MCBL/MP非 引脚驱动为高电平的同时复位处理器来选择引导加载程序功能。 使用中断引脚 INT3非 − INT0非 选择引导加载操作。 下图显示了这个操作的流程,它取决于所选的模式(外部存储器或串行端口引导)。

 

bootload 模式选择流程

 bootload 模式选择

3.2 引导加载序列

以下是在源程序的引导加载期间发生的事件序列。 下表显示了源程序的结构。

源数据流结构

1) 通过驱动复位选择引导装载程序
MCBL/MP非 引脚为高电平,相应的 INT3非−INT0非 引脚为低电平。 MCBL/MP非 在引导加载期间必须保持高电平,但可以在引导加载终止后随时更改。 更改 INT3非−INT0非 引脚时无需复位,只要在此转换期间不访问overlapping存储器 (0h−FFFh)。 INT3非−INT0非  引脚可以在取消断言 RESET非 引脚后随时被驱动为低电平(先驱动为低电平,然后驱动为高电平)。
2) 中断标志 (IF) 寄存器的 INT3非−INT0非 位字段的状态决定引导加载模式。 这些位按照上面bootload 模式选择流程中描述的顺序进行轮询。

3) 如果仅设置了 IF 寄存器的 INT3非 位字段,引导加载程序将串行端口配置为使用外部生成的串行端口时钟和 FSR 进行 32 位固定突发模式读取。 然后,它继续从串行端口引导加载源程序。 提供给串行端口的传输数据位顺序必须以最高有效位 (MSB) 开始,以最低有效位 (LSB) 结束。 下图右描述了引导加载程序串行端口流程。

4) 否则,引导加载程序尝试内存引导加载。 下图左显示了引导加载程序内存流程。 如果设置了 IF 寄存器的 INT0 位域,源程序将从内存位置 1000h 加载。 如果设置了 IF 寄存器的 INT1 位域,则源程序从内存位置 400000h 加载。 如果设置了 IF 寄存器的 INT2 位域,则源程序从内存位置 FFF000h 加载。

内存引导加载源程序有一个header,指示引导内存宽度和内存配置控制字。 该字被复制到 STRB非 控制寄存器以配置外部主总线接口。
5) 读取header后,引导加载程序复制源程序块。

源程序块在源程序块数据之前有两个条目。 源程序块中的第一个条目指示块的大小。 块大小为零表示源程序代码结束。第二个条目指示要加载块的地址。 引导加载程序无法将源程序加载到任何低于 1000h 的内存地址,除非重新映射地址解码逻辑。
6) 引导加载程序分支到第一个加载的源块的目标地址并开始执行程序。

2. EPROM 引导加载程序将字、半字或字节宽的程序加载到指定位置。 第一个存储器的 8 个 LSB 指定 EPROM 的存储器宽度。 如果选择了半字或字节宽的程序,则首先加载 LSB,然后是 MSB。接下来的字包含本地存储器寄存器的控制字。 程序块如下。 每个程序块的前两个字包含块大小和要加载到的存储器地址。 当读取零块大小时,程序块加载将终止。 PC 将跳转至第一个程序块的起始地址。
3. 如果选择串行端口 0 进行引导加载,处理器将等待来自接收串行端口 0 的中断并执行下载。 与 EPROM 加载器一样,程序可以加载到不同的存储块中。 每个程序块的前两个字包含块大小和要加载到的存储器地址。 当读取零块大小时,程序块加载将终止。 换句话说,为了终止程序块加载,必须在程序块末尾添加一个零。 引导加载完成后,PC 将跳转至第一个程序块的起始地址。

3.2.1 外部存储器加载示例

下表显示了 32 位宽配置存储器的存储器映像。
这些示例假设如下:
解复位后检测到 INT0 信号(表示引导 1 的外部存储器加载)。 源程序header位于内存位置 0x1000 ,定义如下:
引导存储器型 EPROM需要两个等待状态WCNT=2, 且 SWW = 11 ,
内部 RAM 块 1 开头的加载程序目标地址,将boot 程序搬运到该地址开始的RAM地址空间处
长度为 0x1FF 的单个内存块

读取header后,加载程序向指定的目标地址 0x 809C00 开始传输 0x1FF个32 位字。 加载器还可以向不同的目标地址加载多个代码块。
加载所有代码块后,引导加载程序跳转到第一个加载块的目标地址并开始执行程序。 因此,加载的第一个代码锁是访问其他加载程序的启动例程。

3.2.2 串口加载

通过在复位后将 INT3 引脚驱动为有效(低电平)来选择通过串口引导加载 。 加载程序自动配置串行端口加载方式为 32 位固定突发模式读取。 它由帧同步接收 (FSR) 信号驱动中断。 不能更改此引导加载模式。 硬件必须在外部生成串行端口时钟和 FSR。 与内存加载一样,header必须位于要加载的实际程序之前。 但是,只需提供块大小和目标地址,因为加载程序和硬件已经预定义了串行端口速度和数据格式(即,跳过数据字 0 和 1)。传输的数据位顺序必须以 MSB 开始,以 LSB 结束。

3.3 bootloader 操作

MCBL/MP非 =1时,内部 ROM 被解码到地址范围 0x000000--0x000FFF。 因此,当复位发生时,内部 ROM 程序和向量空间开始执行。 在启用其中一个boot选项之前,不会出现明显的外部活动。 这些选项通过将外部中断引脚拉低来启用,引导加载软件随后检测到,从而导致执行特定routine(参见表 5)。

 MCBL/MP非=1时,复位和中断向量被硬编码在内部 ROM 中。 由于ROM是只读设备,因此无法修改这些向量。 为启用用户定义的中断routine,内部向量包含指向 SRAM 起始于 0x809FC1 的内部部分的固定值。 代码从这些位置开执行始,因此将分支指令(到中断例程)放在这些位置而不是向量很重要。

引导加载程序需要一个小的堆栈空间用于调用和返回。 位于 0x809800 和 0x809801 的两个 SRAM 位置用于此堆栈。 不应将数据引导加载到这些位置,因为这会破坏引导加载程序运行时堆栈。 引导加载操作完成后,程序可以回收这些位置。 最简单的解决方案是从 0x809800 开始程序的堆栈或未初始化的数据部分。 有关引导加载程序操作的更多详细信息,包括引导加载程序源代码,请参阅 TMS320C3x 用户指南(文献编号 SPRU031)。 引导加载完成后,可以使用位 I/O 线或外部逻辑来安全地禁用 MCBL 模式。 但是,为确保正常运行,CPU 当前不应在发生更改时执行代码或使用外部数据。 在以下示例中,XF0 引脚在复位时为三态,这允许上拉电阻将 DSP 置于 MCBL 模式。 以下代码位于应用程序的开头,然后使 XF0 引脚变为逻辑低电平有效输出,将 DSP 模式更改为 MP。 使用高速缓存启用和 RPTS 指令是因为它们会导致 LDI 指令被执行多次,即使它仅被提取一次(在模式更改之前)。 换句话说,RPTS 指令充当外部执行代码的一级深度程序缓存。 如果要从内部 RAM 执行应用程序代码,则无需特殊规定。

posted @ 2023-03-21 15:15  luckylan  阅读(550)  评论(0编辑  收藏  举报

目录导航