新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > msp430頭文件中 DEFC DEFW 及周邊的解釋

msp430頭文件中 DEFC DEFW 及周邊的解釋

作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò) 收藏

本文引用地址:http://butianyuan.cn/article/201611/321175.htm

使用語(yǔ)法如下:

label SET expr

label EQU expr

label = expr

label DEFINE expr

[const] sfrb register = value

[const] sfrw register = value

其中,

label 定義一個(gè)標(biāo)志符、

expr 標(biāo)志符的值、

register 特殊功能寄存器、

value 特殊功能寄存器的值。

在下面的例子中使用了局部變量與全局變量,在模塊add1 中定義了符號(hào)value ,同樣在

模塊add2 中也定義了符號(hào)value,但它們表示兩個(gè)不同的量,都只在各自的模塊內(nèi)部有效,

這是局部變量。而在模塊add1 中定義的locn 則為全局變量,在兩個(gè)模塊中表示同一個(gè)值。

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,作用是:在當(dāng)前模塊中賦予一個(gè)永久的值。

至此,

#define DEFCW(name, address) __no_init union

{

struct

{

volatile unsigned charname##_L;

volatile unsigned charname##_H;

};

volatile unsigned short name;

} @ address;

這種定義也變得相對(duì)好理解。以上的這種定義只是多了一個(gè)union的定義,將一個(gè)16位的地址存儲(chǔ)空間分成2個(gè)8bits或者1個(gè)16位。可以實(shí)現(xiàn)字訪問(wèn),也可以實(shí)現(xiàn)字節(jié)訪問(wèn)。以上定義是將一個(gè)無(wú)名的union與address聯(lián)系起來(lái),使得訪問(wèn)address對(duì)應(yīng)的內(nèi)存時(shí),就像訪問(wèn)union一樣。

那么對(duì)于下面的一些看起來(lái)貌似比較復(fù)雜的定義就相對(duì)比較好理解了:

#defineRF1AIFCTL1_ (0x0F02u)

DEFCW( RF1AIFCTL1 , RF1AIFCTL1_)

#defineRF1AIFIFG RF1AIFCTL1_L

#defineRF1AIFIE RF1AIFCTL1_H

可以發(fā)現(xiàn),第一個(gè)宏定義,“RF1AIFCTL1_”在字符串的最后帶一個(gè)下劃線,其實(shí)代表這只是一個(gè)地址。而通過(guò)宏擴(kuò)展DEFCW( RF1AIFCTL1 , RF1AIFCTL1_),將會(huì)被擴(kuò)展為:

__no_init union

{

struct

{

volatile unsigned charRF1AIFCTL1_L;

volatile unsigned charRF1AIFCTL1_H;

};

volatile unsigned short RF1AIFCTL1;

} @ (0x0F02u);

關(guān)于@的用法,今天查閱了《MSP430 IAR C/EC++ Compiler Reference Guide》,找到了結(jié)果:

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.

從中可以看出,@是一種語(yǔ)法。那么它的作用很明顯就是將變量放置到對(duì)應(yīng)的地址中。使用@,一個(gè)變量可以明確的制定一個(gè)存儲(chǔ)地址。

因此之前的宏定義就變得好理解了。

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

就是將name變量存放在address地址中,那么如此一來(lái)就可以為每個(gè)寄存器進(jìn)行命名了,也就是說(shuō)可以實(shí)現(xiàn)每個(gè)寄存器對(duì)應(yīng)一個(gè)或者多個(gè)變量。

至此頭文件中另外一個(gè)問(wèn)題也迎刃而解:

#defineRF1AIFCTL1_ (0x0F02u)

DEFCW( RF1AIFCTL1 , RF1AIFCTL1_)

#defineRF1AIFIFG RF1AIFCTL1_L

#defineRF1AIFIE RF1AIFCTL1_H

我們將DEFCW( RF1AIFCTL1 , RF1AIFCTL1_)展開(kāi):

__no_init union

{

struct

{

volatile unsigned charRF1AIFCTL1_L;

volatile unsigned charRF1AIFCTL1_H;

};

volatile unsigned short RF1AIFCTL1;

} @ (0x0F02u);

那么可以知道,RF1AIFCTL1,RF1AIFCTL1_L,RF1AIFCTL1_H已經(jīng)聲明成為一個(gè)變量,存放的地址分別是0x0F02u,0x0F02u+1,0x0F02u。因此接下來(lái)后面兩條宏定義就自然的解開(kāi)了。

#defineRF1AIFIFG RF1AIFCTL1_L

#defineRF1AIFIE RF1AIFCTL1_H

功能只是為變量RF1AIFCTL1_L,RF1AIFCTL1_H定義了另外的一種名字作為替換。



上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: msp430頭文件DEFCDEF

評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