解读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",而高五位保持原来的状态。

2.双字节变量
/*** TCNT - TIM Counter Register; 0x00000021 ***/
typedef union {
word Word;
/* Overlapped registers: */
struct {
/*** TCNTH - TIM Counter Register High; 0x00000021 ***/
union {
byte Byte;
} TCNTHSTR;
#define TCNTH _TCNT.Overlap_STR.TCNTHSTR.Byte

/*** TCNTL - TIM Counter Register Low; 0x00000022 ***/
union {
byte Byte;
} TCNTLSTR;
#define TCNTL _TCNT.Overlap_STR.TCNTLSTR.Byte


} Overlap_STR;

} TCNTSTR;
上面的代码定义了一个名为”TCNTSTR”的变量类型。
这个变量类型本身是一个”联合”(union),包括两个成员:word类型的”Word”和结构体”Overlap_STR”。
结构体”Overlap_STR”又包含两个union:”TCNTHSTR”和”TCNTLSTR”。每一个union中只定义了一个byte类型的成员”Byte”。

extern volatile TCNTSTR _TCNT @0x00000021;
这一行定义了一个变量,变量名为”_TCNT”,变量类型为刚才定义的”TCNTSTR”。

#define TCNT _TCNT.Word
我们在编程时既可以调用单独的寄存器:TCNTH=0x12; TCNTL=0x34;
也可以把两个寄存器一起当做一个16bit的变量调用:TCNT=0x1234;。编译器会使用LDHX,STHX以提高代码效率。

3.Trim值

/*** Optional - Internal Oscillator Trim; 0x0000FFC0 ***/
typedef union {
byte Byte;
struct {
byte TRIM0 :1; /* ICG Trim Factor Bit 0 */
byte TRIM1 :1; /* ICG Trim Factor Bit 1 */
byte TRIM2 :1; /* ICG Trim Factor Bit 2 */
byte TRIM3 :1; /* ICG Trim Factor Bit 3 */
byte TRIM4 :1; /* ICG Trim Factor Bit 4 */
byte TRIM5 :1; /* ICG Trim Factor Bit 5 */
byte TRIM6 :1; /* ICG Trim Factor Bit 6 */
byte TRIM7 :1; /* ICG Trim Factor Bit 7 */
} Bits;
} OptionalSTR;
上面的代码定义了一个名为”OptionalSTR”的变量类型。
/* Tip for register initialization in the user code: const byte Optional_INIT @0x0000FFC0 = ; */
#define _Optional (*(const OptionalSTR * __far)0x0000FFC0)
这一行定义了一个名叫”_Optional”的宏。宏的内容是:”(*(const OptionalSTR * __far)0x0000FFC0)”。
里面一层括号”(const OptionalSTR * __far)”是在进行强制类转换,要转换成指向”const OptionanlSTR”类型的指针,因为本身在direct地址范围(0x0000~0x00FF)之外,所以加上”__far”。关于__far的说明请参考Codewarrior的C compiler手册。
去掉强制类型转换就容易看明白了,”(* 0x0000FFC0)”实际上就是在调用地址0x0000FFC0中的数据。
#define Optional _Optional.Byte

4、startup.c

startup.c是在单片机Reset后,开始执行main函数前,做的一些初始化工作。根据建立项目时选择的选项的不同,初始化的内容会有所不同。

主要包括:

1。 初始化堆栈。

2。 为定义在RAM中的数组和变量赋初值。

3。 如果选择按ANSI C标准。将会给没定义初值的数组赋值为零。

4。 跳转到main函数。

.cmd文件是一些BDM命令的集合。应该是在进入debug环境的过程中可以自动调用.cmd文件,执行其中的命令。

把下面几行写到一个文本文件里,存成.cmd扩展名。

wb $1824 $ff //FPROT disable all flash protection
wb $1825 $ff //FSTAT clear all error flags
wb $1820 $13 //$13 for 4Mbus; $31 for 10MbusFCDIV set Fclk to 150-200khz

wait 5
wb $f000 $AA //set flash address/data
wb $1826 $20 //FCMD prog byte
wb $1825 $80 //FSTAT set bit FCBEF to execute
wait 2

在debugger的Command窗口中输入"call" 回车。选择包含以上内容的.cmd文件。文件中的命令就会逐行被执行。上面的命令把Flash的F000地址写成AA。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值