下載本文檔
版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《救生技術(shù)知識(shí)講座》課件
- 浙江省杭州八中2025屆高考沖刺數(shù)學(xué)模擬試題含解析
- 2025屆河南省漯河市重點(diǎn)中學(xué)高考英語三模試卷含解析
- 現(xiàn)代學(xué)徒制課題:現(xiàn)場工程師的內(nèi)涵特征和培養(yǎng)路徑研究(附:研究思路模板、可修改技術(shù)路線圖)
- 福建省莆田市第二十五中學(xué)2025屆高三考前熱身語文試卷含解析
- 黑龍江省雙鴨山市重點(diǎn)中學(xué)2025屆高考數(shù)學(xué)一模試卷含解析
- 穩(wěn)派教育2025屆高三3月份模擬考試語文試題含解析
- 2025屆漳州市重點(diǎn)中學(xué)高三壓軸卷數(shù)學(xué)試卷含解析
- 福建省泉州市泉港第一中學(xué)2025屆高考考前模擬語文試題含解析
- 2025屆四川省成都市重點(diǎn)中學(xué)高考沖刺押題(最后一卷)英語試卷含解析
- 校園暴力課件
- 眼科延續(xù)性護(hù)理
- 學(xué)習(xí)新質(zhì)生產(chǎn)力什么是新質(zhì)生產(chǎn)力課件
- 高等數(shù)學(xué)(第二版)課件:微分中值定理及導(dǎo)數(shù)的應(yīng)用
- 提高大面積金剛砂地坪施工質(zhì)量【QC成果】
- 2024年廣東省廣州市越秀區(qū)中考語文一模試卷
- 小學(xué)信息技術(shù)三年級(jí)上冊(cè)第9課 《電子文本需保存》說課稿
- 運(yùn)動(dòng)解剖學(xué)(72學(xué)時(shí))學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 《專業(yè)演講技巧》課件
- 八年級(jí)上冊(cè)物理全冊(cè)知識(shí)點(diǎn)總結(jié)(人教)
- 人教版八年級(jí)英語上冊(cè)期末復(fù)習(xí)選詞填空練習(xí)
評(píng)論
0/150
提交評(píng)論