在线时间1 小时
UID61275
注册时间2008-7-25
NXP金币0
该用户从未签到
注册会员

- 积分
- 121
- 最后登录
- 1970-1-1
|

楼主 |
发表于 2008-7-25 10:23:47
|
显示全部楼层
RE:解读HC08 S08 C语言的头文件
1.对位操作的定义
以TSC寄存器的定义为例,在头文件中的定义如下:
/*** TSC - TIM Status and Control Register TSC; 0x00000020 ***/
typedef union {
byte Byte;
struct {
byte PS0 :1; /* Prescaler Select Bit 0 */
byte PS1 :1; /* Prescaler Select Bit 1 */
byte PS2 :1; /* Prescaler Select Bit 2 */
byte :1;
byte TRST :1; /* TIM Reset Bit */
byte TSTOP :1; /* TIM Stop Bit */
byte TOIE :1; /* TIM Overflow Interrupt Enable Bit */
byte TOF :1; /* TIM Overflow Flag Bit */
} Bits;
struct {
byte grpPS :3;
byte :1;
byte :1;
byte :1;
byte :1;
byte :1;
} MergedBits;
} TSCSTR;
上面的代码定义了一个名为”TSCSTR”的变量类型。
这个变量类型本身是一个”联合”(union),包括三个成员:byte类型的”Byte”,结构体”Bits”和结构体”MergedBits”。
结构体”Bits”中定义了寄存器中每一个bit的名字;结构体”MergedBits”中把bit0,bit1,bit2三个bit定义到一起称为”grpPS”,剩下的5个bit没用。
因为”Byte”,”Bits”和”MergedBits”定义在一个union里,所以共享同一个物理地址。
extern volatile TSCSTR _TSC @0x00000020;
这一行定义了一个变量,变量名为”_TSC”,变量类型为刚才定义的”TSCSTR”。
下面的#define使程序员对寄存器操作时可以使用与DataSheet上相同的名称,更方便直观。
#define TSC _TSC.Byte
#define TSC_PS0 _TSC.Bits.PS0
#define TSC_PS1 _TSC.Bits.PS1
#define TSC_PS2 _TSC.Bits.PS2
#define TSC_TRST _TSC.Bits.TRST
#define TSC_TSTOP _TSC.Bits.TSTOP
#define TSC_TOIE _TSC.Bits.TOIE
#define TSC_TOF _TSC.Bits.TOF
#define TSC_PS _TSC.MergedBits.grpPS
程序中可以对寄存器进行位操作。如:TSC_TOIC=1;。如果变量在直接寻址的地址范围,编译器会调用相应的位操作指令:BSET,BCLR,BRSET,BRCLR;如果变量不在直接寻址的地址范围会用布尔运算完成对应的功能
如果对某几位进行操作。编译器会将这条语句转化成相应的汇编,用布尔运算完成对应的功能。如:TSC_PS=0x03;。会令TSC寄存器中的PS2,PS1,PS0三位等于"0,1,1",而高五位保持原来的状态。 |
|