



下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
本文格式為Word版,下載可任意編輯——C語言訪問MCU寄存器的三種方式C語言訪問MCU寄放器的三種方式
C語言的設計目標是供給一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。那么C語言訪問MCU寄放器的三種方式分別是怎樣的呢?以下僅供參考!
1.對C編譯器舉行語法擴展
對C編譯器舉行語法擴展。例如MCS51系列單片機的C-51語法中擴展了sfr關鍵字,舉例如下:
sfrP0=0x80;
這樣操作0x80單元直接寫P0即可。
又如Atmel的AVR系列單片機,其ICCAVR和GCCAVR編譯器都沒有定義新的數據類型,只能采用標準C的強制類型轉換和指針來實現訪問MCU的寄放器。而IAR和CodeVisionAVR編譯器對ANSIC舉行了擴展,定義了新的數據類型,使C語言可以直接訪問MCU的有關寄放器,例如在IAR中可以使用:
SFR_BDDRB,0x28;
CodeVisionAVR中可以使用:
sfrbDDRB=0x28;
2.使用標準C的強制類型轉換和指針來實現
采用標準C的強制轉換和指針的概念來實現訪問MCU的寄放器,例如:
#defineDDRB*volatileunsignedchar*0x25
分析如下:
1.unsignedchar*0x25中的0x25只是個值,前面加unsignedchar*表示把這個值強制類型轉換為unsignedchar型的指針。再在前面加”*”,即*volatileunsignedchar*0x25表示對這個指針解引用,相當于
unsignedchar*0x25是一個指針p,而這個宏定義為#defineDDRB*p。
這樣當讀/寫以0x25為地址的寄放器時,直接書寫DDRB即可,即寫:
DDRB=0xff;
相當于:
unsignedchar*p,i;p=0x25;i=*p;//把地址為0x25單元中的數據讀出送入i變量*p=0xff;//向地址為0x25的單元中寫入0xff
這樣經過一層宏定義的封裝就變得直觀和便當的多了。
2.關鍵字volatile確保本指令不會以為C編譯器的優化而被省略,且要求每次直接讀值。例如使用while*unsignedchar*0x25時,有時系統可能不能真正去讀0x25的值,而是用第一次讀出的值,假設這樣,這個循環可能就是個死循環。用了volatile那么要求每次都去讀0x25的實際值。
GCCAVR工具鏈中就使用了這樣的方式,例如在iomx8.h文件中一個定義如下:
#definePORTB_SFR_IO80x25
而在sfr_defs.h中可以找到如下兩個宏定義:
#define_SFR_IO8io_addr_MMIO_BYTEio_addr+0x20#define_MMIO_BYTEmem_addr*volatileunit8_t*mem_addr
實質上與直接的強制類型轉換和指針定義是一樣的。
3.使用布局體實現
使用指針的`方式來訪問特殊功能寄放器的優勢在于完全符合標準的ANSI-C,而無需擴展語法,形成“方言”,擁有更好的兼容性和可移植性。
這種方式適合簡樸的應用程序,而當系統用到多個同種外設時,就需要為每一個這種外設定義寄放器,這樣就會使程序的維護變得分外困難。而且,由于每次寄放器操作都會有對應的常量存儲在程序Flash里,為每個寄放器定義單獨的指針還會增加程序代碼。
為了簡化程序代碼,可以將寄放器組定義為布局體,而將外設當做指向這個布局體的指針。例如:
typedefstructvolatileunsignedlongDATA;//0x00volatileunsignedlongRSR;//0x04unsignedlongRESERVED0[4];//0x08-0x14volatileunsignedlongFLAG;//0x18...UART_TypeDef;#defineUart0UART_Type*0x40003000#defineUart1UART_Type*0x40004000#defineUart2UART_Type*0x40005000intgetkeyUART_TypeDef*uartptrwhileuartptr-FLAG0x40==0;//多數據,等待returnuartptr-DATA;//讀取字符intmainvoidunsigned
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 代碼編程科普活動方案
- 代賬公司端午活動方案
- 以賽帶學活動方案
- 仲夏狂歡活動方案
- 企業一對一幫扶活動方案
- 企業三零服務活動方案
- 企業從事營利活動方案
- 企業公司交流活動方案
- 企業冬季團建活動方案
- 企業單位插花活動方案
- 2025壓覆礦產資源調查評估規范
- 杭州市富陽區專業人才引進考試真題2024
- 2025江蘇蘇州工業園區蘇相合作區助理人員招聘15人易考易錯模擬試題(共500題)試卷后附參考答案
- T/CCSAS 027-2023粉碎、篩分單元操作機械化、自動化設計方案指南
- 帶狀皰疹疫苗接種
- java筆試題目及答案
- 2025山西尚卓集團有限公司及全資子公司招聘16人筆試參考題庫附帶答案詳解
- 數據科學項目Python編程題及答案
- 2025年湖南省永州市寧遠縣中考三模歷史試題(含答案)
- 2025年英語專業四級(TEM4)完形填空專項模擬試卷(詞匯與邏輯推理)-名校真題深度解析與詞匯積累挑戰版
- 河南省2024-2025學年天一大聯考高三考前模擬考試 生物試卷+答案
評論
0/150
提交評論