DSP存储器与寄存器管理

1.存储器映射

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

DSP存储器与寄存器管理

1.1 F28335存储空间的分配

      F28335片上有256K×16位的FLASH,34K×16位的SARAM,8K×16位的BOOT ROM,2K×16位的OPT ROM,采用统一寻址方式(程序、数据和I/O统一寻址),从而提高了存储空间的利用率,方便程序的开发。除此之外,F28335还提供了外部并行扩展接口XINTF,可进一步外扩存储空间。

 1.2 F28335存储器特点

    F28335是采用多级流水线的增强的哈佛总线结构,能够并行访问程序和数据存储空间。在F28335芯片内部集成了大量的不同的存储介质,F28335片上有256K×16位的FLASH,34K×16位的SARAM,8K×16位的BOOT ROM,2K×16位的OPT ROM,采用统一寻址方式(程序、数据和I/O统一寻址),从而提高了存储空间的利用率,方便程序的开发。除此之外,F28335还提供了外部并行扩展接口XINTF,可进一步外扩存储空间。

(1)片上SARAM

(2)BOOT ROM

(3)片上FLASH和OTP

DSP存储器与寄存器管理

 1.3 代码安全模块CSM

    通过一个128位的密码(相当于8个16位的字)来对安全区来进行加密或解密。这段密码保存在FLASH的最后8个字中(0X33FFF8-OX33FFFF),也就是密码区中(PWL) ,通过密码匹配( PMF ) , 可以解锁器件。

1.4 外部存储器接口XINTF

2.寄存器和寄存器映射的定义

    通过#pragma预处理命令和DATA_SECTION将定义的寄存器指定到相应的存储单元内,然后即可通过C语言来操作这些寄存器。     

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

3.访问F28335寄存器内容

    根据#pragma和DATA_SECTION(这些是CCS软件内特定的)的特点,可以使用#pragma和DATA_SECTION将定义的寄存器与实际的存储单元对应起来,然后再使用C语言操作定义的寄存器,比如使用结构体等。假如我们要让F28335的GPIOC的第68管脚输出低电平,我们怎么使用 C 语言来处理?

(1)首先要知道GPIO外设每类寄存器所对应存储单元的首地址是哪个,比如GPIO控制寄存器,通过查询数据手册可知其首地址是0x006F80;

(2)然后使用#pragma和DATA_SECTION将定义的寄存器与实际的存储单元对应起来。

#pragma DATA_SECTION(GpioCtrlRegs,"GpioCtrlRegsFile"); /*该定义可在DSP2833x_GlobalVariableDefs.c文件中查找到*/
volatile struct GPIO_CTRL_REGS GpioCtrlRegs;

GpioCtrlRegsFile是SECTIONS内定义的,该定义可在DSP2833x_Headers_nonBIOS.cmd文件中查找到。 

//GPIO数据寄存器GPIO_DATA_REGS:
struct GPIO_DATA_REGS 
{
   union  GPADAT_REG       GPADAT;       // GPIO Data Register (GPIO0 to 31)
   union  GPADAT_REG       GPASET;       // GPIO Data Set Register (GPIO0 to 31)
   union  GPADAT_REG       GPACLEAR;     // GPIO Data Clear Register (GPIO0 to 31)
   union  GPADAT_REG       GPATOGGLE;    // GPIO Data Toggle Register (GPIO0 to 31) 
   union  GPBDAT_REG       GPBDAT;       // GPIO Data Register (GPIO32 to 63)
   union  GPBDAT_REG       GPBSET;       // GPIO Data Set Register (GPIO32 to 63)
   union  GPBDAT_REG       GPBCLEAR;     // GPIO Data Clear Register (GPIO32 to 63)
   union  GPBDAT_REG       GPBTOGGLE;    // GPIO Data Toggle Register (GPIO32 to 63)
   union  GPCDAT_REG       GPCDAT;       // GPIO Data Register (GPIO64 to 95)
   union  GPCDAT_REG       GPCSET;       // GPIO Data Set Register (GPIO64 to 95)
   union  GPCDAT_REG       GPCCLEAR;     // GPIO Data Clear Register (GPIO64 to 95)
   union  GPCDAT_REG       GPCTOGGLE;    // GPIO Data Toggle Register (GPIO64 to 95)
   Uint16                  rsvd1[8];
};

union GPACTRL_REG 
{
   Uint32              all;
   struct GPACTRL_BITS bit;
};

// GPIO A control register bit definitions */                                    
struct GPACTRL_BITS 
{  // bits   description
   Uint16 QUALPRD0:8;        // 7:0    Qual period 
   Uint16 QUALPRD1:8;        // 15:8   Qual period 
   Uint16 QUALPRD2:8;        // 23:16  Qual period 
   Uint16 QUALPRD3:8;        // 31:24  Qual period  
};

(3)最后要让GPIO68输出一个低电平可使用C语言调用结构体内成员,如下:

GpioDataRegs.GPCCLEAR.bit.GPIO68=1;//设置GPIO输出低电平信号

上一篇:近期复习的收获(完全不知道的)


下一篇:[考试总结]noip模拟39