一般計算機結構常見在記憶體及輸出入埠,記憶體用來儲存資料或程式碼,而輸出入埠則用來連接硬體設備,然而不管是記憶體或是輸出入埠都需要編位址,用位址來存取內容。若把記憶體及輸出入埠分開編位址,我們稱為Port Mapped I/O,若是合在一起則稱讚Memory Mapped I/O,可以參考維基百科上的暫存器映射輸出輸入的。典型Port Mapped I/O電腦結構就是x86系統;大部份微處理機和8051微處理器是採用Memory Mapped I/O,採用Memory Mapped I/O,會把輸出入埠及記憶體一起編位址,以8051為例暫存器有256個,從00H~FFH,而00H~7FH是屬於一般用途暫存器,80H~FFH則是屬於特殊功能暫存器,簡稱SFR。
對於C8051F500微處理機,是以8051為核心,擴充許多硬體,包括:看門狗、ADC、DAC、電壓比較器、電壓基準、計時器、PWM、溫度感知器、UART、SPI、SMBUS、CAN、LIN、USB等。因此80H~FFH空間不夠使用,所以採用分頁來處理,C8051F500微處理機把SFR分成三頁,利用特殊功能暫存器頁面選擇暫存器(Special Function Register Page Selection register, SFRPAGE),把內容設定成0x0, 0xC, and 0xF就能選擇,所以要操作特殊功能暫存器,就必須先設定特殊功能暫存器頁面選擇暫存器的內容,再利用MOV指令來直接存取。
在C8051F500_defs.h標頭檔的最後面,有定義特殊功能暫存器的頁面:
//-----------------------------------------------------------------------------
// SFR Page Definitions
//-----------------------------------------------------------------------------
#define CONFIG_PAGE 0x0F // System and Port Configuration Page
#define ACTIVE_PAGE 0x00 // Active Use Page
#define CAN0_PAGE 0x0C // CAN0 Registers
在程式中就可以使用下列命令來存取主動頁面
SFRPAGE = ACTIVE_PAGE;
來存取設定配置面頁暫存器
SFRPAGE = CONFIG_PAGE;
來存取設定CAN面頁暫存器
SFRPAGE = CAN0_PAGE;
沒有留言:
張貼留言