1.存储器映射
存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射。
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
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输出低电平信号