新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > MSP430 位操作C語言編程

        MSP430 位操作C語言編程

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

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

        方法2--使用IO 頭文件方式
        IAR 除了提供目前我們經常使用的mspx43xxx.h 頭文件外,其實,也定義了可以進行位操作的寄存器結構定義。還是以P1 口的BIT0,BIT1 為例。這個頭文件就是io 頭文件,根據不同的器件,命名為io430xxx.h,在這些頭文件中,將每個寄存器封裝到一個聯合結構中,因此,我們既可以象方法1 一樣,通過自己定義宏,實現自己的位操作,也可以像51 一樣,進行位操作。使用方法如下:
        ......
        P1OUT_bit.POUT_0=1; //輸出P1.0 為高
        if(P1IN_bit.PIN_1) P1OUT_bit.POUT_0=0; //如果P1.1 輸入高,則輸出P1.0 低
        ......
        IO 方法,表述方法沒有方法1 好。但是比較直接,當然,為了更好的可讀性,可以再次重新定義宏。如下:
        #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 所定義的宏了。

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

        中斷:
        __disable_interrupt();
        __enable_interrupt();

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

        功耗模式:
        __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();


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 新疆| 青河县| 漾濞| 历史| 油尖旺区| 太仆寺旗| 香格里拉县| 克拉玛依市| 上思县| 衡水市| 荆州市| 犍为县| 吴堡县| 花莲县| 正定县| 敦煌市| 定西市| 南阳市| 县级市| 太康县| 梨树县| 大连市| 环江| 南安市| 包头市| 凤冈县| 恩平市| 襄汾县| 屏东县| 庆安县| 手游| 三门县| 宁海县| 达州市| 台州市| 肥城市| 手机| 赞皇县| 吉安县| 洛阳市| 祁阳县|