新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > MSP430 位操作C語言編程

MSP430 位操作C語言編程

作者: 時間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
前言
隨著MCU 種類不斷的增多,我們可選擇的范圍也越來越大,以前很多做51 的朋友,又開始為自己尋找新的獵物了,MSP430 無疑成為他們的首選目標(biāo)。因此,大多數(shù)程序員想輕松地實現(xiàn)過渡,那就是,把以前做的51C 程序盡可能多的移植到430平臺中,很不幸,由于處理器架構(gòu)不同,直接做這些工作起來確實相當(dāng)困難。首先是位操作問題,51 程序中充徹著大量的位操作,因此,不得不采用變通的方法來做,以下描述了在IAR 編譯平臺中實現(xiàn)位操作的大致方法,但必須注意到,采用IO 頭文件方式的程序,能夠?qū)崿F(xiàn)類似于51 的位編程語句,但并不是真正的位操作,僅僅是語法表達(dá)為一個位操作。

方法1--宏定義方式
我們來看對一個端口中位0(BIT0)的位操作程序是如何實現(xiàn)的,因此,假定P1.0 是輸出,P1.1 是輸入。
定義位操作宏如下:
#define P1BIT0_OUT_HIGH P1OUT |=BIT0
#define P1BIT0_OUT_LOW P1OUT &=~BIT0
#define P1BIT1_IN P1IN &=BIT1
注:BIT0,BIT1 定義在相應(yīng)430 器件的頭文件中使用位操作
......
P1BIT0_OUT_HIGH; //輸出P1.0 為高
if(P1BIT_IN) P1BIT0_OUT_LOW; //如果P1.1 輸入高,則輸出P1.0 低
......
從某種程度上,這種編程方法具備高級語言的編程特點,具有很好的可讀性,可移植性也不錯,也是目前用的比較多的方法。但是缺點,是不能把宏定義統(tǒng)一起來,每個宏需要程序員自己定義,由此,在多項目管理中,對代碼的移植性帶來了一些問題。同時,也存在著一些潛在的問題,例如,無意的錯誤定義等。這給程序調(diào)試多多少少帶來一些負(fù)面影響。

方法2--使用IO 頭文件方式
IAR 除了提供目前我們經(jīng)常使用的mspx43xxx.h 頭文件外,其實,也定義了可以進(jìn)行位操作的寄存器結(jié)構(gòu)定義。還是以P1 口的BIT0,BIT1 為例。這個頭文件就是io 頭文件,根據(jù)不同的器件,命名為io430xxx.h,在這些頭文件中,將每個寄存器封裝到一個聯(lián)合結(jié)構(gòu)中,因此,我們既可以象方法1 一樣,通過自己定義宏,實現(xiàn)自己的位操作,也可以像51 一樣,進(jìn)行位操作。使用方法如下:
......
P1OUT_bit.POUT_0=1; //輸出P1.0 為高
if(P1IN_bit.PIN_1) P1OUT_bit.POUT_0=0; //如果P1.1 輸入高,則輸出P1.0 低
......
IO 方法,表述方法沒有方法1 好。但是比較直接,當(dāng)然,為了更好的可讀性,可以再次重新定義宏。如下:
#define P1BIT0_OUT_HIGH P1OUT_bit.POUT_0=1
#define P1BIT0_OUT_LOW P1OUT_bit.POUT_0=0
#define P1BIT1_IN P1IN_bit.PIN_1
如此定義后,可直接使用方法1 編制的源代碼,唯一的,需要修改方法1 所定義的宏了。

總結(jié)
兩種方法產(chǎn)生的匯編代碼,是相同的,僅僅是對同一個對象的不同表述而已。建議用戶采用io 定義方法,因為,io 定義幾乎包含了mspx430xxx.h 的所有定義,一般而言,可以直接替換。此外,用這兩種編程時,建議中斷和低功耗采用如下函數(shù),他們包括在頭文件intrinsics.h 中。

中斷:
__disable_interrupt();
__enable_interrupt();

SR 寄存器:
__bis_SR_register(設(shè)置參數(shù));
__bic_SR_register(設(shè)置參數(shù));

功耗模式:
__low_power_mode_0();
__low_power_mode_1();
__low_power_mode_2();
__low_power_mode_3();
__low_power_mode_4();
__low_power_mode_off_on_exit();


關(guān)鍵詞: MSP430位操作C語言編

評論


技術(shù)專區(qū)

關(guān)閉