第4课 2812的片内资源、存储器映射以及CMD文件的编写
- 格式:pdf
- 大小:1.12 MB
- 文档页数:13
hello第四课(二):f2812存储器映射及cmd详解-日志-eyes417-...2812存储器映射2812具有32位的数据地址和22位的程序地址,总地址空间可以达到4M的数据空间和4M的程序空间。
32位的数据地址,就是能访问2的32次,是4G,而22位的程序地址,就是能访问2的22次,是4M。
其实,2812可寻址的数据空间最大是4G,但是实际线性地址能达到的只有4M,原因是2812的存储器分配采用的是分页机制,分页机制采用的是形如0xXXXXXXX的线性地址,所以数据空间能寻址的只有4M。
 2812的存储器被划分成了下面的几个部分:1. 程序空间和数据空间。
2812所具有的RAM、ROM和FLASH都被统一编址,映射到了程序空间和数据空间,这些空间的作用就是存放指令代码和数据变量。
2. 保留区。
数据空间里面某些地址被保留了,作为CPU的仿真寄存器使用,这些地址是不向用户开放的。
3. CPU中断向量。
在程序空间里也保留了64个地址作为CPU 的32个中断向量。
通过CPU的一个寄存器ST1中的VMAP位来将这一段地址映射到程序空间的底部或者顶部。
映射和空间的统一编址 F2812内部的映射空间 2812CMD详解CMD:command 命令,顾名思义就是命令文件指定存储区域的分配.2812的CMD采用的是分页制,其中PAGE0用于存放程序空间,而PAGE1用于存放数据空间。
1.)#pragma ,CODE_SECTION和DATA_SECTION伪指令#pragma DATA_SECTION(funcA,"dataA"); ------ 函数外声明将funcA数据块定位于用户自定义的段"dataA"中------ 需要在CMD中指定dataA段的物理地址2.)MEMORY和SECTIONS是命令文件中最常用的两伪指令。
CMD文件的原理玄德(网名)于2009 年3 月一、前言开发TI 公司的DSP 芯片,肯定要编写或者修改CMD 文件,这是在单片机开发中没有碰到过的新事物,也是学习DSP的难点。
面对里面种类繁多、名称各异、来历不明、作用不清、功能千差万别的存储器、区域和变量、寄存器,初学者往往都会一头雾水。
甚至很多人已经把项目成功地完成了,对CMD文件仍然是一知半解。
笔者也经历了极度困惑的过程,曾经大量地看书,下载资料,分析所能搜集到的CMD源文件。
可惜的是,无论是TI 公司的原始文档,还是网上的资料,或者BBS的帖子,都没有透彻地说明CMD 文件的原理和使用,只说“然” ,要靠自己去体会“所以然” ,去“悟” 。
终于有一天,我悟到了,也许只是“一些” 。
现在,我把自己的“一些”写下来。
我将细致而通俗地说明CMD 文件的原理,给您“鱼” ,更给您“渔” ,一步步地引导象我当初一样的初学者。
我将以TI 的2407 为对象展开说明,对于TI 公司其他型号、其他系列的DSP,道理是完全相同的。
用时下学术界最最最流行的语式,叫做“基于2407”——这个词起源于英文的“based on” ,或“something based” ,被我们大量地引用,以至于令人反胃了——我们美妙、绚烂的语言,现在只剩下“基于”了。
笔者水平有限,但保证会用心去写,您会看到很多别处没有的思路和信息,相信会基本打通初学者的任督二脉。
本文适用于那些有单片机的开发基础、刚开始学习DSP 的初学者。
如果你还不知道程序空间,数据空间这些名词,可能就比较困难了。
二、CMD文件的起源在DSP系统中,存在大量的、各式各样的存储器,CMD文件所描述的,就是开发工程师对物理存储器的管理、分配和使用情况。
有必要先复习一下存储器的知识。
目前的物理存储器,种类繁多,原理、功能、参数、速度各不相同,有PROM、EPROM、EEPROM、FLASH、NAND FLASH、NOR FLASH等(ROM 类),还有SRAM、DRAM、SDRAM、DDR、DDR2、FIFO 等(RAM 类)。
对于TMS320F2812的CMD文件的理解1.COFF格式要谈CMD文件,首先不可避免的要谈下COFF格式,COFF格式是通用目标文件格式(Common Object File Format)的缩写,它是一种流行的二进制可执行文件格式,在DSP里二进制可执行文件包括库文件(.lib)、目标文件(.obj)和最终可执行文件(.out)。
详细的COFF格式文件包括段头、可执行代码、初始化数据、可重定位信息、行号入口、符号表、字符串。
对于DSP的C语言编程我们只需要了解定义段和给段分配空间即可。
采用COFF格式更利于我们对其进行模块化编程,我们可以自由的把哪些段分配到哪些空间。
2.Section(1)其次,在编写CMD文件得时候要碰到SectionS命令,SectionS命令的英文理解就有区域的意思,我们利用SectionS来将目标文件的代码放到指定的区域中。
SectionS目标文件中最小的单位我们称之为块,一个块就是最终在存储器映像中占据连续空间的一段代码或者数据。
COFF文件格式默认有三个块:.text 存放可执行代码;.data 存放已初始化数据;.bss 为未初始化数据留下的保留空间。
(2)汇编器对块的处理和设置未初始化块的设置:.bss 变量存放空间;.usect 用户自定义的未初始化段;初始化块的设置:.text 汇编指令代码.data 常数数据(比如对变量的初始化数据).sect 用户自定义的已初始化段.asect 类似于.sect,多了绝对地址定位功能,一般不用(3)C语言对块得的设置和处理未初始化块(data).bss 存放全局和静态变量.ebss 长调用的.bss(超过了64K地址限制).stack 存放C语言的栈.sysmem 存放C语言的堆.esysmem 长调用的.sysmem(超过了64K地址限制)初始化块.text 可执行代码和常数(program).switch switch语句产生的常数表格(program/低64K数据空间).pinit Tables for global constructors (C++)(program).cinit 用来存放对全局和静态变量的初始化常数值(program).const 全局和静态的const变量初始化值和字符串常数,(data).econst 长.const(可定位到任何地方)(data)(4)C语言自定义块#pragma DATA_SECTION(函数名或者全局变量名,“用户自定义在数据空间的段名”);#pragma CODE_SECTION(函数名或者全局变量名,“用户自定义在程序空间的段名”);必须注意:不能在函数体内声明,必须在定义和使用前声明。
TMS320F2812的CMD文件配置详解1存储空间的配置dsp交流网dsp学习第一论坛dsp技术应用与推广平台dsp开发服务平台\TMS320F2812的DSP内存分为三个独立选择的空间——程序空间、数据空间和I/O空间。
程序存储器存储要执行的指令和执行中使用的系数(常数),可以由片内或片外ram、ROM或EPROM组成;数据存储器存储指令执行期间生成的数据,这些数据可以在芯片内或芯片外使用的ram和rom来构成;i/o存储器存放与映象外围接口相关的数据,也可以作为附加的数据存储空间使用。
表1是tms320f2812的存储空间分布。
#p5r)e7[*e!s2cmd文件的分配方法TI新的汇编程序和链接器创建的目标文件采用coff(通用目标文件格式),这更有利于模块化编程,并为管理代码段和目标系统内存提供了强大而灵活的编程方法。
用户可以编写一个链接命令文件(.CMD文件),将链接信息放在一个文件中,以便在多次使用同一链接信息时调用它。
在命令文件中,使用了两条非常有用的伪指令“内存”和“内存”部分来指定实际应用中的内存结构和地址映射。
内存用于指定目标内存结构。
在内存下,可以通过页面选项配置地址空间。
链接器将每个页面视为独立的存储空间。
通常,Page0表示用于存储程序的程序内存,page1表示用于存储数据的数据内存。
编译器生成的可重定位代码和数据块称为被初始化的“sections”(包括数据表和可执行代码).text它包括所有的可执行代码和常数,必须放在程序页;.cinit它包括初始化的变量和常量表,要求放在程序页;.econst在使用大内存模式时使用,包括字符串、声明和显式初始化的全局和静态变量,这些变量可以放在数据页的任何位置。
DSP交流开关,包括用于转换声明的表格集,可以放在低地址的程序页或数据页上。
h2_u$?;d9e$l:o5k(2)未被初始化的“sections”(为程序运行中创建和存放的变量在存储器中保留空间)9d3a.\\'x7e)m;a'c.BSS,为全局变量和静态变量保留空间。
DSP2812学习笔记-CMD⽂件编写⾸先我们要知道什么是CMD⽂件,它是⽤来⼲什么的,然后再来看看它有些什么,怎么去编写⼀个CMD⽂件。
CMD即command命令,命令⽂件指定存储区域的分配。
由于 DSP281X 系列的独特性(⽚内存在 SRAM 和 FLASH)所以必须创建⼀个⽤户链接命令⽂件,以便在运⾏程序时,每个块都能对号⼊座。
2812中CMD 采⽤的是分页制,其中PAGE0⽤于存放程序空间,⽽PAGE1⽤于存放数据空间。
我们结合SRAM.cmd(附件1)⽂件来介绍下CMD⽂件的编写。
CMD的伪指令:MEMORY 和 SECTIONS 是命令⽂件中最常⽤的两伪指令。
MEMORY伪指令⽤来表⽰实际存在⽬标系统中的可以使⽤的存储器范围,在这⾥每个存储器都有⾃⼰的名字,起始地址和长度。
SECTIONS伪指令是⽤来描述输⼊端是如何组合到输出端内的。
CMD ⽂件⾥有两个基本的段:初始化段和⾮初始化段。
初始化段包含代码和常数等必须在 DSP 上电之后有效的数。
故初始化块必须保存在如⽚内 FLASH 等⾮遗失性存储器中。
在SRAM.cmd⽂件中已初始化的段:.text,.cinit,.const,.econst,..pinit 和.switch..每个⼩段⾥⾯存储的量说明如下:.text:所有可以执⾏的代码和常量.cinit:全局变量和静态变量的 C 初始化记录.const:包含字符串常量和初始化的全局变量和静态变量(由 const)的初始化和说明.econst:包含字符串常量和初始化的全局变量和静态变量(由 far const)的初始化和说明.pinit:全局构造器( C++)程序列表.switch:包含转换语⽓声明的列表⾮初始化段中含有在程序运⾏过程中才像变量内写数据进去,所以⾮初始化段必须链接到易失性存储器中如 RAM。
⾮初始化的段:.bss,.ebss,.stack,.sysmem,和 esysmem.(更好的理解就是,这些段就是存储空间⽽已)每个⼩段⾥⾯存储的量说明如下:.bss: 为全局变量和局部变量保留的空间,在程序上电时,cinit 空间中的数据复制出来并存储在.bss 空间中。
DSP 芯片应用系列讲座(二)第4讲 T M S 320F 281x DSP 的存储器系统杨 峡1,张雄伟2(1.解放军理工大学通信工程学院研究生1队,江苏南京210007;2.解放军理工大学通信工程学院电子信息工程系)摘 要:T I 公司新近推出的T M S 320F 281x 系列32位定点DSP 芯片具有丰富的存储器资源,尤其是片内FL A SH 与其它系列D SP 芯片的存储器相比,有许多突出的优点。
文中介绍了T M S 320F 281x 存储器,着重介绍了片内F LA SH 、Boo t RO M 及代码保护模块的特点及用法。
关键词:存储器;闪速存储器;数字信号处理器中图分类号:T N 911.72文献标识码:A文章编号:CN 32-1289(2005)02-0076-05Memory System of TMS 320F 281x DSPYA N G X ia 1,ZH A N G X iong -w ei 2(1.P ostg raduate T ea m 1ICE,P L A U ST ,Nanjing 210007,China ;2.Depar tment o f Electr onic Info rmat ion Engineer ing ICE,P LA U ST )Abstract :T he TM S320F281x 32-bit fixed-point digital signal processors released recently by Tex as Instrum ents Incor porated have abundant m em ory resour pared w ith the other DSP series ,the FLASH memo ry of T M S 320F 281x series has many advantag es .This paper firstly pr esented an introductio n of the TM S320F281x m em ory sy stem,and then the FLASH memory ,Bo ot ROM and co de secur ity mo dule in detail.Key words :m em ory ;FLASH ;DSPTM S320F281x(以下简称F281x )系列DSP 芯片片内具有多种类型的存储器,包括只读存储器(ROM )、单存取随机存储器(SARAM )、片内闪存(FLASH)和一次性可编程存储器(OT P)。
TMS320F2812的CMD文件的编写经验总结CMD文件里包含三部分内容:1)输入/输出定义:.obj文件:链接器要链接的目标文件;.lib文件:链接器要链接的库文件;.map文件:链接器生成的交叉索引文件;.out文件:链接器生成的可执行代码;链接器选项2)MEMORY命令:描述系统实际的硬件资源3)SECTIONS命令:描述“段”如何定位F2812的CMD文件只包含后两部分,现对它的编写做一下总结:(一)用于调试时用,取名为SRAM.CMD这里有个比较标准的F2812的CMD文件,可以供大家借鉴使用:MEMORY{PAGE 0:ZONE0 : origin = 0x002000, length = 0x002000ZONE1 : origin = 0x004000, length = 0x002000RAML0 : origin = 0x008000, length = 0x001000ZONE2 : origin = 0x080000, length = 0x080000ZONE6 : origin = 0x100000, length = 0x080000OTP : origin = 0x3D7800, length = 0x000800FLASHJ : origin = 0x3D8000, length = 0x002000FLASHI : origin = 0x3DA000, length = 0x002000FLASHH : origin = 0x3DC000, length = 0x004000FLASHG : origin = 0x3E0000, length = 0x004000FLASHF : origin = 0x3E4000, length = 0x004000FLASHE : origin = 0x3E8000, length = 0x004000FLASHD : origin = 0x3EC000, length = 0x004000FLASHC : origin = 0x3F0000, length = 0x004000FLASHA : origin = 0x3F6000, length = 0x002000BEGIN_H0 : origin = 0x3F8000, length = 0x000002BEGIN_FLASH : origin = 0x3F7FF6, length = 0x000002PRAMH0 : origin = 0x3F8002, length = 0x001FFEZONE7 : origin = 0x3FC000, length = 0x003FC0ROM : origin = 0x3FF000, length = 0x000FC0 // boot ROM available if MP/MCn=0 RESET : origin = 0x3FFFC0, length = 0x000002VECTORS : origin = 0x3FFFC2, length = 0x00003EPAGE 1 : // Data MemoryRAMM0 : origin = 0x000000, length = 0x000400RAMM1 : origin = 0x000400, length = 0x000400DEV_EMU : origin = 0x000880, length = 0x000180FLASH_REGS : origin = 0x000A80, length = 0x000060CSM : origin = 0x000AE0, length = 0x000010XINTF : origin = 0x000B20, length = 0x000020CPU_TIMER0 : origin = 0x000C00, length = 0x000008PIE_CTRL : origin = 0x000CE0, length = 0x000020PIE_VECT : origin = 0x000D00, length = 0x000100ECAN_A : origin = 0x006000, length = 0x000100ECAN_AMBOX : origin = 0x006100, length = 0x000100SYSTEM : origin = 0x007010, length = 0x000020SPI_A : origin = 0x007040, length = 0x000010SCI_A : origin = 0x007050, length = 0x000010XINTRUPT : origin = 0x007070, length = 0x000010GPIOMUX : origin = 0x0070C0, length = 0x000020GPIODAT : origin = 0x0070E0, length = 0x000020ADC : origin = 0x007100, length = 0x000020EV_A : origin = 0x007400, length = 0x000040EV_B : origin = 0x007500, length = 0x000040SCI_B : origin = 0x007750, length = 0x000010MCBSP_A : origin = 0x007800, length = 0x000040RAML1 : origin = 0x009000, length = 0x001000FLASHB : origin = 0x3F4000, length = 0x002000CSM_PWL : origin = 0x3F7FF8, length = 0x000008DRAMH0 : origin = 0x3f9000, length = 0x001000}SECTIONS{// Compiler Required Sections.text : > PRAMH0, PAGE = 0.cinit : > PRAMH0, PAGE = 0.stack : > RAMM1, PAGE = 1.bss : > RAMM0, PAGE = 1.ebss : > RAMM0, PAGE = 1.const : > RAMM0, PAGE = 1.econst : > RAMM0, PAGE = 1.sysmem : > RAMM1, PAGE = 1.reset : > RESET, PAGE = 0, TYPE = DSECT // we are not using the .reset // section//Peripheral Frame 0 Register StructuresDevEmuRegsFile : > DEV_EMU, PAGE = 1FlashRegsFile : > FLASH_REGS, PAGE = 1CsmRegsFile : > CSM, PAGE = 1XintfRegsFile : > XINTF, PAGE = 1CpuTimer0RegsFile : > CPU_TIMER0, PAGE = 1PieCtrlRegsFile : > PIE_CTRL, PAGE = 1PieVectTable : > PIE_VECT, PAGE = 1//Peripheral Frame 1 Register StructuresSysCtrlRegsFile : > SYSTEM, PAGE = 1SpiaRegsFile : > SPI_A, PAGE = 1SciaRegsFile : > SCI_A, PAGE = 1XIntruptRegsFile : > XINTRUPT, PAGE = 1GpioMuxRegsFile : > GPIOMUX, PAGE = 1GpioDataRegsFile : > GPIODAT PAGE = 1AdcRegsFile : > ADC, PAGE = 1EvaRegsFile : > EV_A, PAGE = 1EvbRegsFile : > EV_B, PAGE = 1ScibRegsFile : > SCI_B, PAGE = 1McbspaRegsFile : > MCBSP_A, PAGE = 1//Peripheral Frame 2 Register StructuresECanaRegsFile : > ECAN_A, PAGE = 1ECanaMboxesFile : > ECAN_AMBOX PAGE = 1//Code Security Password LocationsCsmPwlFile : > CSM_PWL, PAGE = 1}(二)用于烧写到FLASH中时用,取名为FLASH.CMDFLASH.CMD与SRAM.CMD基本一样,只是有两处改动:一是MEMORY中将你的程序代码部分映射到FLASH空间里;二是在SECTIONS中添加一个用户定义的起始段,起始段的代码如下://User Defined Sections , Used by file DSP28_CodeStartBranch.asmcodestart : > BEGIN, PAGE = 0其中DSP28_CodeStartBranch.asm中的关键代码为:.ref _c_int00.sect “codestart”Code_start:LB _c_int00.end(三)SECTIONS中段的含义与用户自定义段的方法1、各个段的含义以下是TI公司的技术文档中对一些段的说明,现截个图给大家参考:除此外还有一些段的含义如下(这仅是我见过的,有漏下的还请提示,大家一起学习):.reset 复位中断向量表.vectors 中断向量表.data 已初始化数据,常数数据(比如对变量的初始化数据).pvecs 外围模块中断向量表.ref 引用外部定义的变量或函数名.global 引用全局变量或函数.space 定义要保留的空间.def 定义变量,与#define功能相同.end 段的结束标识.sect 用户自定义的已初始化段.asect 比.sect多了绝对地址定位功能,一般不用.usect 用户自定义的未初始化段已初始化的段:.text, .cinit, .const, .econst, .pinit, .switch.text:所有可以执行的代码和常量.cinit:全局变量和静态变量的C初始化记录.const:包含字符串常量和初始化的全局变量和静态变量(由const)的初始化和说明.econst:包含字符串常量和初始化的全局变量和静态变量(由far const)的初始化和说明.pinit:全局构造器(C++)程序列表.switch:包含转换语气声明的列表非初始化的段:.bss, .ebss, .stack, .sysmem, .esysmem(更好的理解就是,这些段就是存储空间而已)..bss:为全局变量和局部变量保留的空间,在程序上电时,cinit空间中的数据复制出来并存储在.bss空间中.ebss:为使用大寄存器模式时的全局变量和静态变量预留的空间,在程序上电时,cinit空间中的数据复制出来并存储在.ebss中.stack:为系统堆栈保留的空间,主要用于和函数传递变量或为局部变量分配空间.sysmem:为动态存储分配保留的空间。
2812存储器映射及CMD2812存储器映射2812具有32位的数据地址和22位的程序地址,总地址空间可以达到4M的数据空间和4M的程序空间。
32位的数据地址,就是能访问2的32次,是4G,而22位的程序地址,就是能访问2的22次,是4M。
其实,2812可寻址的数据空间最大是4G,但是实际线性地址能达到的只有4M,原因是2812的存储器分配采用的是分页机制,分页机制采用的是形如0 xXXXXXXX的线性地址,所以数据空间能寻址的只有4M。
2812的存储器被划分成了下面的几个部分:1. 程序空间和数据空间。
2812所具有的RAM、ROM和FLASH都被统一编址,映射到了程序空间和数据空间,这些空间的作用就是存放指令代码和数据变量。
2. 保留区。
数据空间里面某些地址被保留了,作为CPU的仿真寄存器使用,这些地址是不向用户开放的。
3.CPU中断向量。
在程序空间里也保留了64个地址作为CPU的32个中断向量。
通过CPU寄存器ST1中的VMAP位来将这一段地址映射到程序空间的底部或者顶部。
映射和空间的统一编址F2 812内部的映射空间低地址空间高地址空间2812CMD详解CMD:command命令,顾名思义就是命令文件指定存储区域的分配.2812的CMD采用的是分页制,其中PAGE0用于存放程序空间,而PAGE1用于存放数据空间。
1.)#pragma ,CODE_SECTION和DATA_SECTION伪指令#pragma DATA_SECTION(funcA,"dataA"); ------ 函数外声明将funcA数据块定位于用户自定义的段"dataA"中 ------ 需要在CMD中指定dataA段的物理地址2.)MEMORY和SECTIONS是命令文件中最常用的两伪指令。
MEMORY伪指令用来表示实际存在目标系统中的可以使用的存储器范围,在这里每个存储器都有自己的名字,起始地址和长度。
第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章 芯片结构及性能概述TMS320C2000系列是美国TI公司推出的最佳测控应用的定点DSP芯片,其主流产品分为四个系列:C20x、C24x、C27x和C28x。
C20x可用于通信设备、数字相机、嵌入式家电设备等;C24x主要用于数字马达控制、电机控制、工业自动化、电力转换系统等。
近年来,TI公司又推出了具有更高性能的改进型C27x和C28x系列芯片,进一步增强了芯片的接口能力和嵌入功能,从而拓宽了数字信号处理器的应用领域。
TMS320C28x系列是TI公司最新推出的DSP芯片,是目前国际市场上最先进、功能最强大的32位定点DSP芯片。
它既具有数字信号处理能力,又具有强大的事件管理能力和嵌入式控制功能,特别适用于有大批量数据处理的测控场合,如工业自动化控制、电力电子技术应用、智能化仪器仪表及电机、马达伺服控制系统等。
本章将介绍TMS320C28x系列芯片的结构、性能及特点,并给出该系列芯片的引脚分布及引脚功能。
1.1 TMS320C28x系列芯片的结构及性能C28x系列的主要片种为TMS320F2810和TMS320F2812。
两种芯片的差别是:F2812内含128K×16位的片内Flash存储器,有外部存储器接口,而F2810仅有64K×16位的片内Flash存储器,且无外部存储器接口。
其硬件特征如表1-1所示。
表1-1 硬件特征特征F2810 F2812 指令周期(150MHz) 6.67ns 6.67ns SRAM(16位/字)18K 18K 3.3V片内Flash(16位/字)64K 128K 片内Flash/SRAM的密钥有有Boot ROM 有有掩膜ROM 有有外部存储器接口无有事件管理器A和B(EVA和EVB) EVA、EVB EVA、EVB *通用定时器 4 4 *比较寄存器/脉宽调制16 16 *捕获/正交解码脉冲电路6/2 6/2看门狗定时器有有12位的ADC 有有*通道数16 16续表特征F2810 F2812 32位的CPU定时器 3 3串行外围接口有有串行通信接口(SCI)A和B SCIA、SCIB SCIA、SCIBTMS320C28x系列DSP的CPU与外设(上)·2·控制器局域网络有有多通道缓冲串行接口有有数字输入/输出引脚(共享)有有外部中断源 3 3供电电压核心电压1.8VI/O电压3.3V核心电压1.8VI/O电压3.3V封装 128针PBK 179针GHH,176针PGF温度选择‡A:-40℃ ~ +85℃S:-40℃ ~ +125℃PBK仅适用于TMSPGF和GHH仅适用于TMS产品状况‡‡产品预览(PP)高级信息(AI)产品数据(PD)AI(TMP)‡‡‡AI(TMP)‡‡‡注:‡ “S”是温度选择(-40℃ ~ +125℃)的特征化数据,仅对TMS是适用的。
第4章实验内容实验一编写一个以C语言为基础的DSP程序一.实验目的1.学习用标准C语言编制程序;了解常用的C语言程序设计方法和组成部分。
2.学习编制连接命令文件,并用来控制代码的连接。
3.学会建立和改变map文件,以及利用它观察DSP内存使用情况的方法。
4.熟悉使用软件仿真方式调试程序。
二.实验设备PC兼容机一台,操作系统为Windows2000(或Windows98,WindowsXP,以下默认为Windows2000),安装Code Composer Studio 2.0软件。
三.实验原理1.标准C语言程序CCS支持使用标准C语言开发DSP应用程序。
当使用标准C语言编制的程序时,其源程序文件名的后缀应为.c (如:volume.c)。
CCS在编译标准C语言程序时,首先将其编译成相应汇编语言程序,再进一步编译成目标DSP 的可执行代码。
最后生成的是coff格式的可下载到DSP中运行的文件,其文件名后缀为.out。
由于使用C语言编制程序,其中调用的标准C的库函数由专门的库提供,在编译连接时编译系统还负责构建C运行环境。
所以用户工程中需要注明使用C的支持库。
2.命令文件的作用命令文件(文件名后缀为cmd)为链接程序提供程序和数据在具体DSP硬件中的位置分配信息。
通过编制命令文件,我们可以将某些特定的数据或程序按照我们的意图放置在DSP所管理的内存中。
命令文件也为链接程序提供了DSP外扩存储器的描述。
在程序中使用CMD文件描述硬件存储区,可以只说明使用部分,但只要是说明的,必须和硬件匹配,也就是只要说明的存储区必须是存在的和可用的。
3.内存映射(map)文件的作用一般地,我们设计、开发的DSP程序在调试好后,要固化到系统的ROM中。
为了更精确地使用ROM空间,我们就需要知道程序的大小和位置,通过建立目标程序的map文件可以了解DSP 代码的确切信息。
当需要更改程序和数据的大小和位置时,就要适当修改cmd文件和源程序,再重新生成map文件来观察结果。
F2812烧写个人总结----增加程序2010-06-25 22:15在仿真器中将程序调试好,将程序烧入flash之前,需要做以下工作:一、硬件上确保DSP的XMP/MC管教接地,且SCIATXDA脚接高电平;XMP/MC接地为低电平:表示微机算计模式,那么0x3F FFC0指向的是2812的片内FLASH的地址。
上电复位后,复位向量是指向片内Flash的0x3F FFC0。
2812有一块flash地址从0x3F F000-0x3F FFFF在出厂时已经固化好了引导程序。
在0x3F FFC0处是一条跳转指令,跳到iniboot(地址0x3F FB50)函数处执行iniboot代码,该iniboot代码就是ti在dsp出厂时固化在flash中的。
Iniboot 函数判断几个GPIO引脚来判断使用哪一种引导模式,比如flash boot模式,检测SPICLKA,SCITXA,GPIO34的电平,当都为高电平时表明是片内flash boot模式,那么initboot执行完后跳转到0x3F 7FF6处,此位置刚好在128位(CSM)密码位置之前,你要在0x3F 7FF6处放置跳转指令(codestart:>BEGIN,PAGE=0 ),以跳转到你要去的地方。
BEGIN : origin = 0x3F7FF6, length = 0x000002/* Part of FLASHA. Used for "boot to Flash" bootloader mode. */ codestart : > BEGIN PAGE = 0SCIATXDA脚接高电平:是为那选择2812以FLASH作为引导模式我们在这里可以看到Flash启动模式,需要将GPIOF4,设置为高电平,其他三个引脚状态任意。
其配置如下:二、向工程中添加F2812_EzDSP_FLASH_lnk.cmd文件,它是用于flash烧写的CMD文件,用于替换原有的用于RAM中调试的F2812_EzDSP_RAM_lnk.cmd文件。
总的说一个完整的工程需要由库文件(.lib),头文件(.h),源文件(.c)和 CMD 文件(.CMD)组成,缺一不可。
至于各文件内容将在以后中详细说明(1)TI 库的移植1、库文件(.lib)rts2800_ml.lib --- 大存储器模式IQmath.lib --- Q化数学函数库2、TI库源文件头文件 DSP281x_common DSP281x_headers注意DSP281x_SWPrioritizedDefaultIsr.cDSP281x_SWPiroritizedPieVect.cDSP281x_XintfBootReset.asm这三个文件有需要时才添加3、CMD 文件4、修改TI库两个头文件a、DSP281x_headers\include\DSP281x_Device.h#define TARGET 1//---------------------------------------------------------------------------// User To Select Target Device:#define DSP28_F2812 TARGET#define DSP28_F2811 0#define DSP28_F2810 0b、DSP281x_common\include\DSP281x_Examples.h#define CPU_RATE 6.667L // for a 150MHz CPU clock speed (SYSCLKOUT) //#define CPU_RATE 7.143L // for a 140MHz CPU clock speed (SYSCLKOUT) 5、编写文件包含头文件#include "DSP281x_Device.h" // DSP281x Headerfile Include File#include "DSP281x_Examples.h" // DSP281x Examples Include File(2)TI库文件解释文件描述DSP281x_GlobalPrototypes.h这个文件包含外设详细的函数原型DSP281x_Adc.cADC具体函数和宏DSP281x_CpuTimers.cCPU-Timer具体函数和宏DSP281x_Ecan.c增强CAN详细函数和宏DSP281x_Ev.cEV详细函数和宏DSP281x_Gpio.cGPIO详细函数和宏DSP281x_Mcbsp.cMcBSP详细函数和宏DSP281x_PieCtrl.cPIE控制详细函数和宏DSP281x_Sci.cSCI详细函数和宏DSP281x_Spi.cSPI详细函数和宏DSP281x_SysCtrl.c系统控制(看门够,时钟,pll等) 详细函数和宏DSP281x_Xintf.cXINTF详细函数和宏DSP281x_Xintrupt.c外部中断详细函数和宏DSP281x_CodeStartBranch.asm当代码导入Flash,OTP或H0 SARAM存储器时,此程序确定代码从哪个分支开始执行。
2812的存储器配置本堂课我们来介绍存储器映像及CMD文件的编写,这部分内容较多,也是DSP区别于单片机的主要表现之一。
尤其是CMD文件的编写,工作中很多DSP的工作都是要围绕这个部分的内容进行,编写好的CMD文件也是衡量一个工程师水平高低的最好的体现。
那么我们现在就开始今天的课程。
第一节Memory简介在我们买计算机的时候,硬盘空间的大小是衡量计算机性能指标之一,在嵌入式DSP的工作时,存储器同样也是衡量的标准之一。
1.1What’s the memory?存储器是存放DSP运行过程中指令、代码、数据的地方,存储器的大小也直接影响到我们所编写的程序。
如果我们的程序量较大但选择了存储空间小的DSP时候,(工作中也经常遇到这样的问题,解决的方式之一就是充分的分析代码,看看能否压缩;第二就是将C语言改写成汇编语言)。
1.22812的memory的结构下面我们来看一下2812存储器的结构,是由那几部分组成的。
2812的CPU是不含有存储器的,但他可以访问片内也可访问片外的存储器。
2812的存储器分为这几个方面:1.程序或数据存储器1)单口随机存储器SRAM2)只读存储器ROM3)FLASH(3D 8000~3F 7FFF)共划分为ABCDEFGHIJ.A端地址(3F 6000~3F 7FFF)【注:FlashA】为Flash的高地址段最高的部分用于其他的功能【注:The difference between RAM & FLASH】平时先调试程序的时候,先将程序存放在RAM空间,限电丢失,一方面执行速度较快,另一方面下载速度较快;等到程序调试完毕后,程序下载到FLASH空间中。
他们可以被映射到程序空间或数据空间。
有同学会问“映像”是什么意思,英文“map”,意思是可以被分配用于程序空间(指令代码)或数据空间(数据资源)。
【注:the memory map in 2812】【注:Symbol】我们存储器的容量大小通常使用多少K*16位来表示。
第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所示。