首 页
FTF博客群
热点活动
精彩视频
文 章
博 客
下 载
论 坛
提问墙
网站搜索:
个人中心
飞思卡尔社区论坛
  • MQX
  • 8位MCU
  • 16位MCU
  • 32位MCU
  • 飞思卡尔传感器
  • 2009年第四届智
    • 资料共享
  • 2008年第三届智
    • 资源共享
  • 2010年第五届智
  • 安飞东专栏
首页»飞思卡尔社区论坛 >> 8位MCU >> 论坛规则 | 收藏本版
12 1/1 共1页 1
  • 发布新帖
  • 发布投票
  •        
 
[原创] 解读HC08 S08 C语言的头文件
AlbertWang
精华:
1
积分:
67
等级:
学徒
登陆次数:
44 
发表帖子:
33  
注册时间:
2008-07-25 
最后登陆:
2009-06-19 
状态:
离线

查看详细资料

积分:67
帖子:33
精华:1
等级:学徒
注册时间:2008-07-25
最后登录:2009-06-19
我的博客 发短消息
我的相册 当前离线
发表于2008-07-25 10:09 1#
解读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 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",而高五位保持原来的状态。

 
相关主题
  • Freescale 单片机C语言编程概述
  • 北航新书: freescale 08系列单片机开发与应用实例
  • 飞思卡尔 ( FREESCALCE)单片机mc908系列mc68hc系列
  • Freescale专用烧录器成功实现了对汽车电子类MCU-Freescale S12(X)家族MCU的ISP烧写
  • 飞思卡尔单片机MC68系列MC9S08系列
  • freescale 08系列单片机开发与应用实例 新书出版
  • HC08/S08单片机学习心得
  • 图书推荐 《嵌入式技术基础与实践》
...
回复 链接 收藏
 
AlbertWang
精华:
1
积分:
67
等级:
学徒
登陆次数:
44 
发表帖子:
33  
注册时间:
2008-07-25 
最后登陆:
2009-06-19 
状态:
离线

查看详细资料

积分:67
帖子:33
精华:1
等级:学徒
注册时间:2008-07-25
最后登录:2009-06-19
我的博客 发短消息
我的相册 当前离线
发表于2008-07-25 10:23 2#
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",而高五位保持原来的状态。
 
...
回复 链接 收藏
 
AlbertWang
精华:
1
积分:
67
等级:
学徒
登陆次数:
44 
发表帖子:
33  
注册时间:
2008-07-25 
最后登陆:
2009-06-19 
状态:
离线

查看详细资料

积分:67
帖子:33
精华:1
等级:学徒
注册时间:2008-07-25
最后登录:2009-06-19
我的博客 发短消息
我的相册 当前离线
发表于2008-07-25 10:27 3#
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以提高代码效率。
 
...
回复 链接 收藏
 
AlbertWang
精华:
1
积分:
67
等级:
学徒
登陆次数:
44 
发表帖子:
33  
注册时间:
2008-07-25 
最后登陆:
2009-06-19 
状态:
离线

查看详细资料

积分:67
帖子:33
精华:1
等级:学徒
注册时间:2008-07-25
最后登录:2009-06-19
我的博客 发短消息
我的相册 当前离线
发表于2008-07-25 10:34 4#
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
 
...
回复 链接 收藏
 
bufj
精华:
0
积分:
23
等级:
学徒
登陆次数:
4 
发表帖子:
3  
注册时间:
2008-07-30 
最后登陆:
2009-10-12 
状态:
离线

查看详细资料

积分:23
帖子:3
精华:0
等级:学徒
注册时间:2008-07-30
最后登录:2009-10-12
我的博客 发短消息
我的相册 当前离线
发表于2008-07-30 13:15 5#
RE:解读HC08 S08 C语言的头文件
how about startup.c & cmd file ?
 
...
回复 链接 收藏
 
demon
精华:
0
积分:
65
等级:
学徒
登陆次数:
59 
发表帖子:
20  
注册时间:
2007-09-20 
最后登陆:
2009-02-06 
状态:
离线

