<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

          MSP430 位操作C語(yǔ)言編程

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

          方法1--宏定義方式
          我們來(lái)看對(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)一起來(lái),每個(gè)宏需要程序員自己定義,由此,在多項(xiàng)目管理中,對(duì)代碼的移植性帶來(lái)了一些問(wèn)題。同時(shí),也存在著一些潛在的問(wèn)題,例如,無(wú)意的錯(cuò)誤定義等。這給程序調(diào)試多多少少帶來(lái)一些負(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 一樣,通過(guò)自己定義宏,實(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 方法,表述方法沒(méi)有方法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();


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

          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();