精华内容
下载资源
问答
  • DSP2812之中断系统

    千次阅读 2018-11-04 19:53:19
    首先,如果有外设产生中断事件,则寄存器中相应中断标志位被置1,如果相应中断使能位被置位,那么外设将向PIE控制器发出一个中断请求。 其次,当外设向PIE控制器发送中断请求时,相应PIE中断标志位(PI...

    中断系统概述

    X2812的中断系统从下至上分成了三级,即外设中断、PIE级中断、CPU级中断,三级中断类似于串联的关系,共同完成中断信号的发生、判断及次处理。现对中断系统的执行流程作简要概述:
    首先,如果有外设产生中断事件,则寄存器中相应的中断标志位被置1,如果相应的中断使能位被置位,那么外设将向PIE控制器发出一个中断请求。
    其次,当外设向PIE控制器发送中断请求时,相应的PIE中断标志位(PIEIFRx.y)置1,如果相应的PIE中断使能位(PIEIERx.y)也被置位,则PIE将检查相应的PIEACKx位,以确定CPU是否位该组中断准备好,如果PIEACKx位被清除,则PIE会向CPU发送管理请求,如果PIEACKx位为1,则PIE将一直等待直到该位被清除才向CPU发送中断请求。
    最后,当中断请求被发送到CPU,相应的CPU级中断标志位置1。当中断标志锁存到标志寄存器后,会检查CPU中断使能寄存器(IER)或调试中断使能寄存器(DBGIER)和全局中断屏蔽位(INTM)被使能后才被执行。
    X2812的三级中断机制如下图所示:

    1.外设级中断

    外设中断操作流程

    在程序执行过程中,某一外设产生了一个中断事件,那么这个外设的某寄存器中与该中断事件相关的中断标志位(IF)被置位为1。此时,如果该中断相应的中断使能位(IE)已经被置位,也就是该值为1,该外设就会向PIE控制器发出一个中断请求,如果中断使能位未被置位,外设不会向PIE控制器提出中断请求,但是相应的中断标志位会一直保持,除非用程序将其手动清除,或者中断被使能,外设也会立即向PIE发出中断请求。
    以CPU定时器为例,手动请求清除定时器中断标志位代码如下:

    CpuTimer0Regs.TCR.bit.TIF= 1;     //清除定时器中断标志位
    // TCR: Control register bit definitions:
    struct  TCR_BITS {          // bits  description
       Uint16    rsvd1:4;       // 3:0   reserved
       Uint16    TSS:1;         // 4     Timer Start/Stop
       Uint16    TRB:1;         // 5     Timer reload
       Uint16    rsvd2:4;       // 9:6   reserved
       Uint16    SOFT:1;        // 10    Emulation modes
       Uint16    FREE:1;        // 11
       Uint16    rsvd3:2;       // 12:13 reserved
       Uint16    TIE:1;         // 14    Output enable       定时器中断使能位
       Uint16    TIF:1;         // 15    Interrupt flag          定时器中断标志位
    };
    

    如上述代码所示,当CPU定时器0的计数器寄存器TIMH:TIM计数到0时,就产生一个T0INT事件,即CPU定时器0的周期中断,此刻第15位定时器中断标志TIF被置位,这时,如果第14位TIE位1,CPU定时器0就会向PIE控制器发出中断请求。

    2.PIE级中断

    2.1 PIE中断概述

    中断控制器PIE,专门处理外设中断的扩展模块(Peripheral Interrupt Expansion),它能够对各种中断请求源做出判断和相应决策。
    PIE一共可以支持96个不同的中断,且将这些中断分成了12组,每组8个,12组依次反馈到CPU内核的INT1~INT12这12条中断线中的某一条上。平时能够用到的外设在PIE中的分布情况如下表所示:
    在这里插入图片描述从上表中看到,CPU定时器0的周期中断TINT0对应于INT1,在PIE第一组的第七位。PIE第一组的所有外设中断复用CPU中断INT1,依次类推,PIE第12组的所有外设中断复用CPU中断INT12。在PIE同组内,INTx.1的优先级高于比INTx.2高,不同组之间,排在前面组内的任何一个中断优先级要比排在后面组内的任何一个中断的优先级高。

    2.2 PIE中断寄存器

    PIE的每个组都有三个相关的寄存器,分别是PIE中断使能寄存器PIEIERx、PIE中断标志寄存器PIEIFRx和PIE中断应答寄存器PIEACKx(介绍省略)。

    2.3 PIE中断向量表

    PIE一共可以支持96个中断,每个中断都会有终端服务子程序ISR,DSP将各个中断服务子程序的地址存储在一片连续的RAM空间内,称之为PIE中断向量表。

    2.4 PIE中断操作流程

    当外设将中断请求提交给PIE,PIE中对应外设中断组的标志寄存器PIEIFRx将被置位,此时如果对应组的中断使能寄存器PIEIERx为使能状态,则PIE会根据中断的优先级优先处理高优先级中断,同时PIE寄存器还将根据中断应答寄存器PIEACK表示PIE是否准备好去响应这些组内中断。如CPU定时器0的周期中断被响应了,则PIEACK的第0位(对应于PIE1,即INT1)就会被置位,并且一直保持直到手动清除这个标志位,清除语句如下所示:

    PieCtrlRegs.PIEACK.bit.ACK1 = 1;     //可以响应组1内的其他中断
    

    所以,每个外设中断被响应之后,一定要对PIEACK的相关位进行手动复位,以使得PIE控制器能够响应组内的其他中断。

    3.CPU级中断

    X2812一共支持32个CPU中断,其中每一个中断都是一个32位的中断向量,用于存储相应的中断服务子程序的入口地址。CPU中断里,INT1~INT14是14个通用中断,也是可屏蔽中断,可通过CPU中断使能寄存器IER和中断标志寄存器IFR来响应中断。
    当一个外设中断请求通过PIE发送到CPU时,CPU中断标志寄存器IFR中相对应的中断标志位INTx就会被置位。这时,CPU不会立即执行中断,而是检查IER寄存器中相关位的使能情况和CPU寄存器ST1中全局中断屏蔽位INTM的是能情况。如果IER中的相关位被置位,并且INTM的值为0,则中断就会被CPU响应。

    4.CPU定时器0的周期中断控制LED灯闪烁实例

    #include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
    #include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
    
    interrupt void cpu_timer0_isr(void);           //定义定时器周期中断响应子函数
    
    void main(void)
    {
       InitSysCtrl();                              //初始化系统控制寄存器,包括锁相环、看门狗级外部时钟
       DINT;                                       //禁止CPU中断(INTM)
       InitPieCtrl();                              //初始化PIE控制寄存器置默认状态
       IER = 0x0000;                               //禁止CPU中断使能寄存器
       IFR = 0x0000;                               //禁止CPU中断标志寄存器
       InitPieVectTable();                         //初始化PIE中断向量表
       EALLOW;  
       PieVectTable.TINT0 = &cpu_timer0_isr;       //定时器的响应子程序赋值给TINT中断向量表
       EDIS;    
       InitCpuTimers();   // 初始化CPU计时器
       ConfigCpuTimer(&CpuTimer0, 150, 1000000);   //配置CPU计时器,每1响应一次定时器中断
       CpuTimer0Regs.TCR.all = 0x4001;             // 定时器外设中断使能
       EALLOW;
       GpioCtrlRegs.GPCMUX1.bit.GPIO66 = 0;        //配置GPIO66为IO口
       GpioCtrlRegs.GPCDIR.bit.GPIO66 = 1;         //配置GPIO66方向为输出
       EDIS;
       IER |= M_INT1;                              //CPU中断使能
       PieCtrlRegs.PIEIER1.bit.INTx7 = 1;          //PIE中断第一组的INTx7中断使能
       EINT;                                       //使能全局中断中断
       ERTM;                                       // 使能实时中断
       for(;;);
    }
    interrupt void cpu_timer0_isr(void)
    {
       CpuTimer0.InterruptCount++;
       GpioDataRegs.GPCTOGGLE.bit.GPIO66 = 1;       // 反转 GPIO66 的输出高低电平
       PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;      // 执行定时器中断子程序后,PIEACK标记位主动清除
    }
    
    展开全文
  • 数字I/O口有6路信号输出,其中2路用作限幅多路切换器不导通相选择,2路用作程控放大比较器放大倍数选择,2路用作换相信号输出使能。数字I/o口还有2路信号输人,是程控放大比较器给数字控制器换相信号。转速...
  • 通常,由一个以DSP为基础内核,配以测量控制所需外围功能电路,集成在单一芯片内,使芯片价格大大降低,体积缩小,结构紧凑,使用便捷,可靠性提高。因此,集成DSP芯片多功能板是电机应用、励磁脉冲控制系统、...
  • 最近在研究DSP遇到了一个问题,程序在RAM中正常运行,但写入到FLASH中后不运行. 花了几天时间后来终于搞定,今天在这里与大家一起来分享一下经验. DSP程序写入到FLASH中无法运行原来一般来说有下面几种原因: ...
    最近在研究DSP遇到了一个问题,程序能在RAM中正常运行,但写入到FLASH中后不能运行.
    花了几天的时间后来终于搞定,今天在这里与大家一起来分享一下经验.
    DSP程序写入到FLASH中无法运行的原来一般来说有下面几种原因:
    1、CMD文件配置错误
    2、编译选项不正确
    3、定义了在RAM中运行的函数,但在调用函数之前没有将其复制到RAM中,使程序跑飞。
    4、FLASH寄存器配置不正确
    如果你能解决上面的四方面的问题,你的程序一定能在FLASH中跑起来。下面教你怎样处理这些问题
    一、CMD文件配置不正确。
    这个可能性很小,因为CMD文件配置非常简单,如果你对CMD文件不太了解,请先学习一些这方面的知识,此处不讲,假设你对CMD文件已经了解。FLASH中运行的CMD文件与在ARM中运行的CMD文件不相同,具体不同点请查阅TI公司的文档SPRA958F(Runnung an Application from Internal Flash Memory on the TMS320F28XX DSP),这里面讲的非常清楚,包括Non-BIOS/BIOS 工程。我相信只要你认真看完那本大约40页的书,你一定能排除是CMD配置错误引起程序不能运行的原因,如果你到这一步你的程序能正常运行了,那恭喜你你是最幸运的,如果没有正常运行,不要急,慢慢来,下面还有更好的解决办法在等你。
    二、编译选项不正确
    这个原因对一些经验不足的同志来说可能被忽略,请看下图



    在编译选项中有一个优化等级的配置选项(上图的红色圈内的),如果你的程序不能运行你可以将他设置为None,即为不优化,设置好后保存,再重新编译你的工程,再将程序写入到FLASH中看看能不能运行。如果程序能运行,恭喜你,你也是幸运。因为你比上面的同志多学了一招,会受益终生的,如果不能运行那你更好幸运,说明你的程序原因不在这里,你还可以学习更多的知识。你会比别人更强。

    三、定义了在RAM中运行的函数,但在调用函数之前没有将其复制到RAM中,使程序跑飞。
    如果你定义了RAM函数,如TI公司头文件中自带InitFlash函数,这些函数会以CODE_SECTION申明。如下
    #pragma CODE_SECTION(InitFlash, "ramfuncs");
    在CMD文件中的SECTIONS段中应该有下面这样的说明
    ramfuncs           : LOAD = FLASHD, 
                             RUN = RAML0, 
                             LOAD_START(_RamfuncsLoadStart),
                             LOAD_END(_RamfuncsLoadEnd),
                             RUN_START(_RamfuncsRunStart),
                             PAGE = 0
    在你的C文件中应该有外部变量的申明。如下
    extern Uint16 RamfuncsLoadStart;
    extern Uint16 RamfuncsLoadEnd;
    extern Uint16 RamfuncsRunStart;
    当然上面说的那些在SPRA958F(Runnung an Application from Internal Flash Memory on the TMS320F28XX DSP)中都有说明。
    最重要的下面的函数调用
    InitFlash();
    MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);(这个MenCopy用的TI头文件中)
    你必须执行上面的函数,在你调用那些定义在RAM中运行的函数之前,否则活神仙也不能帮你解决问题。
    到这里的时候我相信你一定能松一口气了,因为你的问题应该已经解决了(只要你没有误解我的意思),先恭喜不管你有没有解决问题,因为就算你没有解决问题你也学到了一点点东西吧。
    4、FLASH寄存器配置不正确
    这种可能性很少,也可以会不会出现,只要你用的是TI公司的头文件(没有被修改过)我相信就不会出现这问题,TI的默认配置就可以正常运行只是你应该调用InitFlash();这个函数,哈哈你不要忘记了上面说的第三个可能性哦MemCopy。
    关天FLASH的配置我就不说了你自己看TI的文档吧,根据你自己的需要配置。
    展开全文
  • 主要是使能错误联防功能、TZ触发时PWM引脚工作状态等。 第三步:除了硬件TZ触发(一般接硬件过流信号),通过软件对TZFRC.OST寄存器写1,可以软件强制产生一个触发信号来控制PWM状态。 第四步:当软件对TZ

    @TOC

    F2812/F28335

    第一步:配置GPIO寄存器。TZ为引脚的复用功能,通过设置GPIO功能选择寄存器为TZ即可,例如设置GPAMUX1 = 0 ,代表改引脚为通用GPIO功能。
    在这里插入图片描述

    第二步:配置epwm寄存器。主要是使能错误联防功能、TZ触发时PWM引脚的工作状态等。
    在这里插入图片描述
    第三步:除了硬件TZ触发(一般接硬件过流信号),通过软件对TZFRC.OST寄存器写1,可以软件强制产生一个触发信号来控制PWM状态。
    第四步:当软件对TZ后的工作处理完成之后,可以通过对寄存器TZCLR.OST寄存器写1,来清楚OST标志。

    F28377/F28388

    在这里插入图片描述
    第一步:28377/28388对GPIO处理增加了X-BAR,当需要把GPIO配置为TZ功能时,先把GPIO配置为通用IO,方向为输入,此时需要多设置一个寄存器(X-BAR)。例如,当我把GPIO1作为TZ1信号时,设置如下:InputXbarRegs.INPUT1SELECT = 1;此时INPUT1和GPIO1进行了映射,根据上图可知INPUT1和TZ1是连接一起的。所以GPIO1便映射到了TZ1引脚。
    在这里插入图片描述
    第二步:设置epwm寄存器。例如使能错误联防功能、TZ触发时PWM状态等。和2812/28335类似。
    在这里插入图片描述
    第三步:除了硬件TZ触发(一般接硬件过流信号),通过软件对TZFRC.OST寄存器写1,可以软件强制产生一个触发信号来控制PWM状态。
    第四步:当软件对TZ后的工作处理完成之后,可以通过对寄存器TZCLR.OST寄存器写1,来清楚OST标志。

    总结

    主要区别在第一步,2812/28335通过GPAMUX寄存器来使能引脚的复用功能,而28377/28388除了设置GPIO的属性,还要通过设置X-BAR寄存器来映射引脚的复用功能。后面第2/3/4步几乎相同。

    展开全文
  • 可屏蔽中断通过相应中断使能寄存器使能或禁止产生中断,如图1所示。  图1 281x处理器中断源及其连接关系  在F281O和F2812处理器中,定时器1和定时器2预留给实时操作系统使用,其中断分配给INT14和INT13。...
  • 429数据收发模块采用429专用协议收发芯片HS-3282完成429总线数据格式转换和协议处理,CPLD逻辑控制模块使用CPLD地址译码产生HS-3282所需要初始化、接收使能、发送使能信号,TMS320F2812通过CPLD逻辑控制对HS-...
  • DSP芯片以其极高精度,性能及运算速度等无与伦比优点使它得到了十分广泛应用,TMS320F2812是TI公司生产到目前为止用于数字控制领域最好的DSP芯片,在对它仿真开发过程中,编译器生成代码和数据要由链接...

    DSP芯片以其极高的精度,性能及运算速度等无与伦比的优点使它得到了十分广泛的应用,TMS320F2812是TI公司生产的到目前为止用于数字控制领域的最好的DSP芯片,在对它的仿真开发过程中,编译器生成的代码和数据要由链接器分配到合适的存储空间,通常链接器的命令文件.cmd文件是由用户自己编写的,编写不当,就会使仿真开发不能进行,TI公司虽然在《TMS320C28x Optimizing C/C++ Compiler User’s Guide 6》和《TMS320C28x Assembly Language Tools User’s Guide 6》做了介绍,但内容却比较散乱而且要求读者对整个开发系统要有较全面的认识,这对于初学者来说是比较困难的。下面以TMS320F2812芯片为例,结合具体的仿真调试实例加以说明使大家能够既快速又准确的掌握.cmd文件的分配方法。

     

    1存储空间的配置

    TMS320F2812的DSP存储器分为三个独立选择的空间-程序空间、数据空间和I/O空间,其中程序存储器存放待执行的指令和执行中所用的系数(常数),可使用片内或片外的RAM、ROM或EPROM等来构成;数据存储器存放指令执行中产生的数据,可使用片内或片外

    的RAM和ROM来构成;I/O存储器存放与映象外围接口相关的数据,也可以作为附加的数据存储空间使用。表1是TMS320F2812的存储空间分布。


    2CMD文件的分配方法

    TI公司新的汇编器和链接器创建的目标文件采用一种COFF(通用目标文件格式),该目标文件格式更利于模块化编程,为管理代码段和目标系统存储器提供了强有力和灵活的编程方法。用户可以通过编写链接命令文件(.cmd文件)将链接信息放在一个文件中,以便在多次使用同样的链接信息时调用。在命令文件中使用两个十分有用的伪指令MEMORY和SECTIONS,来指定实际应用中的存储器结构和进行地址的映射。Memory用来指定目标存储器结构,Memory下可以通过PAGE选项配置地址空间,链接器把每一页都当作一个独立的存储空间。通常情况下,PAGE0代表程序存储器用来存放程序,PAGE1代表数据存储器,用来存放数据。由编译器生成的可重定位的代码和数据块叫做“SECTIONS”(段),SECTIONS用来控制段的构成与地址分配。对于不同的系统配置,“SECTION”的分配方式也不相同,链接器通过“SECTIONS”来控制地址的分配,所以“SECTIONS”的分配就成了配置.cmd文件的重要环节。以下是对“SECTIONS”的定义及分配的详细介绍。

    (1)

    被初始化的“SECTIONS”(包括数据表和可执行代码)

    .text它包括所有的可执行代码和常数,必须放在程序页;

    .cinit它包括初始化的变量和常量表,要求放在程序页;

    .pinit它包括全局构造器(C++)初始化的变量和常量表,要求放在程序页;

    .const它包括字符串、声明、以及被明确初始化过的全局和静态变量,要求放在低地址的数据页;

    .econst它是在使用大存储器模式时使用的,包括字符串、声明、以及被明确初始化过的全局变量和静态变量,可以放在数据页的任何地方。

    .switch它包括为转换声明设置的表格,可以放在程序页也可以放在低地址的数据页。

    (2)未被初始化的“SECTIONS”(为程序运行中创建和存放的变量在存储器中保留空间)

    .bss它为全局变量和静态变量保留空间。在程序开始运行时,C导入路径把数据从.cinit节复制出去然后存在.bss节中,要求放在低地址的数据页;

    .ebss它是在远(far)访问(只用于C)和大存储模式下使用,它为全局变量和静态变量保留空间。在程序开始运行时,C导入路径把数据从.cinit段复制出去然后存在.ebss节中,可以放在数据页的任何地方;

    .stack为C系统堆栈保留空间,这部分存储器为用来将声明传给函数及为局部变量留出空间,要求放在低地址的数据页;

    .system动态存储器分配保留空间。这个空间用于malloc函数,如果不使用malloc函数,这个段的大小就是0,要求放在低地址的数据页;

    .esystem动态存储器分配保留空间,这个空间用于外部malloc函数,如果不使用外部malloc函数,这个段的大小就是0,可以放在数据页的任何地方。

     

     

    3举例说明.cmd文件的分配方法

      以下是仿真调试串行通信接口SCI时的.cmd文件的分配,已经在TMS320F2812仿真调试中得到了很好的应用。

    MEMORY

     

    {PAGE0:

    /*ProgramMemory*/

     

    RAMH0:origin=0x3F8000,length=0x001000

     

    RAML0:origin=0x008000,length=0x001000

     

    RAML1:origin=0x009000,length=0x001000

     

    ROM:

    origin=0x3FF000,length=0x000FC0

     

    RESET: origin=”0x3FFFC0”,length=0x000002M

     

    VECTORS:origin=0x3FFFC2,length=0x00003EM

     

    PAGE1:/*DataMemory*/

     

    RAMM0:origin=0x000000,length=0x000400

     

    RAMM1:origin=0x000400,length=0x000400

     

    RAMH0:origin=0x3F9000,length=0x001000

    ,,,

    }

     

    SECTIONS

    {/*Allocateprogramareas:*/

     

    .cinit

    :>RAMH0

    PAGE=0

     

    .pinit

    :>RAMH0

    PAGE=0

     

    .text

    :>RAMH0

    PAGE=0

     

    .reset

    :>RESET,PAGE=0,TYPE=DSECT

     

    Vectors :>VECTORS,PAGE=0,TYPE=DSEC

     

    /*Allocateuninitalizeddatasections:*/

     

    .stack

    :>RAMM0

    PAGE=1

     

    .ebss

    :>RAMH0

    PAGE=1

     

    .esysmem :>RAMH0

    PAGE=1

     

    .econst :>RAMM1

    PAGE=1

     

    .switch :>RAMM1

    PAGE=1

     

     

    ,,,

    }

     

      为充分利用18k×16位的SARAM,本例将高地址的8k×16位的H0 SARAM区分成两部分,一部分用做存放程序放在PAGE0里,一部分用做存放数据放在PAGE1中以达到合理的分配;对实际仿真调试过程中的外围帧frame0,frame1,frame2等的分配因为篇幅问题就不做具体介绍了。

     

    4查看段的分配及使用情况

      在cmd文件中包括各种各样的链接器选项,每种选项代表不同的含义。其中,使用-m选项可以创建一个扩展名为.map的链接器(存储器)分配映射文件,其语法为:-m filename(文件名)。链接器的map文件描述以下内容:

    存储器结构

    输入和输出段的定位

    在重新定位后外部符号的地址

      通过map文件可以查看各段的分配情况,包括段的起始地址,使用的字节数等配合cmd文件的使用,可确定各个段的使用情况,从而保证程序的正常运行和最小的空间使用。

     

    5 VisualLinker可视化链接器

     

    TI公司出品的DSP软件开发环境CCS还提供了一种可视化生成存储器配置文件的工具:VisualLinker可视化链接器。如果程序原来包含了一个链接器命令文件(.cmd文件),则当创

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

    骤,直到出现满意的结果。

     

    6总结

      不同的DSP芯片内集成的存储器大小各异,但其配置方式是类似的。大家可通过查阅DSP芯片的数据手册,了解芯片内部存储空间大小。在实际的配置过程中,可根据开发程序的实际代码,正确的划分程序和数据空间中各段的大小,使其空间配置达到最优。

     

     

    DSP的命令文件CMD

    2007-07-15 18:51

    一、在给出命令文件示例前,首先介绍该文件常用到的几种伪指令。

    .cinit     程序编译连接时该标号表示部分存放已明确初始化的全局变量和静态变量;

    .const        程序编译连接时该标号表示部分存放已明确初始化的字符串常量、全局变量和静态变量;

    .switch        程序编译连接时该标号表示部分存放对于大型的switch语句的跳转表;

    .text            程序编译连接时该标号表示部分存放可执行代码和浮点数常量;

    .bss            该标号表示部分用于存放没有初始化的全局变量和静态变量;

    .stack          用该标号定义软件堆栈。

             命令文件名后缀为.CMD的文件实现对程序存储器空间和数据存储器空间的分配。该文件经常用到的伪指令有MEMORY伪指令和SECTIONS伪指令。

               当然用户也可以用C语言编程实现所需的功能。

                 MEMORY伪指令用来表示实际存在的目标系统中可被使用的存储器范围,每个存储器范围都有名字、起始地址和长度。MEMORY伪指令的一般语法为:

    MEMORY{

                     PAGE0:   name[(attr)]:       origin=constant,   length=constant;

                     PAGE1:   name[(attr)]:       origin=constant,   length=constant;

    }

    PAGE       标示存储器空间.用户可以规定多达255页,通常PAGE0规定程序存储器,PAGE1规定数据存储器.

    name         命名存储器范围.存储器可以是1~8个字符,在不同页上的存储器范围可以具有相同的名字,但在一页之内所有的存储器范围必须具有唯一的名字且必须不重叠.

    attr           规定与已命名范围有关的1~4个属性.未规定属性的存储器具有所有4个属性.有效的4个属性包括:

       R  规定存储器只读;

       W  规定存储器只写;

       X  规定存储器可以包含可执行代码;

       I  规定存储器可以被初始化.

    origin    规定存储器范围的起始地址.

    length   规定存储器范围的长度.

       SECTIONS 伪指令的作用是:描述输入段怎样被组合到输出段内;在可执行程序内定义输出段;规定在存储器内何处存放置输出段;允许重命名输出段.SECTIONS伪指令的一般语法是:

       SECTIONS{

             name:[property, property, property, …]   

             name:[property, property, property, …] 

             name:[property, property, property, …]  

       }

      每一个以name(名字)开始的段说明定义了一个输出段.在段名之后是特性列表,定义段的内容以及它们是怎样被分配的.特性可以用逗号来分开,段可能具有的特性是:

      装载位置,它规定段装载在存储器内何处;

      运行位置,它定义段在存储器内何处运行;

      输入段, 它定义组成输出段的输入段;

      段类型, 它定义特定段类型的标志;

      填充段, 它定义用于填充未初始化空间的数值.

    二、下面是一个简单实用的命令文件示例。

    -stack   40

    /*---------------------------------------*/

    /* 命令文件-存储空间F2407    */

    /*---------------------------------------*/ 

    MEMORY

    {  PAGE0: VECS  :origin=0h,    length=40h     /* 程序复位 */

                                    PVECS  :origin=40h,    length=70h     /* 外围模块中断向量 */ 

                                         PROG  :origin=0b0h,    length=7F50h     /* 在片FLASH */  

        PAGE1:MMRS :origin=0h,    length=05Fh     /*MMRS */

              B2   :origin=0060h,    length=020h     /*DARAM B2块 */  

              B0   :origin=0200h,    length=100h     /*DARAM B0块 */ 

              B1   :origin=0300h,    length=100h     /*DARAM B1块 */  

              SARAM :origin=0800h,    length=0800h     /*SARAM块 */ 

              EXT   :origin=8000h,    length=8000h     /*外部存储器 */

    }

    /*-----------------------------------------*/

    /* SECTIONS ALLOCATION                    */

    /*----------------------------------------*/

    SECTIONS{

      .reset   :{   } 〉 VECS    PAGE   0      /*   复位中断向量表 */

         .vectors   :{   } 〉 VECS    PAGE   0      /*   中断向量表 */   

           .pvecs   :{   } 〉 PVECS    PAGE   0      /* 外围模块中断向量表 */

            .text   :{   } 〉 PROG   PAGE   0      /*   代码 */  

            .cinit :{   } 〉 PROG   PAGE   0   

            .bss :{   } 〉 SARAM   PAGE 1      /* 块 B2   */  

            .const :{   } 〉 SARAM   PAGE 1      /* 块 B2   */ 

             .stack :{   } 〉B1        PAGE 1      /* 堆栈—40个单元   */ 

     

     

     ”hello,DSP world”工程实例

      本人所用版本CCS2.2

      一个完整的工程,至少需要四个文件构成:

      1、以.cmd结尾的命令文件,用来分配存储空间。

      2、C语言系统库rts2xx.lib。系统库包括了编译器所提供的所有功能:初始化C语言环境(入口地址为—_c_int0),设置堆栈,标准C的函数库等,工程中还可以添加其他的库文件(.lib)。

      3、有且必须有一个含有main()函数的C语言源程序文件(.c)。系统库初始化完毕后,将控制权交给main()函数。

      4、矢量跳转文件,通常为汇编文件(.asm)形式。此文件需要准确的定位在函数起始地址,其内容是汇编文件中的无条件跳转语句“B”。

      程序执行的常规流程为:矢量表的第一条指令可设置为“B _c_int0”,从而在上电复位后,把控制权交给系统库,系统库初始化完毕后,把控制权交给main()函数。

      注意:

      1、不用添加头文件(.h),编译时,根据设定的路径,头文件会自动扫描进工程。

      “hello,DSP world”整个工程流程:

       建立前必须保证CCS setup已经设置成功,并完成驱动设置,连接并打开了仿真器和目标板。(我是这样做的)

       1)打开CCS2.2,单击Project-New,对话框中输入工程名“hello”,初学建议工程文件保存在CC安装目录下的myprojects目录中。

       2)单击File-New-Source File,建立三个文本编辑窗口,分别编写cvextors.asm roam.cam和hello.c三个文件。

       3)单击Projext-Add Files to Projects,添加三个文件到工程中。

       4)添加库文件rts2xx.lib(位于目录C:\ti\c2400\cgtools\lib), 这四个文件构成了工程文件hello.pjt。

       5)单击Project-Build Options,选择Linker,在Output Filename[-o]中设置生成的二进制文件名字hello.out,确定。(里面还有一个compiler签页,内有Assembly,可以设置include路径,我调试时,仍按照内为空白)

       6)单击Project-Build,会在工程文件DEBUG子目录下生成hello.out文件。

       7)单击file-load program,将hello.out文件下载到LF2407目标板,下载程序前,LF2407必须设置成MP方式,将引脚mp//mc拉高。

       8)单击debug-run或者F5,程序在DSP中运行,窗口Stdout中显示“hello, DSP world”。

      恭喜成功!!

      附带程序代码:

      

      

       .ref _c_int0 ;.ref前需要加一个空格

       .sect “vectors” ;.sect前需要加一个空格

      rset: B _c_int0

      int1: B int1

      int2: B int2

      int3: B int3

      int4: B int4

      int5: B int5

      int6: B int6

      

       -stack 512

       -m hello.map

      

      MEMORY

      {

      PAGE 0:

       VECS :origin=0x0000,length=0x0040

       flash : origin=0x1044,length=0x6f00

       SARAM_P : origin=0x8000,length=0x0800

      

      PAGE 1:

       B0B1 : origin=0x0200,length=0x0200

      

       B2 : origin=0x0060,length=0x0020

      

       SARAM_D : origin=0x0800,length=0x0800

      

       RAM : origin=0xa000,length=0x7ff0

      }

      

      SECTIONS

      {

       vectors : load=VECS PAGE 0

       .text : load=flash PAGE 0

       .cinit : load=flash PAGE 0

       .switch : load=flash PAGE 0

       .const : load=RAM PAGE 1

       .bss : load=RAM PAGE 1

       .stack : load=B0B1 PAGE 1

      

      

      

      

      #define WDCR (*((volatile unsigned int*)0x7029))

      #define WDKEY (*((volatile unsigned int*)0x7025))

      

      #include

      

      void main(void)

      {

      WDCR=0x0068;

      WDKEY=0x0055;

      WDKEY=0x00aa;

      printf(“hello,DSP world\n”);

      for(;;);

      }

      

    1.cmd文件写法可以参照CC‘C2000帮助文件中的例子,还可以查阅TI文档spru024D的2.8.3.

    2.中断向量表的第一条语句应该跳转到_c_int0对于这点我最初不是很明白,因为我看到的程序都是以main开始的.后来逐渐明白了,_c_int0是程序真正开始的地方,只是这个开始不是开发者写出来的,而是编译器自动为我们做好的,你要配合它做的是就是在Build Option中对linker的C Initialization的选项选择ROM Autoinitialization Model或RAM Autoinitialization Model,而不是汇编中的No Autoinitialization,开发者的程序要以main函数开始,初始化结束后会跳转到main函数.在反汇编代码中可以看到这些过程.两种初始化的方式详见上面文档的同一节.

     

     

    DSP CMD 文件写法

     

    一、在给出命令文件示例前,首先介绍该文件常用到的几种伪指令。

    .cinit     程序编译连接时该标号表示部分存放已明确初始化的全局变量和静态变量;

    .const        程序编译连接时该标号表示部分存放已明确初始化的字符串常量、全局变量和静态变量;

    .switch        程序编译连接时该标号表示部分存放对于大型的switch语句的跳转表;

    .text            程序编译连接时该标号表示部分存放可执行代码和浮点数常量;

    .bss            该标号表示部分用于存放没有初始化的全局变量和静态变量;

    .stack          用该标号定义软件堆栈。

             命令文件名后缀为.CMD的文件实现对程序存储器空间和数据存储器空间的分配。该文件经常用到的伪指令有MEMORY伪指令和SECTIONS伪指令。

               当然用户也可以用C语言编程实现所需的功能。

                 MEMORY伪指令用来表示实际存在的目标系统中可被使用的存储器范围,每个存储器范围都有名字、起始地址和长度。MEMORY伪指令的一般语法为:

    MEMORY{

                     PAGE0:   name[(attr)]:       origin=constant,   length=constant;

                     PAGE1:   name[(attr)]:       origin=constant,   length=constant;

    }

    PAGE       标示存储器空间.用户可以规定多达255页,通常PAGE0规定程序存储器,PAGE1规定数据存储器.

    name         命名存储器范围.存储器可以是1~8个字符,在不同页上的存储器范围可以具有相同的名字,但在一页之内所有的存储器范围必须具有唯一的名字且必须不重叠.

    attr           规定与已命名范围有关的1~4个属性.未规定属性的存储器具有所有4个属性.有效的4个属性包括:

       R  规定存储器只读;

       W  规定存储器只写;

       X  规定存储器可以包含可执行代码;

       I  规定存储器可以被初始化.

    origin    规定存储器范围的起始地址.

    length   规定存储器范围的长度.

       SECTIONS 伪指令的作用是:描述输入段怎样被组合到输出段内;在可执行程序内定义输出段;规定在存储器内何处存放置输出段;允许重命名输出段.SECTIONS伪指令的一般语法是:

       SECTIONS{

             name:[property, property, property, …]   

             name:[property, property, property, …] 

             name:[property, property, property, …]  

       }

      每一个以name(名字)开始的段说明定义了一个输出段.在段名之后是特性列表,定义段的内容以及它们是怎样被分配的.特性可以用逗号来分开,段可能具有的特性是:

      装载位置,它规定段装载在存储器内何处;

      运行位置,它定义段在存储器内何处运行;

      输入段, 它定义组成输出段的输入段;

      段类型, 它定义特定段类型的标志;

      填充段, 它定义用于填充未初始化空间的数值.

    二、下面是一个简单实用的命令文件示例。

    -stack   40

                                    PVECS  :origin=40h,    length=70h      

                                         PROG  :origin=0b0h,    length=7F50h       

        PAGE1:MMRS :origin=0h,    length=05Fh     /*MMRS */

              B2   :origin=0060h,    length=020h       

              B0   :origin=0200h,    length=100h      

              B1   :origin=0300h,    length=100h       

              SARAM :origin=0800h,    length=0800h      

              EXT   :origin=8000h,    length=8000h    

    }

         .vectors   :{   } 〉 VECS    PAGE   0         

           .pvecs   :{   } 〉 PVECS    PAGE   0     

            .text   :{   } 〉 PROG   PAGE   0        

            .cinit :{   } 〉 PROG   PAGE   0   

            .bss :{   } 〉 SARAM   PAGE 1        

            .const :{   } 〉 SARAM   PAGE 1       

             .stack :{   } 〉B1        PAGE 1       

     

     

    CMD文件写法综述:

    初学DSP,对CCS有了一定的了解(当然还是很菜的),C 和asm源文件感觉还比较熟悉,cmd文件有的陌生,看了一些资料,现将主要内容总结如下,纰漏之处请大家指教。

     

    一句话,CMD主要是根据DSP(如TMS320C5402)存储器的地址范围来编的。

    CMD 是用来分配rom和ram空间用的,告诉链接程序怎样计算地址和分配空间.

    所以不同的芯片就有不同大小的rom和ram.放用户程序的地方也不尽相同.所以要根据芯片进行修改.分两部分.MEMORY和SECTIONS.

    MEMORY

    { PAGE 0 ……….

     

    PAGE 1………

    }

     

    SECTIONS

    {SECTIONS

    {

    .vectors ……………..

    .reset ……………..

    …………….

     

    }

    MEMORY是用来指定芯片的rom和ram的大小和划分出几个区间.

    PAGE 0 对应rom;

    PAGE 1对应ram;

    PAGE 里包含的区间名字与其后面的参数反映了该区间的起始地址和长度.

    SECTIONS:(在程序里添加下面的段名如.vectors.用来指定该段名以下,另一个段名以上的程序(属于PAGE0)或数据(属于PAGE1)放到“>”符号后的空间名字所在的地方。

     

     

    SECTIONS

    {

    .vectors : { } > VECS PAGE 0

    .reset : { } > VECS PAGE 0

    …………

    …………

    ……….

    }

     

    eg:

    MEMORY

    {

    PAGE 0: VECS: origin = 00000h, length = 00040h

    LOW: origin = 00040h, length = 03FC0h

    SARAM: origin = 04000h, length = 00800h

    B0: origin = 0FF00h, length = 00100h

     

    PAGE 1: B0: origin = 00200h, length = 00100h

    B1: origin = 00300h, length = 00100h

    B2: origin = 00060h, length = 00020h

    SARAM: origin = 08000h, length = 00800h

    }

     

    SECTIONS

    {

    .text : { } > LOW PAGE 0

    .cinit : { } > LOW PAGE 0

    .switch : { } > LOW PAGE 0

     

    .const : { } > SARAM PAGE 1

    .data : { } > SARAM PAGE 1

    .bss : { } > SARAM PAGE 1

    .stack : { } > SARAM PAGE 1

    .sysmem : { } > SARAM PAGE 1

    }

    DSP的CMD文件写法综述

       

    2006-12-25 18:23:30

     

    DSP的存储器的地址范围,CMD是主要是根据那个来编的。

    CMD 它是用来分配rom和ram空间用的,告诉链接程序怎样计算地址和分配空间.

    所以不同的芯片就有不同大小的rom和ram.放用户程序的地方也不尽相同.所以要根据芯片进行修改.分两部分.MEMORY和SECTIONS.

    MEMORY

    { PAGE 0 ……….

    PAGE 1………

    }

    SECTIONS

    {SECTIONS

    {

    .vectors ……………..

    .reset ……………..

    …………….

    }

    MEMORY是用来指定芯片的rom和ram的大小和划分出几个区间.

    PAGE 0 对应romAGE 1对应ram

    PAGE 里包含的区间名字与其后面的参数反映了该区间的起始地址和长度.

    SECTIONS:(在程序里添加下面的段名如.vectors.用来指定该段名以下,

    另一个段名以上的程序(属于PAGE0)或数据(属于PAGE1)放到“>”符号后的空间名字所在的地方。

    SECTIONS

    {

    .vectors : { } > VECS PAGE 0

    .reset : { } > VECS PAGE 0

    …………

    …………

    ……….

    }

    eg:

    MEMORY

    {

    PAGE 0: VECS: origin = 00000h, length = 00040h

    LOW: origin = 00040h, length = 03FC0h

    SARAM: origin = 04000h, length = 00800h

    B0: origin = 0FF00h, length = 00100h

    PAGE 1: B0: origin = 00200h, length = 00100h

    B1: origin = 00300h, length = 00100h

    B2: origin = 00060h, length = 00020h

    SARAM: origin = 08000h, length = 00800h

    }

    SECTIONS

    {

    .text : { } > LOW PAGE 0

    .cinit : { } > LOW PAGE 0

    .switch : { } > LOW PAGE 0

    .const : { } > SARAM PAGE 1

    .data : { } > SARAM PAGE 1

    .bss : { } > SARAM PAGE 1

    .stack : { } > SARAM PAGE 1

    .sysmem : { } > SARAM PAGE 1

    }

     

     

    (2)TMS320F240链接时所需的中断矢量表文件

    TMS320F240的目标文件在链接时要用到中断矢量表。中断矢量表用汇编语言编写,和具体的DSP芯片有关。假设TMS320F240的中断矢量表对应的汇编程序为BOOT.ASM,汇编后的文件名为BOOT.OBJ。

    下面是一个典型的矢量表文件。(假设程序名为BOOT.ASM。)

    .port

    .globl_c_int0

    .globl_c_int1   

    .globl_c_int2  

    .globl_c_int3   

    .globl_c_int4

    .globl_c_int5

    .globl_c_int6

    .globl_c_int7

    .globl_c_int8

    ·sect“.vectors”

    RSVECT B  _c_int0   

    INT1  B  _c_int1

    INT2  B  _c_int2

    INT3 B  _c_int3

    INT4 B  _c_int4

    INT5 B  _c_int5

    INT6 B  _c_int6

    用汇编器汇编该程序,命令形式:DSPABOOT.ASM-V2XX生成BOOT.OBJ文件供链接器使用。这样,就可以按如下形式在C源程序中编写中断函数:

    voidc_inx()

    中断程序的C语句系列;

    注意事项:c_int0()是系统入口函数,用户不能编写

    展开全文
  • 介绍了一种基于DSP的激光打标控制器系统设计,系统以TMS320F2812DSP为处理器,用CPLD扩展I/O接口,通过USB接口传输数据,高速D/A转换器控制振镜实现激光打标。在D/A转换电路中,针对双极性电压基准输出要求,使用...
  • 由于变电站数据量和信息量大,实时性要求高,则将高性能DSP应用于变电站综合自动化设计方案中。其内部哈佛结构使数据空间和程序空间分离,独立总线和程序总线允许程序数据同时操作;具有独特逆寻址方式,...
  • 摘要:介绍了一种设计X射线测厚用高压电源新方法,将Buck电路引入高压电源用于前级直流电压调压,应用开关电源和移相全桥逆变技术,并且该系统以TMS320F2812为控制核心,使系统工作稳定。后级高压侧采用相控谐振和...
  • 因为项目中某一个芯片时钟和使能信号对同步有非常严格要求。故而采用PWM定时器来解决。 项目参数:F2812,主频100M,外设频率50M。 1. 定时器计数是从0开始计数。所以要计10个数,则周期寄存器应设为0x09,而...
  • DSP中断系统及其应用

    千次阅读 2012-08-15 08:47:35
    TMS320F2812学习笔记 中断系统及其应用   2812的中断是3级中断机制,分别是外设级,PIE级以及...此时,如果该中断相应的中断使能寄存器(IE)也置为1,外设就会向PIE控制器发出一个中断请求。如果外设级中断没有
  • 在超声换器电源电路中,为能使超声换器以一定振幅谐振,必须精确控制振荡电路频率及功放电路输出功率.设计了一种具有精确基准频率控制数控半桥PWM输出调整电路,利用DSP芯片TMS320F2812控制AD9833产生精确...
  • 该电路以TI公司的DSP2812为控制系统核心构架,采用ADI公司高精度D/A芯片AD669来设计驱动电源。后续系统调试实验证明,所有D/A转换通道在4 000 Hz刷新频率下,精度达到0.5 mV,使对轴系统正常工作在1°范围...
  • SPWM 技术目前已经在实际中得到非常普遍应 用,尤其在逆变电路中应用最为广泛,经过长期发展, 大致可分成电压SPWM、电流SPWM ...要求非常高,高性能的DSP(数字信号处理器) 无疑是满 足这一要求性价比最理想
  • SCI硬件设计

    2020-11-15 16:22:53
    SCI模块的接收器和发送器是双缓冲的,每一个都由它单独的使能和中断标志位。两者可以单独工作,或者在全双工方式下同时工作。SCI使用奇偶校验、超时、帧出错监测确保数据的准确传输。 采用上位机与DSP串口通信,...
  • 噪声控制为实时控制,需要较大计算量,普通单片机难以实现。20世纪80年代,数字信号处理(DSP)芯片问世为信号...TPS767D301为双输出低漏电压调整器,其特点如下:每个电源输出都有单独复位和输出使能控制
  • 定时器基本操作

    2020-11-12 23:29:20
    F2810/F2812器件上有3个Q9位CPU...一旦定时器被使能(TCR-Bit 4=0),定时器时钟经过预定标计数器(PSCH:PSC)递减计数,预定标计数器产生下溢后向定时器32位计数器(TIMH:TIM)借位p最后定时器计数器产生溢出使

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

dsp2812的使能