1.C28x编译器基本数据类型
C28x DSP的基本数据类型见表4-8。
表4-8 C28x DSPC语言的数据类型
由于C28x DSP中数据最小长度为16位,因此所有的字符(char)型数据,包括有符号字符(signed char)和无符号字符(unsigned char),长度均为16位,即用一个字的长度表示。
数据类型的其他特点如下:
1)所有的整型(char、short、int以及对应的无符号类型)都是等效的,用16位二进制表示。
2)长整型和无符号长整型用32位二进制表示。
3)有符号数用补码表示。
4)字符(char)型是有符号数,等效于int。
5)枚举(enum)类型代表16位数值,等效于int。
6)所有的浮点类型(float、double及long double)等效,表示为IEEE单精度格式。
除了基本数据类型外,还具有数组、结构、联合等构造类型数据。
2.结构
结构(Structure,也称结构体)是一种构造类型数据。片内外设寄存器通常通过结构与联合变量的方法进行访问。
例如,281x DSP的通用输入输出GPIO A 口的MUX复用控制寄存器可用如下位段结构(Bit field structure)表示
struct GPAMUX_BITS {
unsigned int PWM1_GPIOA0:1; //第0位
unsigned int PWM2_GPIOA1:1; //1
unsigned int PWM3_GPIOA2:1; //2
unsigned int PWM4_GPIOA3:1; //3
unsigned int PWM5_GPIOA4:1; //4
unsigned int PWM6_GPIOA5:1; //5
unsigned intT1PWM_GPIOA6:1; //6
unsigned intT2PWM_GPIOA7:1; //7
unsigned intCAP1Q1_GPIOA8:1; //8
unsigned intCAP2Q2_GPIOA9:1; //9
unsigned inCAP3QI1_GPIOA10:1; //10
unsigned intTDIRA_GPIOA11:1; //11
unsigned intTCLKINA_GPIOA12:1; //12
unsigned int C1TRIP_GPIOA13:1; //13
unsigned int C2TRIP_GPIOA14:1; //14
unsigned int C3TRIP_GPIOA15:1; //第15位
};
其中的struct为关键字。GPAMUX_BITS为自定义类型名。大括号内定义结构内的各个成员。例如“unsigned int PWM1_GPIOA0:1;”,表示PWM1_GPIOA0为无符号整型变量。该变量占用一个2进制位,取值0或1。冒号表示成员不满一个字,其后的数值表示占用的2进制位数,这样的成员称为位段(Bit field),这样的结构称为位段结构。用此方法访问片内寄存器的位非常方便。
当一个结构中有效位段的长度不足16位时,可以加入保留位段,以保证数据的完整性。
例如,281x DSP的GPIO D 口的MUX复用控制寄存器结构
struct GPDMUX_BITS {(www.daowen.com)
unsigned int T1CTRIP_PDPA_GPIOD0:1; //0
unsigned int T2CTRIP_PDPA_GPIOD1:1; //1
unsigned int rsvd1:3; //位4~2,保留位
unsigned int T3CTRIP_PDPA_GPIOD5:1 ;//5
unsigned int T4CTRIP_PDPA_GPIOD6:1; //6
unsigned int rsvd2:9; //位15~7,保留位
};
同基本变量一样,结构变量需要先声明后使用,成员变量可以采用成员运算符即点运算符(.)进行引用,例如
struct GPDMUX_BITS bit; //声明一个GPDMUX_BITS结构类型的变量bit
bit.T1CTRIP_PDPA_GPIOD0=1//将GPIOD口的位0定义为PDPA功能
3.联合
联合(Union,也称为联合体)类型可以将不同类型的数据存放在同一个地方,且占据同样大小的存储空间。例如,定义联合类型GPDMUX_REG
union GPDMUX_REG{
unsigned int all; //声明成员变量all为无符号整型变量
struct GPDMUX_BITS bit; //声明成员变量bit为结构型变量
};
联合变量的声明与成员变量的引用与结构变量类似,例如
union GPDMUX_REG GPDMUX; //声明联合类型变量GPDMUX
GPDMUX.all=1; //寄存器GPDMUX赋值为1,
//将GPIOD位0引脚定义为PDPA功能,其他为数字I/O
联合可以出现在结构和数组中,结构和数组也可以出现在联合中。例如,结构类型GPIO_MUX_REGS中包含联合类型成员变量
struct GPIO_MUX_REGS{
union GPAMUX_REG GPAMUX;
union GPDMUX_REG GPDMUX;
};
定义了一个结构类型GPIO_MUX_REGS,其成员为联合类型变量GPAMUX、GPDMUX。
这种结构变量的声明与普通结构变量一样,例如
structGPIO_MUX_REGS GpioMuxRegs;
//表示GpioMuxRegs是结构GPIO_MUX_REGS的一个变量
声明了结构变量后,可以采用分级点运算符的方法引用各成员变量,例如
GpioMuxRegs.GPAMUX.all=0x077F; //CAP1-3,PWM1-6,T1pwm
GpioMuxRegs.GPDMUX.bit.T1CTRIP_PDPA__GPIOD0=1; //PDPA
GpioMuxRegs.GPDMUX.bit.T2CTRIP_SOCA__GPIOD1=0; //GPIOD1
GpioMuxRegs.GPDMUX.bit.T3CTRIP_PDPB__GPIOD5=0; //GPIOD5
GpioMuxRegs.GPDMUX.bit.T4CTRIP_SOCB__GPIOD6=0; //GPIOD6
定义281x DSP的GPIOA口时,采用了一条C语句,这样的程序简单。而定义GPIOD口时,采用了4条C语句,这样编程可以清晰地看到GPIOD口各位的定义。编程风格可以由编程者自己决定。
实际编程时,片内寄存器及其各位通常已经有人进行了定义,做成了头文件(.h文件),一般放在项目中包含的include路径下,用编译预处理命令#include包含该头文件,用户可以直接使用。例如,头文件DSP2803x_Gpio.h定义了2803x DSP的GPIO口的寄存器。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。