第4课F2812片内资源、存储器映射以及CMD文件的编写作者:顾卫钢谢芬(HELLODSP资深会员)从今天开始,我们的课程终于进入F2812的核心了,呵呵。
在今天的课程中,我们将带领大家一起学习2812的片内资源,初步了解它究竟有哪些本事,能拿来干些什么,然后一起了解2812存储器的结构,统一编址的方式、存储器映射关系,并重点分析CMD文件,以期望消除大家对CMD文件的迷惑,在自己编写程序的时候会修改CMD文件中的部分内容,从而满足自己设计时的需求。
1.F2812的片内资源我们知道,TMS320F2812是32位的定点DSP,它既具有数字信号的处理能力,又具有强大的事件管理能力和嵌入式控制功能,特别适合用于需要大批量数据处理的测控领域,例如自动化控制、电力电子技术、智能化仪表、电机伺服控制。
下面是F2812的内部资源框图。
图1 TMS320F2812内部资源框图2812采用了高性能的静态CMOS技术,时钟频率可达150MHZ(6.67ns),其核心电压为1.8V,I/O口电压3.3V,Flash编程电压也为3.3V,所以我们在设计2812电源部分的时候,需要将常用的5V电压转换成1.8V和3.3V的电压之后,才能供给2812。
具体的设计我们将会在以后的硬件设计内容里进行探讨。
让我们一起来看看图1,最左边的A(18-0)和D(15-0)是表示2812外扩存储器的能力,2812外扩的存储空间最大是219*16 bit,就是说最多只能扩512K个存储单元,每一个存储单元的位数为16位。
从图中我们也可以看到,F2812支持JTAG边界扫描(Boundary Scan),这也是为什么我们的仿真器都是采用JTAG口的原因了,在这里,提醒大家一点的就是,仿真的时候,JTAG口的方向不能插反,如果插反的话会将仿真器烧坏。
我们所使用的14针JTAG口的第6针是空脚,所以一般情况下仿真器JTAG线的第6针是填针的,同时在板子上的第6脚是拔空的,这样可以防止您插反JTAG口,以避免不必要的损失。
这一点,在我们自己设计板子的时候尤其需要注意。
在图1中,我们可以看到连接整个芯片各个模块的两条黑色的线,从英文单词上我们可以看到一条是Program Bus,另一条是Data Bus,就是程序总线和数据总线。
这个概念讲的还是比较笼统的,下面我们详细分析这两天总线,并结合图中总线上的各个箭头来理解这些概念。
我们首先需要知道2812的存储器空间被分成了2块,一块是程序空间,一块是数据空间,而无论是那一块的内容,我们都需要借助于两种总线来进行传送相关的内容——地址总线和数据总线,用地址总线来传送存储单元的地址,而用数据总线来传送存储单元内的内容。
2812的存储器接口具有3条地址总线和3条数据总线。
了解了这些基本的内容之后我们接下来一一讲述2812内部的总线结构。
先来讲地址总线,顾名思义,这类总线的作用就是来传送存储单元的地址的。
1.PAB (Program Address Bus)程序地址总线,它是一个22位的总线,用于传送程序空间的读写地址。
程序在运行的时候,假如执行到了某一个指令,那么需要去找到这段代码的地址,就是用PAB来传送。
2.DRAB(Data-Read Address Bus)数据读地址总线,它是个32位的总线,用于传送数据空间的读地址。
假如要读取数据空间某一个单元的内容,那么这个单元的地址就是通过DRAB来传送。
3.DWAB(Data-Write Address Bus)数据写地址总线,它也是个32位的总线,用于传送数据空间的写地址。
类似的,如果我要对数据空间的某一个单元进行写操作,那么这个单元的地址就是通过DWAB来传送。
了解了地址总线后,我们再来看看数据总线,这类总线传送的就是数据了,也就是各个存储单元内的具体内容了。
1.PRDW(Program-Read Data Bus)程序读数据总线,它是一个32位的总线,用于传送读取程序空间时的指令或者数据。
我们在执行代码的时候,首先是通过PAB传送并找到了存放该指令的存储单元,但是这个存储单元下的具体内容就要由我们的PRDW来传送了。
2.DRDB(Data-Read Data Bus)数据读数据总线,它是一个32位的总线,在读取数据空间时用来传送数据。
我们在进行读操作时,先通过DRAB总线确定了需要进行读操作的数据单元的地址,接下来传送这个数据单元下面的具体内容时就需要DRDB了。
3.DWDB(Data/Program-Write Data Bus)数据写数据总线,它是一个32位的总线,在进行写操作时,向数据空间/程序空间传送相应的数据。
也就是假如我们要对数据空间的某一个单元进行写操作,我们通过DWAB传送了这一个单元的地址,同时我们需要DWDB来传送写入的内容。
看了这么多总线,大家是不是有些晕乎乎的呢,呵呵。
又是程序空间,数据空间,又是地址总线,数据总线,看的乱了。
或许有的朋友就要问了,刚才讲了这么多地址总线和数据总线,那图1中标注的是Program Bus和Data Bus,不是什么地址总线和数据总线啊,怎么会这么混乱呢?不急,呵呵,请大家一起来看看我们的图2吧,2812内部的总线结构。
大家在比较上面的内容和图2时,是不是对2812的总线有了豁然开朗的感觉呢?呵呵,希望有,如果没有的话,请反复阅读一下,这个内容虽然不是什么重点,但是对于理解2812内部的存储结构也是有帮助的。
从图2我们也可以看到,我们不能同时对程序空间进行读写,因为PAB是复用的,读写操作会同时使用到PAB。
同样的,我们也不能同时对程序空间和数据空间进行写操作,因为DWDB也是复用的,对程序空间进行写操作或者对数据空间进行写操作,都要用到DWDB。
图2 2812内部的总线结构呵呵,用了很长的篇幅来介绍了2812内部的总线结构,一是帮助大家看懂图1中的总线,二是为后面学习存储器方面的内容打下一个伏笔,既然讲到了存储器,我们就接着讲2812内部的存储器资源。
CPU 本身没有存储器,但是2812片内集成了RAM、ROM和FLASH,具体的存储器资源如下表所示:我们通常在调试程序的时候把程序load到RAM里,而固化程序的时候才会把程序烧写到FLASH里。
结束这些看了头晕的内容吧,来了解一下稍微轻松些的CPU资源和外设资源吧。
2812有3个32位的CPU定时器,支持动态的改变锁相环的频率,有片内振荡器和看门狗定时器模块。
2812具有3个外部中断,但是2812具有外部中断的扩展模块(PIE),它可支持96个外部中断,不过当前仅仅使用了45个外部中断,其他为保留,将来2812功能扩展之后说不定会用到哦。
具有128位的密钥,用于保护FLASH、OTP和L0、L1中的内容不被盗读。
接下来,主要看一下2812有哪些外围设备,这些外围设备大概的情况,可以参看图1:1. 2个事件管理器EVA、EVB,这个应该是使用2812必用的外设了,PWM波形就是需要这个外设来产生的。
2. 2个串行通信接口SCI,标准的UART(SCIA SCIB)。
3. 1个串行外围接口SPI。
4. 改进的CAN通信ECAN。
5. 多通道缓冲串行接口McBSP。
6. 12位的ADC,一共有16个通道,实现AD转换的功能7. 最多有56个可独立编程的,多功能复用的GPIO引脚。
在这里,我们只需要了解这些就可以了,后面我们会一个外设、一个外设的去详细学习。
2.存储器映射通过前面的内容我们已经知道,2812具有32位的数据地址和22位的程序地址,总地址空间可以达到4M的数据空间和4M的程序空间。
读到这一句话的时候,我不知道大家会不会产生疑问,一个是32位的数据地址,一个是只有22位的程序地址,那么为什么其可寻址的空间却是一样大的呢?这时候,您可能会算一下,32位的数据地址,就是能访问2的32次,是4G,而22位的程序地址,就是能访问2的22次,是4M。
不对呀,可寻址的数据空间应该是4G而不是4M,难道TI的文档出错了吗?其实,2812可寻址的数据空间最大确实是4G,但是实际线性地址能达到的只有4M,原因是2812的存储器分配采用的是分页机制,分页机制采用的是形如0xXXXXXXX的线性地址,所以数据空间能寻址的只有4M,但也足足您够用啦,呵呵。
存储器就像一个仓库,用来存放很多的货物,只不过存储器是用来存放指令和数据的。
2812的存储器被划分成了下面的几个部分:1.程序空间和数据空间。
2812所具有的RAM、ROM和FLASH都被统一编址,映射到了程序空间和数据空间,这些空间的作用就是存放指令代码和数据变量。
2.保留区。
数据空间里面某些地址被保留了,作为CPU的仿真寄存器使用,这些地址是不向用户开放的。
3.CPU中断向量。
在程序空间里也保留了64个地址作为CPU的32个中断向量。
通过CPU的一个寄存器ST1中的VMAP位来将这一段地址映射到程序空间的底部或者顶部。
这里,我们还得讲一下什么是映射,其实大家在中学的数学里应该学过映射这一个概念。
曾经看过一个网友是这么解释映射的,很有趣,大家不妨一读。
对于映射和空间的统一编址,我们用一个通俗的例子来帮助大家进行理解,请大家看图3。
假设一个物流公司,它有储藏货物的仓库若干个,每天来来往往成千上万的货物要发送到全国各地,如果拿回来的货物乱七八糟的堆放的话,发货的时候麻烦可大了,不仅仅是一个仓库一个仓库去找,而且要一个货架一个货架的翻,这样效率可是及其低下,匆忙之下也有可能将货物搞错。
为了提高效率,老板肯定要进行改革,首先把各个仓库分类,例如仓库1是发往江苏和上海的货物,仓库2是发往北京的货物,仓库3是发往深圳的货物,仓库4是发往西安的。
其次,货物进来前要根据目的地贴上统一规格的标签,例如HD1000-HD2009的货物放在仓库1内。
这样,发货的时候,只要根据标签就能方便的分辨出货物在哪个仓库的哪个货架,应该装上发往哪个地区的货车,一切井然有序。
Measuring our success is your success !图3 映射和空间统一编址的理解类似的,各个存储空间就像物流公司的仓库一样,有的是存放程序代码的,有的是用来存放数据的。
而且我们对各个存储单元进行了统一的编址,确定了各个存储单元所在的位置,在放置代码或者数据的时候,根据他们的类型进行分配究竟放在那个区域,并记录下了它们的地址,这样需要用到的时候只要根据这些地址就能很方便的找到我们所需要的内容。
而记录下如何分配存储空间内容的就是我们的CMD 文件了。
我们会在稍后详细介绍CMD 文件的内容以及编写方法。
大家可以比对着图3来加深对于这部分内容的理解。
接下来,让我们看看F2812内部的映射空间,如图4所示。