單片機片外程序存儲器數據存儲器操作命令
說(shuō)明:單片機片外程序存儲器數據存儲器操作命令與通常所說(shuō)的存儲器不同,和I2C總線(xiàn)的AT24C02不同,SPI協(xié)議的也不同,是指采用專(zhuān)用接口電路,應用P0口P2口地址總線(xiàn)和控制線(xiàn)的“三總線(xiàn)”方式訪(fǎng)問(wèn)的。關(guān)于編程的時(shí)候,和訪(fǎng)問(wèn)內部程序存儲器,數據存儲器不同是:1對外部程序存儲器,和內部一樣,程序不用改。2,.對片外的數據存儲器,匯編要用MOVX DPTR 什么的,我也不懂,C語(yǔ)言相關(guān)的部分比如:變量關(guān)鍵字:pdata xdata 是片外數據存儲器類(lèi)型。輸送的片外數據的寄存器地址也要按實(shí)際輸送,其他沒(méi)什么區別。沒(méi)有說(shuō)要特意操作特殊寄存器。.
本文引用地址:http://dyxdggzs.com/article/170913.htm在設計片外程序存儲器之前,首先要決定EA引腳的電平。
EA=0,單片機只訪(fǎng)問(wèn)外部程序存儲器,對于8031單片機此引腳必須接地.EA=1,單片機訪(fǎng)問(wèn)內部程序存儲器,對于內部有程序存儲器的8XX51單片機,此引腳應接高電平,但若地址值超過(guò)4KB范圍,單片機將自動(dòng)訪(fǎng)問(wèn)外部程序存儲器。
設定好EA后,單片機自動(dòng)按程序所設定的次序執行。
在編程中不需要專(zhuān)門(mén)的語(yǔ)句指定調用的是外部程序存儲器。比如設定EA接高電平,則程序在執行完片內的程序存儲器指令后自動(dòng)轉入片外程序存儲器,而無(wú)需特殊命令。這就是所謂的程序存儲器是片內外統一編址,而數據存儲器則用Mov和Movx分別對待的。
但樓主要知道程序在讀取片外指令代碼時(shí)的過(guò)程:先尋址,再取數。單片機會(huì )根據PC的值先給P2和p0送一個(gè)選通地址(PC的值),接下來(lái)從片外程序存儲器讀取代碼。因為PC的值一般是連續的,這就要求片外的程序存儲器空間要連續分布,這和數據存儲器不同。如果不連續分布,就要用特殊的行號改變PC的值,使它和片外程序存儲器分布能夠對應
總之,記住三總線(xiàn)傳遞的方式,先尋址,再傳數,由控制總線(xiàn)控制
存儲器一般都有WR,RD,CS線(xiàn)以及地址端口、數據端口,有些數據地址端口復用,有些分開(kāi)??催@些存儲器的datasheet就會(huì )明白如何訪(fǎng)問(wèn)他們內部的數據。例如讀出外部ram地址為0x0001里的數據(假設有這個(gè)地址),那么就WR置高,CS置低,地址線(xiàn)上輸出0x0001,那么CPU的數據線(xiàn)就可以等到需要的數據了,這種情況下CPU的I/O只是做普通的I/O口。但是一般單片機和ARM都能夠把I/O選擇作為外部存儲器的訪(fǎng)問(wèn)口,這時(shí)只要根據datasheet里的說(shuō)明,把相應的線(xiàn)連上,CPU就能夠根據你的指令自動(dòng)在時(shí)序上配合,使得訪(fǎng)問(wèn)外部設備就像訪(fǎng)問(wèn)內部ram一樣,這樣做的好處就是節省CPU時(shí)間。
把地址0x0001置為0x55的C語(yǔ)言指令為
(*(unsigned char*)0x0001)=0x55; //(這里假設數據寬度為8bit)
假如I/O口選擇的功能是外部數據地址總線(xiàn),并且硬件上接好,那么這條指令也就是對外部存儲器相應地址的讀寫(xiě)。
值得一提的是,各種類(lèi)型的存儲器件的訪(fǎng)問(wèn)速度都不一樣,因此如果把程序放在外部器件里執行,執行時(shí)間就會(huì )有比較大的差別,例如一個(gè)for循環(huán)放在外部ram和外部flash中執行速度可能會(huì )差到3倍。
第一,單片機采用三總線(xiàn)結構傳遞數據。地址總線(xiàn)、數據總線(xiàn)、控制總線(xiàn)。傳遞數據的過(guò)程是先尋址,再傳遞數據。即先送一個(gè)地址信息(由單片機向總線(xiàn)寫(xiě)地址信息),由寄存器(程序存儲器或數據存儲器)根據這個(gè)地址,把微處理器要讀取的數據寫(xiě)到總線(xiàn)上,微處理器再讀取這個(gè)數據。整個(gè)過(guò)程由控制總線(xiàn)控制。所以每次讀的數據是針對那個(gè)地址對應的寄存器操作的,不會(huì )發(fā)生混亂。寫(xiě)數據時(shí)一樣,先尋址,再寫(xiě)數據,數據就寫(xiě)入剛才尋址時(shí)的地址對應的那個(gè)寄存器里去了。
第二、程序存儲器、數據存儲器有不同的選通信號,在一個(gè)指令周期里,是不同的時(shí)間選通的,所以不會(huì )混亂。
第三、選通的引腳不同。拿片外數據存儲器來(lái)說(shuō),是P3的第6和第7引腳做選通信號,程序存儲器是PSEN做選通信號,他們接在各自器件的選通引腳上,所以不會(huì )混亂。
第四,指令不同。拿匯編指令來(lái)說(shuō)。MOV是程序存儲器傳遞數據用,MOVX是數據存儲器傳遞數據用(對片外而言)。
總之,記住三總線(xiàn)傳遞的方式,先尋址,再傳數,由控制總線(xiàn)控制,這個(gè)模式,你就容易理解這個(gè)了。
單片機的p2和p0分別傳遞地址的高八位和低八位。同時(shí)p0還傳遞數據。在時(shí)序信號的ALE高電平期間,鎖定地址信息。/PSEN是選通程序存儲器的。在/PSEN低電平期間是向程序存儲器傳遞程序代碼,/WR和/RD是選通數據存儲器的,即在/WR和/RD低電平期間把數據傳遞給數據寄存器。而/PSEN和/WR及/RD是在不同時(shí)間變?yōu)榈碗娖降?,沒(méi)有重疊的部分。也就是說(shuō),當/WR及/RD變成低電平時(shí),/PSEN已經(jīng)恢復高電平了,由P0口傳出的數據信息當然只會(huì )傳到數據存儲器里,因為程序存儲器已經(jīng)不再處于選通狀態(tài)了!從表面看,都是從p0口傳出的,但因為選通器件的時(shí)間不同而不會(huì )發(fā)生混亂。當然我說(shuō)的是片外程序存儲器和數據存儲器的的情況,其實(shí)對片內也一樣,還是三總線(xiàn)的這種控制方式,使它們在不同的時(shí)間被選通,而不至于發(fā)生沖突。
看看單片機的一個(gè)電路圖。你會(huì )發(fā)現p0既跟74LS373連,又跟8155或8255或鍵盤(pán)或數模轉換器等連接。而8155或8255或鍵盤(pán)或數模轉換器等對單片機而言是當做數據存儲器處理的。74LS373連的多半是程序存儲器。那么p0送出的信號不是兩者都接受了嗎?注意看ALE接74LS373的G接口,鎖存地址用,PSEN有時(shí)用有時(shí)不用。WR和RD接數據存儲器的選通接口。因為WR和RD跟ALE的信號在時(shí)間上沒(méi)有重疊部分,所以p0的信號不會(huì )被程序存儲器和數據存儲器同時(shí)收到。這是一個(gè)舉例說(shuō)明,具體情況要具體分析。
存儲器相關(guān)文章:存儲器原理
評論