Freescale 16位單片機(jī)的地址映射
原來(lái)一直不太明白單片機(jī)的地址映射,也沒(méi)有仔細(xì)的研究過(guò),我想這就是我不是牛人的原因吧。通常開(kāi)始學(xué)單片機(jī),都是寫(xiě)一些比較小的程序,如果不做項(xiàng)目開(kāi)發(fā)之類的,以飛思卡爾16位單片機(jī)的資源配置來(lái)說(shuō)也足夠了。但是前一陣子遇到了一個(gè)問(wèn)題,需要在RAM中存一個(gè)比較大的常數(shù)數(shù)組,但是單單存在RAM中的話,肯定是存不下,考慮到數(shù)組是常數(shù),所以只能存在ROM里,但是當(dāng)時(shí)時(shí)間較短,沒(méi)有研究明白,還得到了非常慘痛的教訓(xùn),覺(jué)得不甘心,打算再花時(shí)間研究了一下。在以后的文章中我會(huì)把我的研究心得記錄下來(lái),希望大家提出意見(jiàn)。
飛思卡爾16位單片機(jī)的資源配置
圖一
圖二
在單片普通模式中,復(fù)位后,所有內(nèi)存資源的映射如圖二所示,其中從0x0000-0x07FF的2K范圍內(nèi)映射為寄存器區(qū),如I/O端口寄存器等,當(dāng)然寄存器沒(méi)有那么多,后面的一部分其實(shí)沒(méi)有使用;
從0x0800-0x0BFF,共1K的空間,映射為EEPROM區(qū),由上面的分析,XS128中共有8頁(yè)的共8K的EEPROM,所以這8頁(yè)的EEPROM都是以分頁(yè)的形式出現(xiàn)的,可以通過(guò)設(shè)置寄存器EPAGE選擇不同的頁(yè)并進(jìn)行訪問(wèn);
從0x0C00到0x0FFF的1K空間為保留區(qū)(其實(shí)這里面也有學(xué)問(wèn),以后探討);
從0x1000到0x3FFF的12K空間為RAM區(qū),分為三頁(yè),但是和前面所說(shuō)的EEPROM不同,這三頁(yè)中有2頁(yè)(對(duì)于XS128和XS256)或一頁(yè)(對(duì)于XS64)為固定頁(yè),位于12K空間的后一部分,以XS128為例,其內(nèi)部的RAM資源為8K,所以其三頁(yè)中的最后兩頁(yè)(0x2000-0x3FFF)為固定頁(yè),第一頁(yè)(0x1000-0x1FFF)為窗口區(qū),通過(guò)設(shè)置寄存器RPAGE來(lái)映射其他分頁(yè)的RAM,當(dāng)然在單片普通模式下,XS128內(nèi)部已經(jīng)沒(méi)有其他的RAM了,所以這一頁(yè)其實(shí)也沒(méi)有用。但是對(duì)于XS256,這一頁(yè)是有用的,因?yàn)樗偣灿?2K的RAM。但是,在單片普通模式下,即沒(méi)有外擴(kuò)RAM的情況下,用戶是不用刻意的去配置RPAGE的,因?yàn)閺?fù)位的時(shí)候,已經(jīng)默認(rèn)指向那一頁(yè)的RAM。
從0x4000-0xFFFF的總共48K的空間為Flash區(qū),分為三頁(yè)。其中第一頁(yè)和第三頁(yè)為固定的Flash頁(yè),中間的一頁(yè)(0x8000-0xBFFF)為窗口區(qū),通過(guò)設(shè)置PPAGE寄存器,可以映射到其他的分頁(yè)Flash。
在最后的一頁(yè)固定的Flash區(qū)域中的最后256字節(jié)中,保存的是中斷向量。
對(duì)于RAM和Flash來(lái)說(shuō),其實(shí)固定頁(yè)和其他的分頁(yè)資源是統(tǒng)一編址的,不同的是固定頁(yè)不可以通過(guò)寄存器(RPAGE、PPAGE)改變映射,而其他的頁(yè)必須通過(guò)寄存器的設(shè)置來(lái)選擇映射不同的頁(yè)。
codewarrior中的prm文件
網(wǎng)上廣泛流傳的一篇文章講述的是8位飛思卡爾單片機(jī)的內(nèi)存映射,這幾天,研究了一下Codewarrior 5.0 prm文件,基于16位單片機(jī)MC9S12XS128,一點(diǎn)心得,和大家分享。有什么錯(cuò)誤請(qǐng)指正。
正文:
關(guān)于Codewarrior 中的 .prm 文件
要討論單片機(jī)的地址映射,就必須要接觸.prm文件,本篇的討論基于 Codewarrior 5.0 編譯器,單片機(jī)采用MC9S12XS128。
通過(guò)項(xiàng)目模板建立的新項(xiàng)目中都有一個(gè)名字為“project.prm”的文件,位于Project Settings->Linker Files文件夾下。一個(gè)標(biāo)準(zhǔn)的基于XS128的.prm文件起始內(nèi)容如下:
.prm文件范例:
NAMES
END
SEGMENTS
RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;
ROM_4000 = READ_ONLY DATA_NEAR IBCC_NEAR 0x4000 TO 0x7FFF;
ROM_C000 = READ_ONLY DATA_NEAR IBCC_NEAR 0xC000 TO 0xFEFF;
//OSVECTORS = READ_ONLY 0xFF10 TO 0xFFFF;
EEPROM_00 = READ_ONLY DATA_FAR IBCC_FAR 0x000800 TO 0x000BFF;
EEPROM_01 = READ_ONLY DATA_FAR IBCC_FAR 0x010800 TO 0x010BFF;
EEPROM_02 = READ_ONLY DATA_FAR IBCC_FAR 0x020800 TO 0x020BFF;
EEPROM_03 = READ_ONLY DATA_FAR IBCC_FAR 0x030800 TO 0x030BFF;
EEPROM_04 = READ_ONLY DATA_FAR IBCC_FAR 0x040800 TO 0x040BFF;
EEPROM_05 = READ_ONLY DATA_FAR IBCC_FAR 0x050800 TO 0x050BFF;
EEPROM_06 = READ_ONLY DATA_FAR IBCC_FAR 0x060800 TO 0x060BFF;
EEPROM_07 = READ_ONLY DATA_FAR IBCC_FAR 0x070800 TO 0x070BFF;
PAGE_F8 = READ_ONLY DATA_FAR IBCC_FAR 0xF88000 TO 0xF8BFFF;
PAGE_F9 = READ_ONLY DATA_FAR IBCC_FAR 0xF98000 TO 0xF9BFFF;
PAGE_FA = READ_ONLY DATA_FAR IBCC_FAR 0xFA8000 TO 0xFABFFF;
PAGE_FB = READ_ONLY DATA_FAR IBCC_FAR 0xFB8000 TO 0xFBBFFF;
PAGE_FC = READ_ONLY DATA_FAR IBCC_FAR 0xFC8000 TO 0xFCBFFF;
PAGE_FE = READ_ONLY DATA_FAR IBCC_FAR 0xFE8000 TO 0xFEBFFF;
END
PLACEMENT
_PRESTART,
STARTUP,
ROM_VAR,
STRINGS,
VIRTUAL_TABLE_SEGMENT,
//.ostext,
DEFAULT_ROM, NON_BANKED,
COPY
要討論單片機(jī)的地址映射,就必須要接觸.prm文件,本篇的討論基于 Codewarrior 5.0 編譯器,單片機(jī)采用MC9S12XS128。
通過(guò)項(xiàng)目模板建立的新項(xiàng)目中都有一個(gè)名字為“project.prm”的文件,位于Project Settings->Linker Files文件夾下。一個(gè)標(biāo)準(zhǔn)的基于XS128的.prm文件起始內(nèi)容如下:
.prm文件范例:
NAMES
END
SEGMENTS
RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;
ROM_4000 = READ_ONLY DATA_NEAR IBCC_NEAR 0x4000 TO 0x7FFF;
ROM_C000 = READ_ONLY DATA_NEAR IBCC_NEAR 0xC000 TO 0xFEFF;
//OSVECTORS = READ_ONLY 0xFF10 TO 0xFFFF;
EEPROM_00 = READ_ONLY DATA_FAR IBCC_FAR 0x000800 TO 0x000BFF;
EEPROM_01 = READ_ONLY DATA_FAR IBCC_FAR 0x010800 TO 0x010BFF;
EEPROM_02 = READ_ONLY DATA_FAR IBCC_FAR 0x020800 TO 0x020BFF;
EEPROM_03 = READ_ONLY DATA_FAR IBCC_FAR 0x030800 TO 0x030BFF;
EEPROM_04 = READ_ONLY DATA_FAR IBCC_FAR 0x040800 TO 0x040BFF;
EEPROM_05 = READ_ONLY DATA_FAR IBCC_FAR 0x050800 TO 0x050BFF;
EEPROM_06 = READ_ONLY DATA_FAR IBCC_FAR 0x060800 TO 0x060BFF;
EEPROM_07 = READ_ONLY DATA_FAR IBCC_FAR 0x070800 TO 0x070BFF;
PAGE_F8 = READ_ONLY DATA_FAR IBCC_FAR 0xF88000 TO 0xF8BFFF;
PAGE_F9 = READ_ONLY DATA_FAR IBCC_FAR 0xF98000 TO 0xF9BFFF;
PAGE_FA = READ_ONLY DATA_FAR IBCC_FAR 0xFA8000 TO 0xFABFFF;
PAGE_FB = READ_ONLY DATA_FAR IBCC_FAR 0xFB8000 TO 0xFBBFFF;
PAGE_FC = READ_ONLY DATA_FAR IBCC_FAR 0xFC8000 TO 0xFCBFFF;
PAGE_FE = READ_ONLY DATA_FAR IBCC_FAR 0xFE8000 TO 0xFEBFFF;
END
PLACEMENT
_PRESTART,
STARTUP,
ROM_VAR,
STRINGS,
VIRTUAL_TABLE_SEGMENT,
//.ostext,
DEFAULT_ROM, NON_BANKED,
COPY
關(guān)鍵詞:
Freescale16位單片機(jī)地址映
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開(kāi)關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開(kāi)發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號(hào)放大器
評(píng)論