C語言訪問MCU寄存器的三種方式_第1頁
C語言訪問MCU寄存器的三種方式_第2頁
C語言訪問MCU寄存器的三種方式_第3頁
C語言訪問MCU寄存器的三種方式_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

本文格式為Word版,下載可任意編輯——C語言訪問MCU寄存器的三種方式C語言訪問MCU寄放器的三種方式

C語言的設(shè)計(jì)目標(biāo)是供給一種能以簡易的方式編譯、處理低級(jí)存儲(chǔ)器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語言。那么C語言訪問MCU寄放器的三種方式分別是怎樣的呢?以下僅供參考!

1.對(duì)C編譯器舉行語法擴(kuò)展

對(duì)C編譯器舉行語法擴(kuò)展。例如MCS51系列單片機(jī)的C-51語法中擴(kuò)展了sfr關(guān)鍵字,舉例如下:

sfrP0=0x80;

這樣操作0x80單元直接寫P0即可。

又如Atmel的AVR系列單片機(jī),其ICCAVR和GCCAVR編譯器都沒有定義新的數(shù)據(jù)類型,只能采用標(biāo)準(zhǔn)C的強(qiáng)制類型轉(zhuǎn)換和指針來實(shí)現(xiàn)訪問MCU的寄放器。而IAR和CodeVisionAVR編譯器對(duì)ANSIC舉行了擴(kuò)展,定義了新的數(shù)據(jù)類型,使C語言可以直接訪問MCU的有關(guān)寄放器,例如在IAR中可以使用:

SFR_BDDRB,0x28;

CodeVisionAVR中可以使用:

sfrbDDRB=0x28;

2.使用標(biāo)準(zhǔn)C的強(qiáng)制類型轉(zhuǎn)換和指針來實(shí)現(xiàn)

采用標(biāo)準(zhǔn)C的強(qiáng)制轉(zhuǎn)換和指針的概念來實(shí)現(xiàn)訪問MCU的寄放器,例如:

#defineDDRB*volatileunsignedchar*0x25

分析如下:

1.unsignedchar*0x25中的0x25只是個(gè)值,前面加unsignedchar*表示把這個(gè)值強(qiáng)制類型轉(zhuǎn)換為unsignedchar型的指針。再在前面加”*”,即*volatileunsignedchar*0x25表示對(duì)這個(gè)指針解引用,相當(dāng)于

unsignedchar*0x25是一個(gè)指針p,而這個(gè)宏定義為#defineDDRB*p。

這樣當(dāng)讀/寫以0x25為地址的寄放器時(shí),直接書寫DDRB即可,即寫:

DDRB=0xff;

相當(dāng)于:

unsignedchar*p,i;p=0x25;i=*p;//把地址為0x25單元中的數(shù)據(jù)讀出送入i變量*p=0xff;//向地址為0x25的單元中寫入0xff

這樣經(jīng)過一層宏定義的封裝就變得直觀和便當(dāng)?shù)亩嗔恕?/p>

2.關(guān)鍵字volatile確保本指令不會(huì)以為C編譯器的優(yōu)化而被省略,且要求每次直接讀值。例如使用while*unsignedchar*0x25時(shí),有時(shí)系統(tǒng)可能不能真正去讀0x25的值,而是用第一次讀出的值,假設(shè)這樣,這個(gè)循環(huán)可能就是個(gè)死循環(huán)。用了volatile那么要求每次都去讀0x25的實(shí)際值。

GCCAVR工具鏈中就使用了這樣的方式,例如在iomx8.h文件中一個(gè)定義如下:

#definePORTB_SFR_IO80x25

而在sfr_defs.h中可以找到如下兩個(gè)宏定義:

#define_SFR_IO8io_addr_MMIO_BYTEio_addr+0x20#define_MMIO_BYTEmem_addr*volatileunit8_t*mem_addr

實(shí)質(zhì)上與直接的強(qiáng)制類型轉(zhuǎn)換和指針定義是一樣的。

3.使用布局體實(shí)現(xiàn)

使用指針的`方式來訪問特殊功能寄放器的優(yōu)勢在于完全符合標(biāo)準(zhǔn)的ANSI-C,而無需擴(kuò)展語法,形成“方言”,擁有更好的兼容性和可移植性。

這種方式適合簡樸的應(yīng)用程序,而當(dāng)系統(tǒng)用到多個(gè)同種外設(shè)時(shí),就需要為每一個(gè)這種外設(shè)定義寄放器,這樣就會(huì)使程序的維護(hù)變得分外困難。而且,由于每次寄放器操作都會(huì)有對(duì)應(yīng)的常量存儲(chǔ)在程序Flash里,為每個(gè)寄放器定義單獨(dú)的指針還會(huì)增加程序代碼。

為了簡化程序代碼,可以將寄放器組定義為布局體,而將外設(shè)當(dāng)做指向這個(gè)布局體的指針。例如:

typedefstructvolatileunsignedlongDATA;//0x00volatileunsignedlongRSR;//0x04unsignedlongRESERVED0[4];//0x08-0x14volatileunsignedlongFLAG;//0x18...UART_TypeDef;#defineUart0UART_Type*0x40003000#defineUart1UART_Type*0x40004000#defineUart2UART_Type*0x40005000intgetkeyUART_TypeDef*uartptrwhileuartptr-FLAG0x40==0;//多數(shù)據(jù),等待returnuartptr-DATA;//讀取字符intmainvoidunsigned

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論