新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Freescale 16位單片機的地址映射

        Freescale 16位單片機的地址映射

        作者: 時間:2016-11-28 來源:網絡 收藏
        前言:
        原來一直不太明白單片機的地址映射,也沒有仔細的研究過,我想這就是我不是牛人的原因吧。通常開始學單片機,都是寫一些比較小的程序,如果不做項目開發之類的,以飛思卡爾16位單片機的資源配置來說也足夠了。但是前一陣子遇到了一個問題,需要在RAM中存一個比較大的常數數組,但是單單存在RAM中的話,肯定是存不下,考慮到數組是常數,所以只能存在ROM里,但是當時時間較短,沒有研究明白,還得到了非常慘痛的教訓,覺得不甘心,打算再花時間研究了一下。在以后的文章中我會把我的研究心得記錄下來,希望大家提出意見。

        飛思卡爾16位單片機的資源配置
        以MC9S12XS128MAL為例,其實DG128之類的類似。如圖一,128代表的是單片機中的FLASH大小為128K Byte,同理64代表的是單片機中的FLASH大小為64 K Byte,256代表的是單片機中的FLASH大小為256 K Byte。但是S12(X)所使用的內核CPU12(X)的地址總線為16位,尋址范圍最大為2^16 =64K Byte,而這64K Byte的尋址空間還包括寄存器、EEPROM(利用Data Flash模擬)、RAM等,因此不是所有的64K Byte都是用來尋址FLASH。所以在S12(X)系列單片機中,很多資源是以分頁的形式出現的,其中包括EEPROM、RAM、FLASH。EEPROM的每頁大小為1K Byte,RAM的每頁大小為4K Byte,FLASH的每頁大小為16K Byte。因此XS128中EEPROM的頁數為8K/1K = 8頁,RAM的頁數為8K/4K = 2頁,Flash的頁數為128K/16K = 8頁。

        圖一

        圖二
        在單片普通模式中,復位后,所有內存資源的映射如圖二所示,其中從0x0000-0x07FF的2K范圍內映射為寄存器區,如I/O端口寄存器等,當然寄存器沒有那么多,后面的一部分其實沒有使用;
        從0x0800-0x0BFF,共1K的空間,映射為EEPROM區,由上面的分析,XS128中共有8頁的共8K的EEPROM,所以這8頁的EEPROM都是以分頁的形式出現的,可以通過設置寄存器EPAGE選擇不同的頁并進行訪問;
        從0x0C00到0x0FFF的1K空間為保留區(其實這里面也有學問,以后探討);
        從0x1000到0x3FFF的12K空間為RAM區,分為三頁,但是和前面所說的EEPROM不同,這三頁中有2頁(對于XS128和XS256)或一頁(對于XS64)為固定頁,位于12K空間的后一部分,以XS128為例,其內部的RAM資源為8K,所以其三頁中的最后兩頁(0x2000-0x3FFF)為固定頁,第一頁(0x1000-0x1FFF)為窗口區,通過設置寄存器RPAGE來映射其他分頁的RAM,當然在單片普通模式下,XS128內部已經沒有其他的RAM了,所以這一頁其實也沒有用。但是對于XS256,這一頁是有用的,因為它總共有12K的RAM。但是,在單片普通模式下,即沒有外擴RAM的情況下,用戶是不用刻意的去配置RPAGE的,因為復位的時候,已經默認指向那一頁的RAM。
        從0x4000-0xFFFF的總共48K的空間為Flash區,分為三頁。其中第一頁和第三頁為固定的Flash頁,中間的一頁(0x8000-0xBFFF)為窗口區,通過設置PPAGE寄存器,可以映射到其他的分頁Flash。
        在最后的一頁固定的Flash區域中的最后256字節中,保存的是中斷向量。

        對于RAM和Flash來說,其實固定頁和其他的分頁資源是統一編址的,不同的是固定頁不可以通過寄存器(RPAGE、PPAGE)改變映射,而其他的頁必須通過寄存器的設置來選擇映射不同的頁。

        codewarrior中的prm文件
        網上廣泛流傳的一篇文章講述的是8位飛思卡爾單片機的內存映射,這幾天,研究了一下Codewarrior 5.0 prm文件,基于16位單片機MC9S12XS128,一點心得,和大家分享。有什么錯誤請指正。
        正文:
        關于Codewarrior 中的 .prm 文件

        要討論單片機的地址映射,就必須要接觸.prm文件,本篇的討論基于 Codewarrior 5.0 編譯器,單片機采用MC9S12XS128。
        通過項目模板建立的新項目中都有一個名字為“project.prm”的文件,位于Project Settings->Linker Files文件夾下。一個標準的基于XS128的.prm文件起始內容如下:

        .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

        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 大悟县| 额敏县| 黎川县| 青阳县| 湘潭市| 忻州市| 中方县| 苏尼特右旗| 二手房| 太仆寺旗| 江华| 治多县| 精河县| 黄大仙区| 鄂托克旗| 河间市| 图木舒克市| 平谷区| 容城县| 东乌| 阿拉尔市| 班戈县| 上犹县| 黎城县| 吴桥县| 叙永县| 海安县| 瑞丽市| 芷江| 临湘市| 卓尼县| 蕲春县| 五家渠市| 安义县| 三原县| 营口市| 伊春市| 监利县| 三亚市| 文水县| 汾西县|