新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > C51,RAM 用C51操作片內擴展RAM

        C51,RAM 用C51操作片內擴展RAM

        作者: 時間:2016-11-25 來源:網絡 收藏
        很多工程師都遇到過的“怪現象”
        標準80C51、52內核的單片機片內最多只有256字節的RAM,少得可憐,很多情況下會出現不夠用的問題。如果在片外擴展RAM,則會增加成本,并可能減少多達18條I/O口線。現在許多新型8051內核的單片機為了解決上述問題,會在片內另外擴展有一定容量的RAM,一般安排在XDATA地址空間。Philips半導體的P89C668更是在片內擴展有8KB的XRAM,與其它型號相比,堪稱“海量”。為了保持與標準80C51的兼容性,一般這些擴展的片內RAM在復位時默認是無效的,如果要使用,則需要先修改相關SFR寄存器里的使能位(但也有少數型號的規定與此恰恰相反,復位時默認是有效的,如果片外已經擴展有XRAM,則地址重疊的部分會被自動屏蔽掉)。
        如果使用匯編語言編程,在程序一開始,可以立即使能片內擴展RAM,以后用MOVX指令就能方便地訪問。如果用C51編程,許多用戶很自然地也在main()函數的一開始就使能片內擴展RAM。然而在調試程序時總是出現意外情況,仔細排查后,“確認”是片內外部RAM有問題,通常表現為數據沒有被初始化。部分客戶還會去找供應商算帳,稱芯片質量存在嚴重問題,等等??梢哉f,這是我們許多單片機工程師都曾經遇到過的問題。
        總之,你用C51編程并打算使用片內擴展的RAM,那么就很容易出現上述怪現象。是芯片有問題嗎?不是!同樣功能的程序如果換作匯編來寫,就跑通了,這就證明芯片還是好的——找供應商算帳無理!是C51編譯器有問題嗎?更不是!C51編譯器是經過多年千錘百煉才發展到今天“完善”的程度,想找出并證實一個bug還真不容易。“是我的程序錯了嗎?程序很小,僅10幾行,專門測試片內擴展RAM用的,已經過反復核查,怎么會出錯呢?”——很多工程師對我這樣講,但我還是要告訴他:確實是程序有問題!
        我們先不提程序錯在何處,因為部分工程師性子太急,我先給出解決方案,行不行,先試試看:請刪除main()函數里使能片內擴展RAM的語句;重新建立工程,選擇器件后,Keil C51會提示是否復制并添加startup code到工程里,此時一定要選擇“是”;將你的相關C源程序添加進工程;打開剛才添加的Startup.A51文件,找到標號“STARTUP1:”,緊接其后添加使能片內擴展RAM的匯編指令;重新編譯工程并調試。OK,問題解決了嗎?
        咦——這是為什么?原因是這樣的:如果你用到了片內擴展RAM,定義有xdata屬性的全局變量(或在main()函數的開頭定義有),而且定義的同時賦有初值,那么變量的初始化操作實際上在進入main()函數之前(或剛進入main函數時,不可控)就已經完成了。因此在main()函數里,第一條可執行語句就安排為使能片內擴展RAM的操作已是來不及!這就是C51編譯器的特性,同時也是其它C編譯器所共有的、ANSI C所要求的。文件Startup.A51是啟動代碼部分,里面包含有初始化全局變量的操作。新建工程時,如果不添加此文件,則在編譯時系統也會自動插入安裝目錄中的那個Startup.A51文件。如果在main()函數里的開頭定義有xdata屬性的變量并賦初值,則執行時剛一進入main()該變量就被初始化,然后才輪到正常的可執行語句?,F在知道在main()中添加使能片內擴展RAM的操作語句為什么不行了嗎?
        答 1:
        一句話概括:在使能片內擴展RAM之前對XRAM進行的任何操作都無效因此,相關使能片內擴展RAM的指令必須位于全局變量初始化操作之前。
        關于STC單片機內部擴展ram的使用
        高128字節(地址:80H~FFH),只可間接尋址;
        STC89系列單片機另外增加了768字節的片內擴展RAM,以解決眾多技術人員在編程時的RAM資源嚴重缺乏的問題。
        768字節的片內擴展RAM(地址:000H~2FFH)與外部擴展RAM地址重疊,單片機可通過軟件設置AUXR.1,決定是否使用片內擴展RAM,以防止可
        能的與外部擴展RAM的沖突,默認為使用片內擴展RAM。
        片內擴展RAM的訪問采用間接尋址,可通過
        ①、MOVX A,@DPTR 或 MOVX @DPTR ,A 指令訪問片內擴展RAM(00H~2FFH,共768字節);
        ②、MOVX A,@Ri 或 MOVX @Ri,A 指令訪問片內擴展RAM(00H~FFH,共256字節)。
        當DPTR≥300H時,系統訪問外部擴展RAM。
        注意:在使用第二種指令時,特別要注意是使用MOV還是MOVX,MOV訪問的是片內RAM,MOVX訪問的是片內擴展RAM,剛剛接觸此類單片機的技
        術人員最容易在這里犯錯誤。


        關鍵詞: C51RAM片內擴

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宜兰市| 米林县| 阜阳市| 博客| 莱西市| 江阴市| 名山县| 云安县| 故城县| 沙田区| 抚州市| 澄江县| 赤峰市| 禹城市| 青河县| 屯留县| 兴文县| 塔城市| 天津市| 清徐县| 图木舒克市| 图们市| 宜兴市| 广德县| 土默特右旗| 翁源县| 绵竹市| 原阳县| 夏津县| 新巴尔虎右旗| 金坛市| 循化| 铜川市| 揭西县| 仪陇县| 苍南县| 纳雍县| 镇沅| 临城县| 汶上县| 台北市|