MSP430 位操作C語(yǔ)言編程
隨著MCU 種類不斷的增多,我們可選擇的范圍也越來越大,以前很多做51 的朋友,又開始為自己尋找新的獵物了,MSP430 無疑成為他們的首選目標(biāo)。因此,大多數(shù)程序員想輕松地實(shí)現(xiàn)過渡,那就是,把以前做的51C 程序盡可能多的移植到430平臺(tái)中,很不幸,由于處理器架構(gòu)不同,直接做這些工作起來確實(shí)相當(dāng)困難。首先是位操作問題,51 程序中充徹著大量的位操作,因此,不得不采用變通的方法來做,以下描述了在IAR 編譯平臺(tái)中實(shí)現(xiàn)位操作的大致方法,但必須注意到,采用IO 頭文件方式的程序,能夠?qū)崿F(xiàn)類似于51 的位編程語(yǔ)句,但并不是真正的位操作,僅僅是語(yǔ)法表達(dá)為一個(gè)位操作。
方法1--宏定義方式
我們來看對(duì)一個(gè)端口中位0(BIT0)的位操作程序是如何實(shí)現(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 低
......
從某種程度上,這種編程方法具備高級(jí)語(yǔ)言的編程特點(diǎn),具有很好的可讀性,可移植性也不錯(cuò),也是目前用的比較多的方法。但是缺點(diǎn),是不能把宏定義統(tǒng)一起來,每個(gè)宏需要程序員自己定義,由此,在多項(xiàng)目管理中,對(duì)代碼的移植性帶來了一些問題。同時(shí),也存在著一些潛在的問題,例如,無意的錯(cuò)誤定義等。這給程序調(diào)試多多少少帶來一些負(fù)面影響。
方法2--使用IO 頭文件方式
IAR 除了提供目前我們經(jīng)常使用的mspx43xxx.h 頭文件外,其實(shí),也定義了可以進(jìn)行位操作的寄存器結(jié)構(gòu)定義。還是以P1 口的BIT0,BIT1 為例。這個(gè)頭文件就是io 頭文件,根據(jù)不同的器件,命名為io430xxx.h,在這些頭文件中,將每個(gè)寄存器封裝到一個(gè)聯(lián)合結(jié)構(gòu)中,因此,我們既可以象方法1 一樣,通過自己定義宏,實(shí)現(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)生的匯編代碼,是相同的,僅僅是對(duì)同一個(gè)對(duì)象的不同表述而已。建議用戶采用io 定義方法,因?yàn)?,io 定義幾乎包含了mspx430xxx.h 的所有定義,一般而言,可以直接替換。此外,用這兩種編程時(shí),建議中斷和低功耗采用如下函數(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();
評(píng)論