查看: 11874|回复: 19

解读HC08 S08 C语言的头文件

[复制链接]

该用户从未签到

8

主题

39

帖子

0

注册会员

Rank: 2

积分
121
最后登录
1970-1-1
发表于 2008-7-25 10:09:00 | 显示全部楼层 |阅读模式
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 TSC                             _TSC.Byte 这一行和下面的#define使程序员对寄存器操作时可以使用与DataSheet上相同的名称,更方便也更直观。
当我们在程序中对”TSC”操作时相当于操作一个byte类型的变量。例如:TSC=0xEF;#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程序中可以进行位操作。如:TSC_TOIC=1;。如果变量在直接寻址的地址范围,编译器会自动优化代码,调用相应的位操作汇编指令:BSET,BCLR,BRSET,BRCLR#define TSC_PS                          _TSC.MergedBits.grpPS 如果对某几位进行操作。编译器会将这条语句转化成相应的汇编,用布尔运算完成对应的功能。如:TSC_PS=0x03;。会令TSC寄存器中的PS2,PS1,PS0三位等于"0,1,1",而高五位保持原来的状态。
回复

使用道具 举报

该用户从未签到

8

主题

39

帖子

0

注册会员

Rank: 2

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

该用户从未签到

8

主题

39

帖子

0

注册会员

Rank: 2

积分
121
最后登录
1970-1-1
 楼主| 发表于 2008-7-25 10:27:32 | 显示全部楼层

RE:解读HC08 S08 C语言的头文件

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以提高代码效率。

该用户从未签到

8

主题

39

帖子

0

注册会员

Rank: 2

积分
121
最后登录
1970-1-1
 楼主| 发表于 2008-7-25 10:34:06 | 显示全部楼层

RE:解读HC08 S08 C语言的头文件

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

该用户从未签到

0

主题

4

帖子

0

新手上路

Rank: 1

积分
24
最后登录
1970-1-1
发表于 2008-7-30 13:15:56 | 显示全部楼层

RE:解读HC08 S08 C语言的头文件

how about startup.c & cmd file ?

该用户从未签到

2

主题

27

帖子

0

新手上路

Rank: 1

积分
65
最后登录
1970-1-1
发表于 2008-7-30 18:29:57 | 显示全部楼层

RE:解读HC08 S08 C语言的头文件

好东东~~

该用户从未签到

8

主题

39

帖子

0

注册会员

Rank: 2

积分
121
最后登录
1970-1-1
 楼主| 发表于 2008-7-31 13:53:53 | 显示全部楼层

回复:解读HC08 S08 C语言的头文件

原帖由bufj于2008-07-30 13:15发表:
how about startup.c & cmd file ?
 
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。

该用户从未签到

40

主题

256

帖子

0

金牌会员

Rank: 6Rank: 6

积分
10386
最后登录
2023-4-17
发表于 2008-8-1 15:13:16 | 显示全部楼层

RE:解读HC08 S08 C语言的头文件

支持发表文章.................

该用户从未签到

0

主题

11

帖子

0

新手上路

Rank: 1

积分
16
最后登录
1970-1-1
发表于 2008-9-30 16:06:29 | 显示全部楼层

RE:解读HC08 S08 C语言的头文件

谢谢。有用

该用户从未签到

0

主题

16

帖子

0

注册会员

Rank: 2

积分
80
最后登录
2021-10-31
发表于 2009-8-13 11:15:41 | 显示全部楼层

RE:解读HC08 S08 C语言的头文件

谢谢,非常有用,我下了
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-8-3 00:59 , Processed in 0.101297 second(s), 28 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表