新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > msp430头文件中 DEFC DEFW 及周边的解释

msp430头文件中 DEFC DEFW 及周边的解释

作者: 时间:2016-11-25 来源:网络 收藏

本文引用地址:https://www.eepw.com.cn/article/201611/321175.htm

使用语法如下:

label SET expr

label EQU expr

label = expr

label DEFINE expr

[const] sfrb register = value

[const] sfrw register = value

其中,

label 定义一个标志符、

expr 标志符的值、

register 特殊功能寄存器、

value 特殊功能寄存器的值。

在下面的例子中使用了局部变量与全局变量,在模块add1 中定义了符号value ,同样在

模块add2 中也定义了符号value,但它们表示两个不同的量,都只在各自的模块内部有效,

这是局部变量。而在模块add1 中定义的locn 则为全局变量,在两个模块中表示同一个值。

NAME add1

locn DEFINE 100H

value EQU 77

MOV locn,R4

ADD #value,R4

ENDMOD

NAME add2

value EQU 88

MOV locn,R5

ADD #value,R5

END

很明显,“=”也就是EQU,作用是:在当前模块中赋予一个永久的值。

至此,

#define DEFCW(name, address) __no_init union

{

struct

{

volatile unsigned charname##_L;

volatile unsigned charname##_H;

};

volatile unsigned short name;

} @ address;

这种定义也变得相对好理解。以上的这种定义只是多了一个union的定义,将一个16位的地址存储空间分成2个8bits或者1个16位。可以实现字访问,也可以实现字节访问。以上定义是将一个无名的union与address联系起来,使得访问address对应的内存时,就像访问union一样。

那么对于下面的一些看起来貌似比较复杂的定义就相对比较好理解了:

#defineRF1AIFCTL1_ (0x0F02u)

DEFCW( RF1AIFCTL1 , RF1AIFCTL1_)

#defineRF1AIFIFG RF1AIFCTL1_L

#defineRF1AIFIE RF1AIFCTL1_H

可以发现,第一个宏定义,“RF1AIFCTL1_”在字符串的最后带一个下划线,其实代表这只是一个地址。而通过宏扩展DEFCW( RF1AIFCTL1 , RF1AIFCTL1_),将会被扩展为:

__no_init union

{

struct

{

volatile unsigned charRF1AIFCTL1_L;

volatile unsigned charRF1AIFCTL1_H;

};

volatile unsigned short RF1AIFCTL1;

} @ (0x0F02u);

关于@的用法,今天查阅了《MSP430 IAR C/EC++ Compiler Reference Guide》,找到了结果:

A variable that has been explicitly placed at an address, for example by using the compiler @ syntax, will be placed in either the DATA16_AC or the DATA16_AN segment.

从中可以看出,@是一种语法。那么它的作用很明显就是将变量放置到对应的地址中。使用@,一个变量可以明确的制定一个存储地址。

因此之前的宏定义就变得好理解了。

#define DEFC(name, address) __no_init volatile unsigned char name @ address;

就是将name变量存放在address地址中,那么如此一来就可以为每个寄存器进行命名了,也就是说可以实现每个寄存器对应一个或者多个变量。

至此头文件中另外一个问题也迎刃而解:

#defineRF1AIFCTL1_ (0x0F02u)

DEFCW( RF1AIFCTL1 , RF1AIFCTL1_)

#defineRF1AIFIFG RF1AIFCTL1_L

#defineRF1AIFIE RF1AIFCTL1_H

我们将DEFCW( RF1AIFCTL1 , RF1AIFCTL1_)展开:

__no_init union

{

struct

{

volatile unsigned charRF1AIFCTL1_L;

volatile unsigned charRF1AIFCTL1_H;

};

volatile unsigned short RF1AIFCTL1;

} @ (0x0F02u);

那么可以知道,RF1AIFCTL1,RF1AIFCTL1_L,RF1AIFCTL1_H已经声明成为一个变量,存放的地址分别是0x0F02u,0x0F02u+1,0x0F02u。因此接下来后面两条宏定义就自然的解开了。

#defineRF1AIFIFG RF1AIFCTL1_L

#defineRF1AIFIE RF1AIFCTL1_H

功能只是为变量RF1AIFCTL1_L,RF1AIFCTL1_H定义了另外的一种名字作为替换。



上一页 1 2 下一页

关键词: msp430头文件DEFCDEF

评论


相关推荐

技术专区

关闭