查看详细资料

积分:65
帖子:20
精华:0
等级:学徒
注册时间:2007-09-20
最后登录:2009-02-06
我的博客 发短消息
我的相册 当前离线
发表于2008-07-30 18:29 6#
RE:解读HC08 S08 C语言的头文件
好东东~~
 
...
回复 链接 收藏
 
AlbertWang
精华:
1
积分:
67
等级:
学徒
登陆次数:
44 
发表帖子:
33  
注册时间:
2008-07-25 
最后登陆:
2009-06-19 
状态:
离线

查看详细资料

积分:67
帖子:33
精华:1
等级:学徒
注册时间:2008-07-25
最后登录:2009-06-19
我的博客 发短消息
我的相册 当前离线
发表于2008-07-31 13:53 7#
回复:解读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。

 
...
回复 链接 收藏
 
win2000_li
精华:
0
积分:
444
等级:
工程员
登陆次数:
26 
发表帖子:
102  
注册时间:
2008-07-29 
最后登陆:
2010-03-19 
状态:
离线

查看详细资料

积分:444
帖子:102
精华:0
等级:工程员
注册时间:2008-07-29
最后登录:2010-03-19
我的博客 发短消息
我的相册 当前离线
发表于2008-08-01 15:13 8#
RE:解读HC08 S08 C语言的头文件
支持发表文章.................
 
成功
回复 链接 收藏
 
花瓣飘落
精华:
0
积分:
11
等级:
学徒
登陆次数:
5 
发表帖子:
31  
注册时间:
2008-09-30 
最后登陆:
2009-01-02 
状态:
离线

查看详细资料

积分:11
帖子:31
精华:0
等级:学徒
注册时间:2008-09-30
最后登录:2009-01-02
我的博客 发短消息
我的相册 当前离线
发表于2008-09-30 16:06 9#
RE:解读HC08 S08 C语言的头文件
谢谢。有用
 
...
回复 链接 收藏
 
Eaglehawk
精华:
0
积分:
35
等级:
学徒
登陆次数:
3 
发表帖子:
12  
注册时间:
2009-08-13 
最后登陆:
2010-01-20 
状态:
离线

查看详细资料

积分:35
帖子:12
精华:0
等级:学徒
注册时间:2009-08-13
最后登录:2010-01-20
我的博客 发短消息
我的相册 当前离线
发表于2009-08-13 11:15 10#
RE:解读HC08 S08 C语言的头文件
谢谢,非常有用,我下了
 
...
回复 链接 收藏
 
li_kah
精华:
0
积分:
12
等级:
学徒
登陆次数:
1 
发表帖子:
16  
注册时间:
2009-11-02 
最后登陆:
2009-11-02 
状态:
离线

查看详细资料

积分:12
帖子:16
精华:0
等级:学徒
注册时间:2009-11-02
最后登录:2009-11-02
我的博客 发短消息
我的相册 当前离线
发表于2009-11-02 10:48 11#
RE:解读HC08 S08 C语言的头文件
谢谢分享!!!!
 
...
回复 链接 收藏
 
luxinchun
精华:
0
积分:
0
等级:
学徒
登陆次数:
3 
发表帖子:
6  
注册时间:
2008-05-01 
最后登陆:
2009-11-03 
状态:
离线

查看详细资料

积分:0
帖子:6
精华:0
等级:学徒
注册时间:2008-05-01
最后登录:2009-11-03
我的博客 发短消息
我的相册 当前离线
发表于2009-11-03 18:48 12#
回复:解读HC08 S08 C语言的头文件

不错

 
...
回复 链接 收藏
 
12 1/1 共1页 1
  • 发布新帖
  • 发布投票
  •        
您尚未 登录 | 注册

关于freescale技术社区 | freescale技术社区使用说明 | FAQ | 法律及版权声明 | 网站地图

联系邮件:tingting@eefocus.com 联系电话: 010-58859035-8018
Powered by eefocus.com