1 存储器及CMD文件的编写
1 F28335的存储器
1.1 F28335存储器的结构
1.2 F28335存储器的映像
存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射。
我们将《tms320f28335 数据手册》中“3.1 Memory Maps”存储器映射图截图下来如下图所示。(更清楚的图可以参考芯片数据手册 P34 页)
F28335 是采用多级流水线的增强的哈佛总线结构,能够并行访问程序和数据存储空间。在 F28335 芯片内部集成了大量的不同的存储介质,F28335 片上有 256K×16 位的 FLASH,34K×16 位的 SARAM,8K×16 位的 BOOT ROM,2K×16 位的 OPT ROM,采用统一寻址方式(程序、数据和 I/O 统一寻址),从而提高了存储空间的利用率,方便程序的开发。除此之外,F28335 还提供了外部并行扩展接口 XINTF,可进一步外扩存储空间。
F28335 的 CPU 内核本身并不包含任何存储器,通过总线访问芯片内部集成的或者外部扩展的存储器。其总线按照改进哈佛结构,分成了 32 位的数据读、数据写数据总线,地址读、地址写总线,公用数据总线即程序总线,包括 22 位的 程序地址总线,用于传送程序空间的读/写地址,32 位读数据程序总线,用于读 取
程序空间的指令或者数据。改进的哈佛结构其实是综合了冯.诺依曼结构的简 洁,哈佛结构的高效。F28335 应用 32 位数据地址和 22 位程序地址控制整个存 储器以及外设,最大可寻址 4G 字的数据空间和 4M 字程序空间。
通常写的程序所需存放空间 4M 已经足够了,如果大于 4M,意味着程序空间 不够处理,在实际中采用分页处理的方式,因为实际寻址数据控制为 4G,通过分页机制可以扩展实际寻址的程序空间。要找到对应程序的空间地址与数据的空间地址,就需要对空间地址进行编码,将空间地址进行逻辑编码就是映射。
从上图可以看到,F28335 对数据空间和程序空间进行了统一编址,有些空间既可以作为数据空间也可以作为程序空间,有些空间只能作为数据空间,有些空间是受到密码模块保护,有些空间地址是作为保留的,具体内容就要仔细对照这 张图来进行查阅了。
上图右半部分主要是通过 XINTF 外扩的存储空间,当片内数据存储空间不够的时候,我们可以外扩存储器。其中的保留区是为片内存储器所占的地址。
F28335 的各存储器地址都是连续编码的,且空间地址是唯一的。上图中左半部分首先对 M0 SARAM 从 0x000000 开始编码一直到 0x000400 结束,可以算出这是 1K16 的大小。当 STE 状态寄存器 VMAP=0 时,0x000000-0x000040 作为中断 向量的存储空间。M1 SARAM 从 0x000400-0x000800 也是 1K16 位大小,接着是 外设帧 0/1/2/3,这 4 个空间只能是数据空间,不能是程序空间,这些空间存放 着 F28335 外设寄存器,其中外设帧 1/2/3 空间是 Protected,表示这三个空间 存放的寄存器不可以随便配置,若要对存放在 Protected 空间内的寄存器进行配 置,要进行 EALLOW 声明,以 EDIS 结束声明,起到保护和警示作用。中间插了个 PIE 向量存储空间。0x002000-0x005000 是保留区,这段保留区被用作外部扩展 区 0,从这里也可以看到保留区的作用,这个外扩区同样也是受保护的,要改写 存放在该区域的寄存器值时同样需要 EALLOW 声明。外扩区还有两个分别为 1M 大小的 6 区与 7 区。接下来是 L0-L7 的 SARAM 区,均为 4K
大小,下边是 256K的 FLASH 空间,中间 0X33FFF8-0X340000 共 128 位用来保存 CSM 模块密码,保护FLASH、L0-L7、OTP 空间内存放的数据,下边是 2K 的 OTP 空间,其中 1K OTP 空 间主要是 TI 用来测试的引导程序,接下来是 L0-L3 SARAM空间,这是个双映射空间,也就是名字是一样的,但空间地址不一样,这样有利于数据备份。接下来是个 8K 的 BOOT ROM 空间,用来存放 Bootloader 程序,系统初始引导程序。
1.3 F28335 存储器特点
F28335 片上有 256K×16 位的 FLASH,34K×16 位的 SARAM,8K×16 位的 BOOT ROM,2K×16 位的 OPT ROM,采用统一寻址方式(程序、数据和 I/O 统一寻址), 从而提高了存储空间的利用率,方便程序的开发。除此之外,F28335 还提供了外部并行扩展接口 XINTF,可进一步外扩存储空间。
(1)片上SARAM
SARAM 即为单口随机读/写存储器,有别于双口 RAM,双口 RAM 是在一个 SRAM存储器上具有两套完全独立的数据线、地址线和读写控制线,并允许两个独立的 系统同时对该存储器进行随机性访问,即共享式多端口存储器。F28335 片内共 有 34K*16 位单周期单次访问随机存储器 SRAM,被分成 10 块,它们分别为 M0、 M1、L0-L7。
M0 和 M1 块 SRAM 的大小均为 1K*16 位,当复位后,堆栈指针指向 M1 块的起始地址,堆栈指针向上生长。M0 和 M1 段都可以映射到程序区和数据区。
L0-L7 块 SRAM 的大小均为 4K*16 位,即可以映射到程序空间也可以映射到数 据空间,其中 L0-L3 可映射到两块不同的地址空间并且受片上的 FLASH 中的密码 保护,以免存在上面的程序或数据被他人非法复制。
(2)BOOT ROM
BOOT ROM 可以叫做引导 ROM,主要装载了 TI 的引导装载程序,实现 DSP 的Bootloader 功能。MP/MC=0 时,DSP 被设置为微计算机模式,CPU 在复位后,指令跳转到 0X3FFC00-0X3FFFBF 区间内,执行 Bootloader 程序,这个在后面章节我们在来介绍,这里先不用管它。
(3)片上 FLASH和OTP
F28335片上由256K16位嵌入式FLASH存储器和2K16位一次性可编程EEPROM 存储器,它们均受片上 FLASH 中的密码保护。FLASH 存储器由 8 个 32K*16位扇区组成,用户可以对其中任何一个扇区进行擦除、编程和校验,而其它扇区不变。但是不能在其中一个扇区上执行程序来擦除和编程其它的扇区。其主要有 以下特点:
①整个存储器分成多段
②代码安全保护
② 功耗模式
③ 根据 CPU 频率调整等待周期
⑤FLASH 流水线模式能够提高线性代码的执行效率
F28335 片内 FLASH 存储器的分段情况如下所示:
F28335 的 OTP 存储器也是统一映射到程序和数据存储器空间,即可以为数据 存储也可以为程序存储器,与 FLASH存储器不同的是它只能被用户写一次,不能再次被擦除。
FLASH 与 OTP 存储器的功耗模式有以下三种状态:
(1)重启或者睡眠状态
芯片复位后,FLASH 与 OTP 处于睡眠状态,CPU 在 FLASH 和 OTP 存储器映射区域读数据或取代码使得状态改变,从睡眠状态变为备用状态,进一步会变为激活状态,在状态转换过程中,CPU 自动延迟等待,一旦状态转换完成,CPU 自动延迟等待,一旦状态转换完成,CPU 的访问恢复正常。
(2)备用状态
该状态的功耗要比睡眠状态大,需要较短的时间就转变为激活状态或者读状态。在状态转换过程中,CPU 自动延迟等待,一旦状态转换完成,CPU 的访问恢复正常。
(3)激活状态
在 激 活 状 态 下 , CPU 在 FLASH 与 OTP 的 存 储 器 映 射 空 间 内 读 取 访 问 收 到 FBANKWAIT 寄存器与 FOTPWAIT 寄存器控制。在状态转换时,从低功耗模式转换到了高功耗模式,延时是必要的,通过延时可以使用 FLASH 能够处在稳定的激活 状 态 。 在 延 时 器 件 , CPU都会自动等待直到延时完成为止 。睡眠到备用受FSTDBWAIT控制,备用到激活受 FACTICVEWAIT 寄存器控制。 对FLASH和OTP存储器来说,CPU读写数据操作主要有以下3种形式:
1、 32位取指令。
2、 16 位或32位数据空间读操作。
3、 16 位程序空间读操作。
一旦 FLASH 处于激活状态,那么对存储器映射区的访问可以被分为 FLASH 访问或OTP访问,OTP存储器小于4M ,在22位取址范围内,FLASH则大于4M ,所以 FLASH 访问的时候又分为了存储器的随机访问与存储器的页访问。FLASH 存储器是以阵列形式组成,每行有 2048 位。首次访问的某一行称 为随机访问,若
随后又访问该行则被称为页访问,一个随机和页访问的等待状态 数可以通过 FBANKWAIT 寄存器编程配置,随机访问的状态数由 RANDWAIT 位来 控制,指定访问的等待状态数由PAGEWAIT 位来控制。
OTP存储器的访问速度通常可以通过寄存器FOTPWAIT中的OTPWAIT中位来控制。OTP存储器的访问时间比FLASH要长。
FLASH 的流水线模式: FLASH 存储器数据掉电不丢失,所以通常用来保存应用代码。在代码执行期间,除非有中断发生,指令可以从存储器地址中连续获取,连续地址中的部分代码组成了主要的代码,又称为线性代码。为了提高线性代码的执行性能,可以采用FLASH流水线模式。FLASH 流水线模式在默认状态下无效,通过设置 FOPT 寄存器中ENPIPE位使能流水线模式,并且 FLASH 流 水线模式独立于 CPU 的流水线模式。
(4)代码安全模块 CSM
代码安全模块 CSM 是 F28335 上程序安全性的主要手段,它禁止未授权的用 户访问片内存储器,禁止私有代码的复制或者逆向操作。
(5)外设帧PF
(1)功能说明
安全模块限制 CPU 去访问片内存储器。实际上,对各种存储器的读/写访问都是通过 JTAG 端口或外设来进行的,而 CSM 模块所谓的代码安全性主要是针对片内存储器的访问来定义的,用来禁止未经授权去复制私人代码或数据。
当 CPU 访问片内存储器受到限制的时候,器件即处于保密、“安全”的状态。 当处于保密状态时,根据程序计数器当前指针的位置,可能有两种保护类型。如 果当前代码正运行在受保护的内部安全存储器模块上时,仅仅是 JTAG(即仿真器)的访问被阻断,而受安全保护的代码是可以访问受安全保护的数据的,相反, 如果代码运行在不受保护的非安全区时,所有对受保护的安全区的访问都被阻断。用户的代码可以动态地跳进或者跳出受保护的安全区,因此允许程序从不受保护的非安全区域调用函数,类似地,中断服务程序放在了安全受保护区域,而 主程序运行在不受保护的非安全区域。因为程序中总是有部分受到保护的。通过 一个 128 位的密码(相当于 8 个 16 位的字)来对安全区来进行加密或解密。这 段密码保存在 FLASH 的最后 8 个字中(0X33FFF8-OX33FFFF),也就是密码区中 (PWL) ,通过密码匹配( PMF ) , 可以解锁器件。
如果密码保护区中的 128 位数都是同一个数,这个器件不受保护,全是同一个数有两种可能,一种全为O,另一种全为1 ,一个新的FLASH或FLASH 被擦除后,就变为全 1 了,这样只要读一下密码区就能破解,还一种情况就是全为O,这时候器件是被加密了,但是不管密钥寄存器的内容是什么,器件都处在加密状态,即该器件无法解锁,这时候芯片就被完全锁住了,因此不要用全O作为密码。如果在擦除 FLASH 的期间,芯片复位了,那这个芯片的密码就不确定了,也不能解锁。芯片不能解锁(用全零作为密码、 FLASH 擦除期间复位、忘记密码),这时候芯片就完全锁住了,只能用来调试,而无法重新烧写程序。 用户用来解锁的寄存器为密钥寄存器,在存储空间映射地址为 0x0000 OAEO-0x00000AE7 ,该区域受EALLOW保护。当这个128位的密钥为全1时,密钥寄存器不需要与之匹配。当一开始调试FLASH区加密的芯片时,仿真器取得CPU的控制权需要一定的时间,在此期间,CPU正在开始运行,并且会执行保护加密区的操作,这个操作会引起仿真器断开连接,有两个方法可以解决这个问 题。
1 采用 wait-in-Reset 仿真模式,这种方法是让芯片保持在复位状态直到仿真器得到控制,这种方法要求仿真器要能支持这种模式。
2 采用 Branch to check boot mode 引导。这个方法会持续不停地让引导模式选择引脚。可以选择这种引导模式,一旦仿真器通过重新映射PC到另外 的地址或者改变引导模式选择引脚以进人引导而进行连接。
(2)CSM 对片内资源的影响
void InitSysCtrl(void)
{
Uint16 i;
volatile Uint16 *PWL;//定义一个 PWL 指针
/*
.....其它初始化过程省略
*/
PWL=&CsmPwl.PSWD0;//PWL 指针指向 PSWD0 处
for(i=0;i<8;i++)