版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 再說(shuō)位運(yùn)算 本篇為CLOUD430自學(xué)筆記的雜項(xiàng)篇,相對(duì)自學(xué)筆記正文篇要專(zhuān)業(yè)一些,本文中將會(huì) 涉及相關(guān)430的基礎(chǔ)知識(shí),不懂的可以參看 CLOUD自學(xué)筆記正文篇,另外Cloud學(xué)識(shí)有限 難免有疏漏望大家毫不留情地指出。 CLOUD-直認(rèn)為MSP430單片機(jī)的IO 口是不可以位尋址的,相關(guān)手冊(cè)和代碼大量的位 與運(yùn)算、位或運(yùn)算都很好滴證明了這一點(diǎn)。用慣了C51中的“ sbit”的孩子們剛開(kāi)始總是有 點(diǎn)苦惱,總是被大量的位運(yùn)算蒙蔽了很多。雖然位運(yùn)算擁有很多按位尋址操作所不可比擬的 優(yōu)勢(shì)(比如大量位的操作),但是 Cloud還是對(duì)于“單個(gè)位”操作有很大的研究興趣。一次 偶然機(jī)會(huì),看到430引用的頭文
2、件io430.h所引用的相關(guān)芯片頭文件(這里 Cloud用的是 io430g2553.h )內(nèi)部對(duì)io 口的相關(guān)定義,產(chǎn)生了IO 口單獨(dú)位操作的實(shí)現(xiàn)方法,本文就將對(duì) 這一過(guò)程進(jìn)行說(shuō)明并研究不同操作方式的優(yōu)劣。 G2553單片機(jī)擁有P1 口和P2 ,對(duì)P1 口的輸出操作是 P1OUT寄存器,我們查看P1OUT 的相關(guān)聲明,出現(xiàn)如下代碼: no init volatile union /* Port 1 Out put */ un sig ned char P1OUT; struct un sig ned char P0 un sig ned char P1 un sig ned char P2
3、un sig ned char P3 un sig ned char P4 un sig ned char P5 un sig ned char P6 un sig ned char P7 P 1OUT_bit; 0 x0021; 可以看到,P1OUT 1; /* 1; /* 1; /* 1; /* 1; /* 1; /* 1; /* 1; /* */ */ */ */ */ */ */ */ 的數(shù)據(jù)類(lèi)型是一個(gè)無(wú)符號(hào)字符型,占1個(gè)字節(jié)。 然而這個(gè)P1OUT并不是孤單的,它是在一個(gè)大括號(hào)內(nèi)部定義的,大括號(hào)前面有這樣一 條語(yǔ)句: _no_init volatile union 這條代碼由三個(gè)關(guān)鍵字
4、組成,下面分別解釋這三個(gè)關(guān)鍵字: _no_init:這個(gè)關(guān)鍵字表示不會(huì)在單片機(jī)初始化時(shí)就配置該變量。由于430單片機(jī)內(nèi) 部默認(rèn)是開(kāi)啟看門(mén)狗電路的,而看門(mén)狗電路將在一定時(shí)間(沒(méi)有進(jìn)行“喂狗”動(dòng)作)后對(duì)系 統(tǒng)進(jìn)行復(fù)位操作。雖然我們一般在main函數(shù)的第一條運(yùn)行語(yǔ)句寫(xiě)上如下語(yǔ)句來(lái)關(guān)閉看門(mén)狗: WDTCTL = WDT PW + WDTHOLD; 但是這條語(yǔ)句在實(shí)際運(yùn)行中并不是第一條執(zhí)行的,系統(tǒng)在初始化時(shí),將會(huì)初始化大量的 變量定義,如果這段初始化的工作時(shí)間超過(guò)了看門(mén)狗的定時(shí)長(zhǎng)度就會(huì)發(fā)生復(fù)位,即造成系統(tǒng) 一直無(wú)法跑進(jìn)main函數(shù)的假象。所以第一個(gè)關(guān)鍵字就是為了避免這一問(wèn)題的發(fā)生。 volatile :
5、這個(gè)關(guān)鍵字可能部分同學(xué)都已經(jīng)知道了。這個(gè)標(biāo)示符主要是為了避免編譯器 對(duì)變量進(jìn)行優(yōu)化操作,如果沒(méi)有這個(gè)標(biāo)示,下面的三行代碼將會(huì)只執(zhí)行第三行即最后一行。 P1OUT = 0 x00; P1OUT = 0 x01; P1OUT = 0 x00; 本來(lái)上述代碼用于使用P1.0 口來(lái)輸出一個(gè)短暫的脈沖信號(hào),若P1OUT沒(méi)有用volatile 進(jìn)行修飾,則P1 口在這段時(shí)間都是保持低電平不變的。 Cloud 將 union:這個(gè)是聯(lián)合的關(guān)鍵字,可以說(shuō)是表示一種變量的類(lèi)型,這也是后面 重點(diǎn)研究的對(duì)象。 P1OUT,而另外一部分卻 我們發(fā)現(xiàn)聯(lián)合內(nèi)部由兩部分組成,一部分是我們前面用到的 為了方便分析,我將代碼重
6、新寫(xiě)出來(lái): 是一個(gè)struct,結(jié)構(gòu)。 struct un sig ned char P0 un sig ned char P1 un sig ned char P2 un sig ned char P3 un sig ned char P4 un sig ned char P5 un sig ned char P6 un sig ned char P7 P 1OUT_bit; 這里定義了一個(gè)由 成起來(lái)正好是一個(gè)字節(jié)。 1; /* 1; /* 1; /* 1; /* 1; /* 1; /* 1; /* 1; /* */ */ */ */ */ */ */ */ P0P7組成的結(jié)構(gòu),右邊的“ :
7、1 ”告訴我們每個(gè)變量占了一個(gè)位,組 另外還直接對(duì)這個(gè)結(jié)構(gòu)聲明了一個(gè)變量:P1OUT_bit,這個(gè)變量將 會(huì)成為后面我們實(shí)現(xiàn)單獨(dú)位操作的關(guān)鍵變量。 最后,這個(gè)結(jié)構(gòu)體指向了地址0 x0021,這個(gè)地址就是 P1OUT寄存器所在的物理地址。 一般情況下,我們要對(duì)P1.1置高電平會(huì)使用如下位操作代碼: P1OUT |= 0 x02; 然而現(xiàn)在我們有了 P1OUT_bit這個(gè)結(jié)構(gòu)變量,我們可以這樣寫(xiě): P1OUT_bit .P1 = 1; 通過(guò)實(shí)際編譯下載測(cè)試,cloud發(fā)現(xiàn)上面的代碼實(shí)現(xiàn)的效果是一樣的,那么,為什么會(huì) 這樣? 原因就在于io430g2553.h頭文件定義的這個(gè)聯(lián)合體。它將 1個(gè)8位的
8、P1OUT和8個(gè)1 位的P1OUT_bit聯(lián)合在一個(gè)內(nèi)存地址中(全部指向0 x0021 ),在這一個(gè)字節(jié)的空間中,P1OUT 和P1OUT_bit共享資源。也就是說(shuō),我們可以隨意用兩種方式訪問(wèn)這塊地址。 讓我們放眼全部的寄存器,發(fā)現(xiàn)在io430g2553.h頭文件中幾乎對(duì)所有的寄存器的定義都 是這樣的方式,例如定時(shí)器 0的控制寄存器TA0CTL : no init volatile union un sig ned short TA0CTL; struct /* Timer0_A3 Control */ un sig ned short TAIFG un sig ned short TAIE
9、un sig ned short TACLR un sig ned short: un sig ned short MC0 un sig ned short MC1 un sig ned short ID0 un sig ned short ID1 un sig ned short TASSEL0 un sig ned short TASSEL1 TA0CTL_bit; 0 x0160; 可以看到,它也定義了很多內(nèi)容。另外還有16位的寄存器的定義也是大同小異。 幸福來(lái)得太突然,但是,用這種方式操作到底比位運(yùn)算操作快還是滿呢?讓我們做一個(gè) 實(shí)驗(yàn): 我們使用如下代碼,用以測(cè)量單位操作的時(shí)間: #i
10、n clude io430.h :1; /* Timer A coun ter interrupt flag */ :1; /* Timer A coun ter interrupt en able */ :1; /* Timer A coun ter clear */ 1; :1; /* Timer A mode control 0 */ :1; /* Timer A mode control 1 */ :1; /* Timer A clock input divider 0 */ :1; /* Timer A clock input divider 1 */ :1; /* Timer A
11、clock source select 0 */ :1; /* Timer A clock source select 1 */ int main( void ) WDTCTL = WDTPW + WDTHOLD; P1DIR = OxFF; P 1SEL_bit. P4 = 1; / 設(shè)置輸出SMCLK DCOCTL = CALDCO_1MH Z; BCSCTL1 = CALBC1_1MHZ; while(1) P 1OUT_bit. P1 = 1; P 1OUT_bit. P0 = 1; P 1OUT_bit. P0 = 0; P 1OUT_bit. P1 = 0; 然后我們測(cè)量P1.0
12、口和P1.1 口的波形如下(cloud使用邏輯分析儀測(cè)量的),其中P1.0 口的波形是上面通道 0的波形,P1.1 口的波形是下面通道1的波形。另外我們?yōu)榱朔奖銣y(cè) 量,將SMCLK的波形輸出(由P 1.4 口),這里由于SMCLK和MCLK默認(rèn)頻率是一樣的, 所以就把SMCLK的波形當(dāng)做是CPU的時(shí)鐘: DjsasscjnblyX I I.卜- -h, * 4個(gè)CPU周 配合我們編寫(xiě)的代碼我們可以知道while(1)中執(zhí)行的語(yǔ)句執(zhí)行周期都是 期。讓我們把 while(1)中的四條語(yǔ)句用位操作來(lái)實(shí)現(xiàn),如下: P1OUT |= 0 x02; P1OUT |= 0 x01; P1OUT P1OUT
13、同樣輸出3個(gè)波形如下: a Sa.-jf* iz- -111 icon i -r-i r .音.J| I* 1-+; 發(fā)現(xiàn)了什么?!結(jié)果是一樣的! 看來(lái),還是得看看編譯器編譯的匯編代碼才行 Go to Disassembly PlDIR = OxFF; O0CO1243F2 0022 #OxFF,i.PlDIR PlSEIbit.P4 - 1” 00CO16D0F2 0010 OiO26 DCOCTL = CALDCOiMHZ, OOiCOlC BCSCTIl O0ICO2 2 PIOUT tfOxlO,-02 nov. b i*CALDCO_lMHZ, iDCOCTL fiCALBCllMH
14、2, fiBCSCTIl Kiov, b bis. b 竹xlj D3D2 0021 涂 OzFE; C3 0021 S= Ox C3E2 00門(mén) 3FF7 bic b #Oxl, 0OC02242D2 lOFF 0057 FlOUT-bgt Fl 1; mov. b jftov. b i.CALDCO_lMHZ, iDCOCTI. iiCALBCl_lMHZ, iDCSCTIl 我們可以看到,P1OUT |= 0 x01;這條語(yǔ)句被翻譯成了 bis .b #0 x2,&P 1OUT bis.b這條匯編代碼的意思就是位運(yùn)算(后面紅色框中jmp 0 xC28表示跳轉(zhuǎn)回到00C028 地址,其實(shí)就
15、是我們的while(1)循環(huán))。我們?cè)倏纯磫为?dú)位操作產(chǎn)生的匯編代碼是怎么樣的: Disassembly Mervwry Goto PIOUT blt PO - 1 0000 2C D3D2 0021 bis. b jroxi.&piouT F1WJT= at 已 * 1; 0OC030 C3D2 0021 bic. b mi.sPiouT PIQUT- ,bir Fl 星 0.: 0OC034 C3E2 0021 bic. b m2,fi.P10UT oocoae 3FF7 jmp 0kC02B =eK i t: 00C03A 130A push.w RIO 0OC03C 8321 deed.科 SP 0OC03E 4C0A JIIOV . w R12,E10 0OC040 4AS1 0000 BL
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 沈陽(yáng)理工大學(xué)《變頻控制技術(shù)》2022-2023學(xué)年期末試卷
- 合同法第52條5項(xiàng)
- 新入職員工的意識(shí)培訓(xùn)
- 2025版高考英語(yǔ)一輪復(fù)習(xí)第1部分人與自我主題群1生活與學(xué)習(xí)主題語(yǔ)境5認(rèn)識(shí)自我豐富自我完善自我2教師用書(shū)教案
- 新高考2025屆高考政治小題必練1神奇的貨幣
- 大班音樂(lè)嘗葡萄課件
- 2024年拉薩客運(yùn)資格證答題軟件下載
- 2024賓館轉(zhuǎn)讓合同范文
- 2024屋頂防水合同范文
- 2024小額貸款擔(dān)保合同范本
- 淺議小升初數(shù)學(xué)教學(xué)銜接
- 設(shè)備安裝應(yīng)急救援預(yù)案
- 深基坑工程降水技術(shù)及現(xiàn)階段發(fā)展
- 暫堵壓裂技術(shù)服務(wù)方案
- 《孔乙己》公開(kāi)課一等獎(jiǎng)PPT優(yōu)秀課件
- 美的中央空調(diào)故障代碼H系列家庭中央空調(diào)(第一部分多聯(lián)機(jī))
- 物料承認(rèn)管理辦法
- 業(yè)主委員會(huì)成立流程圖
- (完整版)全usedtodo,beusedtodoing,beusedtodo辨析練習(xí)(帶答案)
- 廣聯(lián)達(dá)辦公大廈工程施工組織設(shè)計(jì)
- 疑難病例HELLP綜合征
評(píng)論
0/150
提交評(píng)論