hello第四课(二)f2812存储器映射及cmd详解-日志-eyes417-

合集下载

对于TMS320F2812的CMD文件的理解分解

对于TMS320F2812的CMD文件的理解分解

对于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(函数名或者全局变量名,“用户自定义在程序空间的段名”);必须注意:不能在函数体内声明,必须在定义和使用前声明。

2812存储器映射

2812存储器映射

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和DA TA_SECTION伪指令#pragma DATA_SECTION(funcA,"dataA"); ------ 函数外声明将funcA数据块定位于用户自定义的段"dataA"中 ------ 需要在CMD中指定dataA段的物理地址2.)MEMORY和SECTIONS是命令文件中最常用的两伪指令。

MEMORY伪指令用来表示实际存在目标系统中的可以使用的存储器范围,在这里每个存储器都有自己的名字,起始地址和长度。

TMS320F2812寄存器定义(完整版)

TMS320F2812寄存器定义(完整版)
必须为11
=0 XREADY输入为同步方式=1 XREADY输入为异步方式
确定对区的访问是进行采样还是忽略XREADY =0区访问时忽略XREADY
读周期的建立周期=00无效=01 1个XTIMCLK周期(X2TIMING1=1加倍) =10 2个XTIMCLK周期=11 3个XTIMCLK周期
读周期的激活周期n*(X2TIMING1+1)*XTIMCLK周期(总的激活时间为(1+XRDACTIVE))
0x7040---0x704F
16
非EALLOW保护
SPI寄存器
0x7050---0x705F
16
非EALLOW保护
SCI A寄存器
0x7070---0x707F
16
非EALLOW保护
外部中断寄存器
0x70C0---0x70DF
32
EALLOW保护
GPIO多路选择寄存器
0x70E0---0x70FF
HOLD.9 (R/W/0)
MP/MC.8 (R/W/X) |
WLEVEL.(7-6) (R/W/0
CLKOFF.3 (R/W/0)
CLKMODE.2 (R/W/1)
WRBUFF.(1-0) (R/W/0)
0x0B34
设定XTIMCLK时钟比例000 XTIMCLK=SYSCLKOUT其它保留001 XTIMCLK=SYSCLKOUT/2
FBANKWAIT
读访问等待周期寄存器
PAGEWAIT.(11-8)(R/W/1)
RANDWAIT.(3-0) (R/W/1)
0x0A86
FLASH页读操作等待状态。(0--15 SYSCLKOUT周期)
FLASH随机读操作等待状态。(0--15 SYSCLKOUT周期)

TMS320F2812的CMD文件的编写经验总结

TMS320F2812的CMD文件的编写经验总结

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:为动态存储分配保留的空间。

F2812主要功能简介-事件管理器

F2812主要功能简介-事件管理器
连续增/减计数模式
tactive (2 TxPR-TxCMPRup -TxCMPRdn )T定标输入时钟周期
TxCMPRup=0,TxCMPRdn≠0
tactive (2 TxPR-TxCMPRdn )T定标输入时钟周期
TxCMPRup=0,TxCMPRdn=0
tactive 2 TxPR T定标输入时钟周期
TxCMPRup﹥TxPR,TxCMPRdn﹥TxPR
tactive 0
35
GP Timer 复位状态
任何RESET事件发生时,都产生下列结果
计数方向位 = 1 其它所有定时器寄存器的位 = 0,定时器被禁止 所有中断标志位 = 0 功率保护中断屏蔽位 = 1,开放 其它所有中断屏蔽位 = 0 定时器比较输出被置高阻
内部/外部时钟输入,可编程分频,方向可引脚控制
4种可屏蔽中断:上溢、下溢、比较、周期
全比较单元 Full-Compare Units
3 x 2 个独立的比较单元,每个有6个比较输出
配合可编程死区发生器,产生PWM波形
可编程死区发生器 Programmable Deadband
Generation
为什么要设计6个PWM输出?
3个4位计数器,1个16位比较寄存器,死区值可编程
PWM波形发生器 PWM Waveform Generation
共可产生8个PWM波形输出
捕获单元 Capture Units
EVA:CAP1/2/3,EVB:CAP4/5/6,上/下边沿触发
3个16位 2-level-deep FIFO堆栈
不变
高 低 低 高 立即高 立即低
31
PWM输出逻辑

F2812引脚说明

F2812引脚说明

XINTF信号XA[0]~XA[18] --- 19位地址总线XD[0]~XD[15] --- 16位数据总线XMP/MC` --- 1 -- 微处理器模式 --- XINCNF7有效0 -- 微计算机模式 --- XINCNF7无效XHOLD` --- 外部DMA保持请求信号。

XHOLD为低电平时请求XINTF释放外部总线,并把所有的总线与选通端置为高阻态。

当对总线的操作完成且没有即将对XINTF进行访问时,XINTF释放总线。

此信号是异步输入并与XTIMCLK同步XHOLDA` --- 外部DMA保持确认信号。

当XINTF响应XHOLD的请求时XHOLDA呈低电平,所有的XINTF总线和选通端呈高阻态。

XHOLD和XHOLDA信号同时发出。

当XHOLDA有效(低)时外部器件只能使用外部总线XZCS0AND1` --- XINTF区域O和区域1的片选,当访XINTF区域0或1时有效(低)XZCS2` --- XINTF区域2的片选,当访XINTF区域2时有效(低)XZCS6AND7` --- XINTF区域6和区域7的片选,当访XINTF区域6或7时有效(低)XWE` --- 写有效。

有效时为低电平。

写选通信号是每个区域操作的基础,由XTIMINGX寄存器的前一周期、当前周期和后一周期的值确定XRD` --- 读有效。

低电平读选通。

读选通信号是每个区域操作的基础,由xTIMINGX寄存器的前一周期、当前周期和后一周期的值确定。

注意:XRD`和XWE`是互斥信号XR/W` --- 通常为高电平,当为低电平时表示处于写周期,当为高电平时表示处于读周期XREADY --- 数据准备输入,被置1表示外设已为访问做好准备。

XREADY可被设置为同步或异步输入。

在同步模式中,XINTF接口块在当前周期结束之前的一个XTIMCLK时钟周期内要求XREAD Y有效。

在异步模式中,在当前的周期结束前XINTF接口块以XTIMCLK的周期作为周期对XREAD Y采样3次。

F2812存储器映射及CMD详解

F2812存储器映射及CMD详解

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伪指令用来表示实际存在目标系统中的可以使用的存储器范围,在这里每个存储器都有自己的名字,起始地址和长度。

第三章F2812片内资源、存储器映射以及CMD文件的编写

第三章F2812片内资源、存储器映射以及CMD文件的编写

7
3.2 F2812的存贮器映射
8
让我们看看F2812内部的映射空间,如图4所示。其存储空间 分布如下表所示
9
10
11
3.3.CMD文件的认识
CMD:command命令,顾名思义就是命令文件指定存储区域的分配, 2812的CMD采用的是分页制,其中PAGE0用于存放程序空间,而 PAGE1用于存放数据空间。 MEMORY伪指令用来表示实际存在目 标系统中的可以使用的存储器范围,在这里每个存储器都有自己的 名字,起始地址和长度。SECTIONS伪指令是用来描述输入端是如 何组合到输出端内的。
4
5
先来讲地址总线,顾名思义,这类总线的作用就是 来传送存储单元的地址的。 1. PAB(Program Address Bus)程序地址总线,它是 一个22位的总线,用于传送程序空间的读写地址。程序 在运行的时候,假如执行到了某一个指令,那么需要去 找到这段代码的地址,就是用PAB来传送。 2. DRAB(Data-Read Address Bus)数据读地址总线 ,它是个32位的总线,用于传送数据空间的读地址。假 如要读取数据空间某一个单元的内容,那么这个单元的 地址就是通过DRAB来传送。 3. DWAB(Data-Write Address Bus)数据写地址总线 ,它也是个32位的总线,用于传送数据空间的写地址。 类似的,如果我要对数据空间的某一个单元进行写操作 ,那么这个单元的地址就是通过DWAB来传送。
DSP技术
电气自动
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引脚。

第4课 2812的片内资源、存储器映射以及CMD文件的编写

第4课 2812的片内资源、存储器映射以及CMD文件的编写

第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口,以避免不必要的损失。

TMS320f2812地址映射以及CMD文件详解

TMS320f2812地址映射以及CMD文件详解

S
CIRXEMU; // Recieve emulation buffer register
union SCIRXBUF_REG SCIRXBUF; // Recieve data buffer
Uint16
rsvd1; // reserved
Uint16
SCITXBUF; // Transmit data buffer
extern volatile struct SCI_REGS SciaRegs;
extern volatile struct SCI_REGS ScibRegs; 大家可以看到,这里定义了两个结构体,一个是 SciaRegs ,一个是 ScibRegs,因为 DSP 内部有两个串行通信, A 和 B,这两个都是结构体,而类型就是前面的 SCI_REGS 的,这个结构体类型是这样定义的:
EVA : origin = 0x007400, length = 0x000040
EVB : origin = 0x007500, length = 0x000040
SCIB : origin = 0x007750, length = 0x000010
MCBSPA : origin = 0x007800, length = 0x000040
#pragma CODE_SECTION(funcA,“codeA ”); char funcA(int i); //对函数 funcA 的声明 上面中,funcA 函数一定是外部声明或者定义的函数,CODE_SECTION 为 funcA 在一个名为 codeA 的块中指 定空间。如果你有一个代码对象并想将其链接到不同于.txt 的空间时,该语法就非常有用。而 codeA 在.cmd 文件中指定了物理地址。 #pragma DATA_SECTION(bufferB,“my_sect”); char bufferB [512]; // 对 bufferB 的定义放在 pragma 的后面 DATA_SECTION 为 bufferB 在一个名为 my_sect 的块中指定空间。如果你有一个数据对象并想将其链接到不同 于.bss 的空间时,该语法就非常有用. 数据块 bufferB 被定位于 my_sect 段中,my_sect 段在 .cmd 文件中规定 了物理地址。 看完上面的一段解释,估计您会对#pragma 有了很好的了解了吧 。我们使用的结构体是数据而不是函 数,所以我们使用 DATA_SECTION。其实就是把 SciaRegs 和 ScibRegs 分别在块 SciaRegsFile 和 ScibRegsFile 中 指定空间,而块 SciaRegsFile 和 ScibRegsFile 在.cmd 文件中指定了物理地址。这样一来,是不是结构体 SciaRegs 和 ScibRegs 的起始地址就知道了?答案是肯定的。我们在看分析.cmd 文件。.cmd 文件的源代码如下:

F2812外部接口XINTF资料

F2812外部接口XINTF资料

F2812外部接口XINTF什么是外部接口,外部接口有什么作用,怎么去配置和使用这一块。

今天了解了这部分的知识,现将其详细的记录下来。

先看一下什么是外部接口。

外部接口是F2812与外部设备进行通信的重要接口,这些外部接口对应着CPU内部的某个存储空间,CPU通过对存储空间进行的读写操作间接控制外部接口。

书本上抄下来的定义,很是官方啊,不好懂。

再来看一下接的是一些什么,估计是不是会好理解一些呢?一般用于RAM,FLASH等。

哦...估计是内部数据或者是程序存不下了,找一个外面的片子来做存储区扩展用的接口。

外部接口有哪一些线呢?有片选信号线、数据总线、地址总线、读写使能信号线、以及其他信号线。

F2812中外部接口被映射到5个固定的存储空间区域,每个区域都有一个片选信号。

当系统使能片选信号后,数据自动存储到对应的存储空间内。

嘻嘻!就喜欢这一句自动存储。

所有的数字芯片不能少的一条主线就是时钟,这个模块的时钟怎样呢?答:XINTF模块的时序都是参照F2812的内部时钟XTIMCLK。

大小可以人为设定为系统时钟或系统时钟的一半。

F2812中XINTF的使用想使用XINTF先要弄清楚里面有些什么,外面有些什么引脚需要接线。

XINTF一共有5个空间,分别是Zone0、Zone1、Zone2、Zone6、Zone7,每个空间有相应的片选信号线连接到外面。

其中1、2共用一根片选线,6、7共用一根片选线;2、6共用相同的外部地址,外部首地址0x0 0000、尾地址0x7 ffff;1、2占用的外部总线地址不同,0的为0x2000~0x3fff、1的为0x4000~0x5fff;空间7可以作为外部启动的存储空间,由于这个空间的特殊性,所以暂时不打算用,也就不放在这里讨论了。

观察了一下开发板,CPLD的接线为8根数据线,五根地址线,空间0、1共用的片选线,还有R/W读写信号线,WE写使能信号线,RD读使能信号线。

对XINTF空间的操作分为以下三个部分,引导、激活、跟踪。

F2812性能及引脚简介

F2812性能及引脚简介

74164工作时序图
程序设计 主程序主要包括系统初始化、中断向量初始化、设置 GPIO端口、控制数据传输几个步骤。
设置GPIO端口的配置函数 void Gpio_select(void) { EALLOW; GpioMuxRegs.GPBMUX.all=0x0000; GpioMuxRegs.GPBDIR.all=0xFFFF; GpioMuxRegs.GPFMUX.all=0x0000; GpioMuxRegs.GPFDIR.all=0xFFFF ; EDIS; }
• C28X系列主要芯片包括TMS320F2812和 TMS2810。二者差别:F2812内含128K*16位 的Flash存储器,有外部存储器接口,而 F2810仅有64K*16位的片内Flash存储器,且 无外部存储器接口。
C28X系列芯片主要性能
• • • • 主频150MHz(时钟周期6.67ns) CPU内核电压1.8V,I/O口电压3.3V Flash编程电压3.3V 高性能的32位CPU: 16位*16位和32位*32位乘且累加操作 16位*16位的两个乘且累加 哈佛总线结构 • 功能强大的外设
个15位的数字I/O口GPIOF。
• 通过使用GPIO的有关寄存器可以选择和控制这些 共享引脚的操作。例如:通过GPxMUX寄存器可
以把这些引脚作为数字I/O或片内外设I/O口。如果
选择某个引脚作为数字I/O口,则可以通过 GPxDIR寄存器来设置引脚的方向;另外,可以 通过GPxQUAL寄存器来改善输入信号,有效的 消除输入信号的毛刺脉冲的干扰。
看门狗功能的软件配置
// Disable watchdog module SysCtrlRegs.WDCR= 0x0068; • • • • • • • • • • • // This function resets the watchdog timer. // Enable this function for using KickDog in the application /* void KickDog(void) { EALLOW; SysCtrlRegs.WDKEY = 0x0055; SysCtrlRegs.WDKEY = 0x00AA; EDIS; } */

f2812统计代码运行时间

f2812统计代码运行时间

f2812统计代码运行时间f2812计算器是很多嵌入式领域开发者常用的工具,其精密的计算、高效的速度和多种接口,使得它被广泛应用于各种嵌入式应用中。

在使用f2812开发嵌入式应用时,我们通常会遇到一个关键问题,即如何计算代码运行时间,确保应用程序的稳定性和可靠性。

在本文中,我们将深入探讨如何使用f2812进行代码运行时间的统计。

一、f2812简介f2812是德州仪器(TI)公司推出的一款高性能数字信号处理器(DSP)。

它采用了32位RISC架构,配备了浮点数运算单元(FPU)和12位模数转换器(ADC),可广泛应用于各种嵌入式系统和实时数字信号处理应用中。

f2812还具有丰富的通信接口,如串口、CAN、SPI等,方便开发者与外部设备进行数据交换。

二、代码运行时间的重要性在嵌入式系统开发过程中,代码运行时间是一个非常重要的指标。

因为嵌入式系统往往需要高速运行,确保低延迟、高精度和高效率,而代码的运行时间决定了嵌入式系统的响应速度和稳定性。

如果代码运行时间过长,会导致系统性能降低、响应时间变长,甚至出现系统崩溃的情况,对嵌入式应用带来严重影响。

因此,开发者需要对代码运行时间进行精准的测量和分析,以保证系统的稳定性和可靠性。

三、f2812如何统计代码运行时间f2812的时钟频率可通过对内部时钟信号进行配置设置。

通常情况下,f2812的时钟频率为150MHz,即一个时钟周期为6.67ns。

由于f2812处理器的高速性能,它可精确测量代码执行时间,确保代码执行流程的正确性。

在系统中,代码执行时间可通过使用f2812的计时器模块(timers)来统计。

f2812计时器模块由四个16位计时器(timers)和两个带有死区发生器(deadband generators)的16位PWM(脉冲宽度调制器)组成。

可以通过使用计时器读取计数寄存器(timer counter)的值来统计代码的执行时间。

具体来说,我们可以采用以下步骤进行操作:1. 初始化计时器我们需要先将计时器进行初始化,以确保其处于正确的状态。

F2812-GPIO详细资料说课讲解

F2812-GPIO详细资料说课讲解

F2812-G P I O详细资料F2812 I/O配置与应用GPIO,英文全称为General-Purpose IO ports,也就是通用IO口。

嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号。

而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭。

对这些设备/电路的控制,使用传统的串行口或并行口都不合适。

所以在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO。

接口至少有两个寄存器,即“通用IO控制寄存器”与“通用IO数据寄存器”。

数据寄存器的各位都直接引到芯片外部,而对这种寄存器中每一位的作用,即每一位的信号流通方向,则可以通过控制寄存器中对应位独立的加以设置。

这样,有无GPIO接口也就成为微控制器区别于微处理器的一个特征。

一、 F2812 I/O端口概述F2812提供了56个多功能引脚,这些引脚的第一功能是作为通用意义数字I/O口(GPIO),而第二功能则可以作为片内外设的输入/输出引脚。

F2812通过专门的多路选择器(MUX)进行引脚功能的选择。

如果作为通用数字I/O 口,有专门的方向寄存器用于配置引脚作为输入还是输出,另外还有专门的数据寄存器、置位寄存器、清零寄存器以及触发寄存器用于对I/O口的状态进行读取或配置。

GPIO 引脚分配GPIO AGPIOA0 / PWM1 GPIOA1 / PWM2 GPIOA2 / PWM3 GPIOA3 / PWM4 GPIOA4 / PWM5 GPIOA5 / PWM6 GPIOA6 / T1PWM_T1CMP GPIOA7 / T2PWM_T2CMP GPIOA8 / CAP1_QEP1 GPIOA9 / CAP2_QEP2 GPIOA10 / CAP3_QEPI1 GPIOA11 / TDIRA GPIOA12 / TCLKINA GPIOA13 / C1TRIP GPIOA14 / C2TRIP GPIOA15 / C3TRIPGPIO BGPIOB0 / PWM7 GPIOB1 / PWM8 GPIOB2 / PWM9 GPIOB3 / PWM10 GPIOB4 / PWM11GPIOB5 / PWM12GPIOB6 / T3PWM_T3CMPGPIOB7 / T4PWM_T4CMPGPIOB8 / CAP4_QEP3GPIOB9 / CAP5_QEP4GPIOB10 / CAP6_QEPI2GPIOB11 / TDIRBGPIOB12 / TCLKINBGPIOB13 / C4TRIPGPIOB14 / C5TRIPGPIOB15 / C6TRIPGPIO DGPIOD0 /T1CTRIP_PDPINTAGPIOD1 / T2CTRIP / EVASOCGPIOD5 /T3CTRIP_PDPINTBGPIOD6 / T4CTRIP / EVBSOCGPIO EGPIOE0 / XINT1_XBIOGPIOE1 / XINT2_ADCSOCGPIOE2 / XNMI_XINT13 GPIO FGPIOF0 / SPISIMOA GPIOF1 / SPISOMIA GPIOF2 / SPICLKAGPIOF3 / SPISTEAGPIOF4 / SCITXDAGPIOF5 / SCIRXDAGPIOF6 / CANTXAGPIOF7 / CANRXAGPIOF8 / MCLKXAGPIOF9 / MCLKRAGPIOF10 / MFSXAGPIOF11 / MFSRAGPIOF12 / MDXAGPIOF13 / MDRAGPIOF14 / XFGPIO GGPIOG4 / SCITXDBGPIOG5 / SCIRXDBNote: GPIO are pinfunctions at reset GPIO A, B, D, E include Input Qualification feature二、GPIO寄存器控制2、1 GPxMUX寄存器通用输入输出多路选择寄存器I/O是工作在通用数字IO还是外围IO信号引脚就有GPxMUX决定。

F2812操作笔记

F2812操作笔记

目录一、如何开始DSP的学习 (2)二、完整工程的构成 (4)三、CCS的操作 (7)1、CCS的布局和结构 (7)2、开始调试程序 (8)3、统计代码运行时间 (10)四、F2812的资源 (15)1、F2812的片内资源 (16)2、地址总线和数据总线 (16)3、内部的存储器资源 (18)4、存储器映射 (18)5、映射和空间的统一编址 (20)6、2812CMD详解 (21)五、中断系统 (25)1、F2812的中断系统 (25)2、2812中断程序模板 (29)六、F2812的时钟系统 (32)1、振荡器OSC和锁相环PLL (32)2、2812芯片中各种时钟信号的产生情况 (33)3、看门狗(Watch Dog) (34)4、系统初始化函数 (34)七、IO口控制 (37)八、F2812的EV模块 (39)1、事件管理器的功能 (39)2、通用定时器 (40)3、通用定时器初始化程序 (43)九、F2812的PWM (46)1、通用定时器产生的PWM波 (46)2、三相全桥电路桥理想驱动波形 (49)十、F2812的SCI模块 (53)1、2812 SCI模块 (54)2、SCI模块的特点 (55)3、SCI模块发送和接收数据的工作原理 (55)4、SCI数据格式 (56)5、SCI通信波特率设置 (56)6、SCI发送和接收数据的机制 (57)7、多处理器通信 (58)一、如何开始DSP的学习以下为各网友学习DSP的一些经验fxw451:大家先大体上看一遍书,把大体的知识了解一下。

其次就是看例子了,例子是关键,例子里有你学的所有的东西,这次你再拿出一本书来看,这次是有针对性的看,比如你做的spi的,你就直接看sp i那张,一边看例子一边看书,这样你就可以把一些重要的寄存器给记住了。

对于初学者来说,一直好奇的就是ccs的使用,拿我第一次使用ccs来说,当我把ccs和板子连载一起时,我相当高兴,成功感油然升起,接下来就是用ccs里的看自带的例子了,看完后你就会发现,这些是什么东东哦,什么都不会,这就对了,你要是看一开始看会了你就是神仙了,dsp不像单片机那么容易上手,所以你要花费点功夫吃透它,好东西不是那么容易就可以搞定的。

TMS320F2812总结

TMS320F2812总结

TMS320F2812学习总结一、复位2812复位后,芯片会采样XMPNMC 引脚的状态,这个脚的状态决定了2812复位后是从内部的Boot Rom 引导还是从外部接口区域7引导,如果XMPNMC=1(微处理模式),那么复位的中断向量将会指向外部的存储区域7,当然这种模式下必须保证外部的存储区域可用,同时引导程序必须由程序员事先写好,才能保证芯片的正常启动。

如果XMPNMC=0(微计算机模式),那么外部存储区域7将被禁止而内部的Boot Rom 使能,在这种情况下,芯片复位后将会从内部的Boot Rom 获得复位向量。

一般情况下我们都是采用微计算机模式,因此对这一引导方式做详细地说明。

在微计算机模式下,芯片复位后从内部的Boot Rom 0x3fffc0处读取0z3ffc00这个地址,因此程序就从这个地址开始执行。

图1.1是Boot Rom图1.1 片上Boot Rom的存储器映射表,可以看出0x3fffc0处正好是2812的复位向量,跳转后的地址0x3ffc00正好是芯片的引导加载函数的入口,因此芯片复位后将会执行引导加载函数,然后该函数根据芯片的特殊GPIO 口的状态确定芯片的引导模式。

表1.1给出了4个GPIO 引脚的状态来确定所要使用的引导模式。

表1.1 由4个GPIO 引脚选择的引导模式GPIOF4 (SCITXDA)PUGPIOF12 (MDXA) NO PUGPIOF3 (SPISTEA) NO PUGPIOF2 (SPICLK) NO PU模式选择1 x x x 跳转到Flash 0x3F7FF6地址处0 1 x x调用SPI_Boot 函数,利用SPI 口从外部串行EEPROM 中引导0 0 1 1调用SCI_Boot 函数从SCI_A 口进行引导 0 0 1 0 跳转到H0 SARAM 中0x3F8000地址处 0 0 0 1跳转到OTP 中0x3D7800地址处0 0 0 0调用Parallel_Boot 函数从GPIO 口B 进行引导注:1、PU代表该引脚内部被拉高,NO PU则表示该引脚没有被内部拉高。

F2812寄存器速查手册

F2812寄存器速查手册

007+2004821074(149259898)015+zhengjunfe031_yangyansky(287817962)050+ywnwa(109264732)067+chaosming(276907343)084_suary(122757250)115 dandan112由衷感谢以上几位抽出宝贵的时间整理各模块的相关寄存器!限于水平,整理过程中难免存在错误或不当之处,恳请大家批评指正。

在奋斗中前行!事件管理器寄存器 (2)GPIO MUX 寄存器 (14)eCAN部分 (18)WDRST时钟、锁相环、看门狗和低功耗模式寄存器 (33)片内外设的中断扩展(PIE)寄存器 (38)串行通信接口 (42)ADC模块相关寄存器 (46)SPI模块寄存器 (54)事件管理器寄存器名称地址 占用地址空间(16bit)EVA描述GPTCONA 0x7400 1 通用定时器全局控制寄存器A T1CNT 0x7401 1 定时器1计数寄存器T1CMPR 0x7402 1 定时器1比较寄存器 T1PR 0x7403 1 定时器1周期寄存器T1CON 0x7404 1 定时器1控制寄存器T2CNT 0x7405 1 定时器2计数寄存器T2CMPR 0x7406 1 定时器2比较寄存器 T2PR 0x7407 1 定时器2周期寄存器T2CON 0x7408 1 定时器2控制寄存器 EXTCONA 0x7409 1 扩展控制寄存器A COMCONA 0x7411 1 比较控制寄存器A ACTRA 0x7413 1 比较操作控制寄存器A DBTCONA 0x7415 1 死区定时器控制寄存器A CMPR1 0x7417 1 比较寄存器1 CMPR2 0x7418 1 比较寄存器2 CMPR3 0x7419 1 比较寄存器3 CAPCONA 0x7420 1 捕捉单元控制寄存器A CAPFIFOA 0x7422 1 捕捉单元FIFO状态寄存器A CAP1FIFO 0x7423 1 2极深度FIFO1堆栈 CAP2FIFO 0x7424 1 2极深度FIFO2堆栈 CAP3FIFO 0x7425 1 2极深度FIFO3堆栈 CAP1FBOT 0x7427 1 FIFO1栈底寄存器 CAP2FBOT 0x7428 1 FIFO2栈底寄存器 CAP3FBOT 0x7429 1 FIFO3栈底寄存器 EVAIFRA 0x742C 1 中断标志寄存器A EVAIFRB 0x742D 1 中断标志寄存器B EVAIFRC 0x742E 1 中断标志寄存器C EVAIMRA 0x742F 1 中断屏蔽寄存器A EVAIMRB 0x7430 1 中断标志寄存器B EVAIMRC 0x7431 1 中断标志寄存器CEVBGPTCONB 0x7500 1 通用定时器全局控制寄存器B T3CNT 0x7501 1 定时器3计数寄存器T3CMPR 0x7502 1 定时器3比较寄存器 T3PR 0x7503 1 定时器3周期寄存器T3CON 0x7504 1 定时器3控制寄存器T4CNT 0x7505 1 定时器4计数寄存器T4CMPR 0x7506 1 定时器4比较寄存器T4PR 0x7507 1 定时器4周期寄存器T4CON 0x7508 1 定时器4控制寄存器EXTCONB 0x7509 1 扩展控制寄存器BCOMCONB 0x7511 1 比较控制寄存器BACTRB 0x7513 1 比较操作控制寄存器BDBTCONB 0x7515 1 死区定时器控制寄存器BCMPR4 0x7517 1 比较寄存器4CMPR5 0x7518 1 比较寄存器5CMPR6 0x7519 1 比较寄存器6CAPCONB 0x7520 1 捕捉单元控制寄存器BCAPFIFOB 0x7522 1 捕捉单元FIFO状态寄存器B CAP4FIFO 0x7523 1 2极深度FIFO4堆栈CAP5FIFO 0x7524 1 2极深度FIFO5堆栈CAP6FIFO 0x7525 1 2极深度FIFO6堆栈CAP4FBOT 0x7527 1 FIFO4栈底寄存器CAP5FBOT 0x7528 1 FIFO5栈底寄存器CAP6FBOT 0x7529 1 FIFO6栈底寄存器EVBIFRA 0x752C 1 中断标志寄存器AEVBIFRB 0x752D 1 中断标志寄存器BEVBIFRC 0x752E 1 中断标志寄存器CEVBIMRA 0x752F 1 中断屏蔽寄存器AEVBIMRB 0x7530 1 中断屏蔽寄存器BEVBIMRC 0x7531 1 中断屏蔽寄存器CGPTCONA(通用定时器全局控制寄存器A)15 14 13 12 11 10 9 8Reserved T2STAT T1STAT T2CTRIPE T1CTRIPE T2TOADC T1TOADC7 6 5 4 3 2 1 0T1TOADC TCOMPOE T2CMPOE T1CMPOE T2PIN T1PIN GPTCONA功能定义名称 功能描述位(Bit)15 Reserved Reserved14 T2STAT 通用定时器2的状态 0- 递减计数 1- 递增计数13 T1STAT 通用定时器1的状态 0- 递减计数 1- 递增计数12 T2CTRIPE T2CTRIP使能位,使能或禁止定时器2的比较输出。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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是命令文件中最常用的两伪指令。

MEMORY伪指令用来表示实际存在目标系统中的可以使用的存储器范围,在这里每个存储器都有自己的名字,起始地址和长度。

SECTIONS伪指令是用来描述输入端是如何组合到输出端内的。

以常用的F2812_nonBIOS_RAM.cmd
F2812_nonBIOS_Flash.cmd 和
DSP281x_Headers_nonBIOS.cmd为例
F2812_nonBIOS_RAM.cmd ----- 用于仿真,无BIOS系统,片外SRAM配置CMD文件里有两个基本的段:初始化段和
非初始化段。

初始化段包含代码和常数等必须在DSP上电之后有效的数。

故初始化块必须保存在如片内FLASH等非遗失性存储器中,非初始化段中含有在程序运行过程中才像变量内写数据进去,所以非初始化段必须链接到易失性存储器中如RAM。

已初始化的段:.text,.cinit,.const,.econst,..pinit 和.switch..
.text:所有可以执行的代码和常量
.cinit:全局变量和静态变量的C初始化记录
.const:包含字符串常量和初始化的全局变量和静态变量(由const)的初始化和说明
.econst:包含字符串常量和初始化的全局变量和静态变量(由far const)的初始化和说明
.pinit:全局构造器(C++)程序列表
.switch:包含switch声明的列表 
非初始化的段:.bss,.ebss,.stack,.sysmem,和esysmem.(更好的理解就是,这些段就是存储空间而已)
.bss: 为全局变量和局部变量保留的空间,在程序上电时.cinit 空间中的数据复制出来并存储在.bss空间中。

.ebss:为使用大寄存器模式时的全局变量和静态变量预留的空间,在程序上电时,cinit空间中的数据复制出来并存储
在.ebss中
.stack:为系统堆栈保留的空间,主要用于和函数传递变量或为局部变量分配空间。

.sysmem:为动态存储分配保留的空间。

如果有宏函数,此空间被宏函数占用,如果没有的话,此空间保留为0
.esysmem:为动态存储分配保留的空间。

如果有far函数,此空间被相应的占用,如果没有的化,此空间保留为
0.F2812_nonBIOS_Flash.cmd --- 用于无BIOS,从片内FLASH引导对于程序在FLASH中运行时,需要注意的:DSP在150M时钟频率下,FLASH中只能提供大约120M的时钟频率,所以有时候我们希望在RAM中运行时间敏感或计算量很大的子程序(比如AD采样)。

但是我们所有代码都放在FLASH中,这就必须在上电后将FLASH中的这段敏感程序复制到RAM中运行,加快速度。

这是在.CMD文件就必须划分一段用来设置RAM的载入和运行地址。

程序代码如下:
SECTIONS {………
ramfuncs : LOAD = FLASHD,
RUN = RAML0,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0
}
“load=加载地址run =运行地址”链接器为每个输出段都在目标存储器里分配两个地址:一个是加载地址,一个是运行地址。

通常情况下两个地址是相同的,可以认为输出段只有一个地址,这时就可以不加“run =运行地址”这条语句了;但有时需要将两个地址分开,比如将程序加载到FLASH,然后放到RAM中高速运行,这就用到了运行地址和加载地址的分别配置了.
“load =加载地址”的几种写法需要说明一下,首先“load”关键字可以省略,“=
”可以写成“>”, “加载地址
”可以是:地址值、存储区间的名字、PAGE关键词等,所以大家见到“.text:{ } > 0x0080”这样的语句可千万不要奇怪。

“run =运行地址”中的
“ = ”可以用
“>”DSP281x_Headers_nonBIOS.cmd -----
用于无BIOS,外设寄存器产生的数据段映射至对应的存储器空间查看段的分配及使用情况.map的链接器(存储器)分配映射文件,链接器的map文件描述以下内容:通过map 文件可以查看各段的分配情况,包括段的起始地址,使用的字节数等配合cmd文件的使用,可确定各个段的使用情况,从而保证程序的正常运行和最小的空间使用。

VisualLinker 可视化链接器TI公司出品的DSP软件开发环境CCS还提供了一种可视化生成存储器配置文件的工具:VisualLinker可视化链接器。

如果程序原来包含了一个链接器命令文件(.cmd 文件),则当创建可视化链接文件的时候,原来cmd文件中的内存配置仍然会被使用。

如果读者想修改内存配置,双击.rcp文件就会在CCS中打开可视化链接器的图形界面,调整每个内存模块的大小,直到认为合适,然后只需要重新连编,程序即可生成新的输出文件,重复上面的步骤,直到出现满意的结果。

相关文档
最新文档