DSP

一、DSP与单片机的区别

F28335内核主要特点

   F28355  DSP集成了DSP和微控制器的长处,如DSP的主要特征、单周期乘法运算,F28355能够在一个周期内完成32*32位的乘法累加云算,或者两个16*16位乘法累加运算,而同样32位的普通单片机则需要4个周期以上才能完成。

    快速的中断响应

   可在任何内存位置进行单周期读、修改、写操作
   可采用C/C++编程软件,效率非常高

最小系统组成:电源电路;复位电路;晶振电路;下载电路。

冯·诺依曼结构是一种将程序指令存储器和数据存储器合并在一起的存储器结构;

哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。哈佛结构是一种并行体系结构,它的主要特点是将程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个独立的存储器,每个存储器独立编址、独立访问;

F2812数字信号处理器采用增强的哈佛总线结构,能够并行访问程序和数据存储空间。 内部集成了大量的SRAM、ROM以及Flash等存储器,并且采用统一寻址方式(程序、数 据和I/O统一寻址), 从而提高了存储空间的利用率,方便程序的开发。

https://www.cnblogs.com/scncart/articles/1805553.html

 https://www.cnblogs.com/lidabo/p/4569988.html

 DSP_第1张图片

 

 

 

一个完整的基础工程有哪些文件所构成呢?

① 首先需要仿真调试或者flash烧写所需的.cmd文件和DSP的BIOS或 nonBIOS . cmd文件。
② 其次需要我们使用的芯片的.ccxml目标配置文件。
③ 芯片内核及外设.c源文件,比如DSP2833x_Gpio. c、DSP2833X PieCtrl.c.
④ 芯片内核及外设.h头文件,比如DSP2833x_Gpio. h、 DSP2833x_PieCtrl.h 等。
(5)DSP .lib库文件,常用的如IQmath. lib等。

 

二、DSP编程

1、在C语言中,“#pragma DATA_SECTION”的编程方式如下:

#pragma DATA_SECTION(symbol,"section name")
其中,symbol是变量名,而section name是数据段名。下面以变量SciaRegs和ScibRegs
为例,将这两个变量分配到名字为SciaRegsFile和ScibRegsFile的数据段。
//----------------------------------------
#ifdef __cplusplus
#pragma DATA_SECTION("SciaRegsFile")
#else
#pragma DATA_SECTION(SciaRegs,"SciaRegsFile");
#endif
volatile struct SCI_REGS SciaRegs;

//----------------------------------------
#ifdef __cplusplus
#pragma DATA_SECTION("ScibRegsFile")
#else
#pragma DATA_SECTION(ScibRegs,"ScibRegsFile");
#endif
volatile struct SCI_REGS ScibRegs;
上述代码为f28004x_globalvariabledefs.c文件中的一段,其作用就是将SciaRegs和
ScibRegs分配到名字为SciaRegsFile和ScibRegsFile的数据段。CMD文件会将每个数据
段直接映射到相应的存储空间里              

2、位定义

struct SCI_REGS {
    union   SCICCR_REG                       SCICCR;   
   //Communications control register
    union   SCICTL1_REG                      SCICTL1;                 
     // Control register 1
    union   SCIHBAUD_REG                     SCIHBAUD;                
     // Baud rate (high) register
    union   SCILBAUD_REG                     SCILBAUD;                 
    // Baud rate (low) register
    union   SCICTL2_REG                      SCICTL2;                
      // Control register 2
    union   SCIRXST_REG                      SCIRXST;               
       // Receive status register
    union   SCIRXEMU_REG                     SCIRXEMU;             
        // Receive emulation buffer register
    union   SCIRXBUF_REG                     SCIRXBUF;               
      // Receive data buffer
    Uint16                                   rsvd1;                        // Reserved
    union   SCITXBUF_REG                     SCITXBUF;                    // Transmit data buffer
    union   SCIFFTX_REG                      SCIFFTX;                      // FIFO transmit register
    union   SCIFFRX_REG                      SCIFFRX;                      // FIFO Receive register
    union   SCIFFCT_REG                      SCIFFCT;                      // FIFO control register
    Uint16                                   rsvd2[2];                     // Reserved
    union   SCIPRI_REG                       SCIPRI;                       // SCI Priority control
};

//---------------------------------------------------------------------------
// SCI External References & Function Declarations:
//
extern volatile struct SCI_REGS SciaRegs;
extern volatile struct SCI_REGS ScibRegs;

定义union形式的成员即可以实现对寄存器的整体操作,也可以实现对寄存器进行位操作,而定义为Uint16的成员只能直接对寄存器进行操作。

留的寄存器空间采用变量来代替,但是该变量不会被调用,如rsvd1、rsvd2、rsvd3.

关键字volatile的意思是"易变的",使得寄存器的值能够被外部代码任意改变,例如 可以被外部硬件或者中断任意改变,如果不使用关键字volatile,则寄存器的值只能被 程序代码所改变。

4)声明
(1)寄存器变置对所有char、short, int和指针类型有效;
(2)结构成员不能打包成字(位域除外).每个成员以16位字的边界对齐;
(3)整数类型的位域带有符号,位域打包成字时从高位开始, 不越过字的边界对齐;
(4)intetrupt关键字仅可用于没有参量的void函数。
5)预处理
预处理忽略任何不支持的#program伪指令#支持的有:
(1) CODE_SECTION; (2) DATA_SECTION; (3) FUNC_EXT_CALLED.

 

3、存储器映像

DSP_第2张图片

存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射。

比方说我们找到0x007010这个单元地址,那么可以通过查阅芯片数据手册了解到此单元是系统控制寄存器功能。因此为了更好区分此单元的功能和方便后续的程序开发,可以给这个单元取一个别名SysCtrlRegs,那么这个SysCtrlRegs就是寄存器,并且这个寄存器 孤址就是0x007010o这个过程就是寄存器映射。

MEMORY
{
 PAGE 0:    /* Program Memory */

 PAGE 1:    /* Data Memory */
 .
 .
 .
 SCIA         : origin = 0x007200, length = 0x000010     /* SCI-A registers */
 SCIB         : origin = 0x007210, length = 0x000010     /* SCI-B registers */
.
.
.
}
SECTIONS
{
 .
 .
 .
   SciaRegsFile             : > SCIA,           PAGE = 1
   ScibRegsFile             : > SCIB,           PAGE = 1
 .
 .
 .
}

首先在MEMORY部分,SCI_A寄存器的物理地址从0x007200开始,长度为16,SCI_A寄存器的物理 地址从0x007210开始,长度为16。然后在SECTIONS部分,数据段SciaRegsFile被映射到 了SCI_A,而ScibRegsFile被映射到了SCI_B,实现了数据段映射到相应的存储器空间。

通过以上两部分的操作,才完成了将外设奇存器的文件映射到寄存器的物理地址空间上, 这样才可以通过C语言来实现对F2812寄存器的搡作。

F2812各个存储器模块的特点:

    整个存储器分成多段。

    代码安全保护。 低功耗模式。

    可根据CPU频率调整等待周期。

    FLASH流水线模式能够提高线性代码的执行效率。

16进制0x000400=4*16^2=2^10=1k

F2812存储器映像(Memory Map 地图) (1)RAM(18K*16位)程序/数据 (2)OTP (one time programmable ROM) 程序/数据 (3)Boot ROM 引导ROM Bootloader

4、CMD文件(Linker Command Files )
COFF格式和段的概念(COFF=Common Object File Format) 库 .lib 目标文件 .obj 可执行文件.out
(1)通过伪指令来定义段 (2)给段分配存储空间

C语言生成的段 :已初始化 程序存储空间; 未初始化 数据存储空间。

用伪指令定义段

#pragma CODE_SECTION(symbol,"section name") /*代码 symbol:函数/全局变量*/

#pragma DATA_SECTION(symbol,"section name") /*数据*/
例:将全局数组变量S[100]单独编译成一个新的段,取名为"newsect"
    #pragma DATA_SECTION(S,"newsect");
    unsigned int S[100];
    void main()
    {
        ...
    }
第1步 用MEMORY伪指令来指示存储空间(分页制存储   R.W.X.I)     
MEMORY
{ 
  PAGE 0:    /* Program Memory 用来存改程序*/
  PAGE 1:    /* Data Memory  数据 */
  SCIA         : origin = 0x007200, length = 0x000010     /* SCI-A registers */
  SCIB         : origin = 0x007210, length = 0x000010     /* SCI-B registers */
}
第2步 通过SECTIONS伪指令来分配到存储空间
SECTIONS
{
   SciaRegsFile             : > SCIA,           PAGE = 1
   ScibRegsFile             : > SCIB,           PAGE = 1
}
ScibRegsFile;:段名  >:load SCIA:allocation(地址)  

 DSP_第3张图片

 

 DSP_第4张图片

 

 DSP_第5张图片

 

你可能感兴趣的:(DSP)