<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 單片機片外程序存儲器數(shù)據(jù)存儲器操作命令

          單片機片外程序存儲器數(shù)據(jù)存儲器操作命令

          作者: 時間:2012-09-05 來源:網(wǎng)絡 收藏

          說明:片外與通常所說的不同,和I2C總線的AT24C02不同,SPI協(xié)議的也不同,是指采用專用接口電路,應用P0口P2口地址總線和控制線的“三總線”方式訪問的。關于編程的時候,和訪問內部存儲器,存儲器不同是:1對外部存儲器,和內部一樣,程序不用改。2,.對片外的存儲器,匯編要用MOVX DPTR 什么的,我也不懂,C語言相關的部分比如:變量關鍵字:pdata xdata 是片外數(shù)據(jù)存儲器類型。輸送的片外數(shù)據(jù)的寄存器地址也要按實際輸送,其他沒什么區(qū)別。沒有說要特意特殊寄存器。.

          本文引用地址:http://www.ex-cimer.com/article/170913.htm

          在設計片外程序存儲器之前,首先要決定EA引腳的電平。

          EA=0,只訪問外部程序存儲器,對于8031此引腳必須接地.EA=1,單片機訪問內部程序存儲器,對于內部有程序存儲器的8XX51單片機,此引腳應接高電平,但若地址值超過4KB范圍,單片機將自動訪問外部程序存儲器。

          設定好EA后,單片機自動按程序所設定的次序執(zhí)行。

          在編程中不需要專門的語句指定調用的是外部程序存儲器。比如設定EA接高電平,則程序在執(zhí)行完片內的程序存儲器指令后自動轉入片外程序存儲器,而無需特殊。這就是所謂的程序存儲器是片內外統(tǒng)一編址,而數(shù)據(jù)存儲器則用Mov和Movx分別對待的。

          但樓主要知道程序在讀取片外指令代碼時的過程:先尋址,再取數(shù)。單片機會根據(jù)PC的值先給P2和p0送一個選通地址(PC的值),接下來從片外程序存儲器讀取代碼。因為PC的值一般是連續(xù)的,這就要求片外的程序存儲器空間要連續(xù)分布,這和數(shù)據(jù)存儲器不同。如果不連續(xù)分布,就要用特殊的行號改變PC的值,使它和片外程序存儲器分布能夠對應

          總之,記住三總線傳遞的方式,先尋址,再傳數(shù),由控制總線控制

          存儲器一般都有WR,RD,CS線以及地址端口、數(shù)據(jù)端口,有些數(shù)據(jù)地址端口復用,有些分開。看這些存儲器的datasheet就會明白如何訪問他們內部的數(shù)據(jù)。例如讀出外部ram地址為0x0001里的數(shù)據(jù)(假設有這個地址),那么就WR置高,CS置低,地址線上輸出0x0001,那么CPU的數(shù)據(jù)線就可以等到需要的數(shù)據(jù)了,這種情況下CPU的I/O只是做普通的I/O口。但是一般單片機和ARM都能夠把I/O選擇作為外部存儲器的訪問口,這時只要根據(jù)datasheet里的說明,把相應的線連上,CPU就能夠根據(jù)你的指令自動在時序上配合,使得訪問外部設備就像訪問內部ram一樣,這樣做的好處就是節(jié)省CPU時間。

          把地址0x0001置為0x55的C語言指令為

          (*(unsigned char*)0x0001)=0x55; //(這里假設數(shù)據(jù)寬度為8bit)

          假如I/O口選擇的功能是外部數(shù)據(jù)地址總線,并且硬件上接好,那么這條指令也就是對外部存儲器相應地址的讀寫。

          值得一提的是,各種類型的存儲器件的訪問速度都不一樣,因此如果把程序放在外部器件里執(zhí)行,執(zhí)行時間就會有比較大的差別,例如一個for循環(huán)放在外部ram和外部flash中執(zhí)行速度可能會差到3倍。

          第一,單片機采用三總線結構傳遞數(shù)據(jù)。地址總線、數(shù)據(jù)總線、控制總線。傳遞數(shù)據(jù)的過程是先尋址,再傳遞數(shù)據(jù)。即先送一個地址信息(由單片機向總線寫地址信息),由寄存器(程序存儲器或數(shù)據(jù)存儲器)根據(jù)這個地址,把微處理器要讀取的數(shù)據(jù)寫到總線上,微處理器再讀取這個數(shù)據(jù)。整個過程由控制總線控制。所以每次讀的數(shù)據(jù)是針對那個地址對應的寄存器的,不會發(fā)生混亂。寫數(shù)據(jù)時一樣,先尋址,再寫數(shù)據(jù),數(shù)據(jù)就寫入剛才尋址時的地址對應的那個寄存器里去了。

          第二、程序存儲器、數(shù)據(jù)存儲器有不同的選通信號,在一個指令周期里,是不同的時間選通的,所以不會混亂。

          第三、選通的引腳不同。拿片外數(shù)據(jù)存儲器來說,是P3的第6和第7引腳做選通信號,程序存儲器是PSEN做選通信號,他們接在各自器件的選通引腳上,所以不會混亂。

          第四,指令不同。拿匯編指令來說。MOV是程序存儲器傳遞數(shù)據(jù)用,MOVX是數(shù)據(jù)存儲器傳遞數(shù)據(jù)用(對片外而言)。

          總之,記住三總線傳遞的方式,先尋址,再傳數(shù),由控制總線控制,這個模式,你就容易理解這個了。

          單片機的p2和p0分別傳遞地址的高八位和低八位。同時p0還傳遞數(shù)據(jù)。在時序信號的ALE高電平期間,鎖定地址信息。/PSEN是選通程序存儲器的。在/PSEN低電平期間是向程序存儲器傳遞程序代碼,/WR和/RD是選通數(shù)據(jù)存儲器的,即在/WR和/RD低電平期間把數(shù)據(jù)傳遞給數(shù)據(jù)寄存器。而/PSEN和/WR及/RD是在不同時間變?yōu)榈碗娖降模瑳]有重疊的部分。也就是說,當/WR及/RD變成低電平時,/PSEN已經(jīng)恢復高電平了,由P0口傳出的數(shù)據(jù)信息當然只會傳到數(shù)據(jù)存儲器里,因為程序存儲器已經(jīng)不再處于選通狀態(tài)了!從表面看,都是從p0口傳出的,但因為選通器件的時間不同而不會發(fā)生混亂。當然我說的是片外程序存儲器和數(shù)據(jù)存儲器的的情況,其實對片內也一樣,還是三總線的這種控制方式,使它們在不同的時間被選通,而不至于發(fā)生沖突。

          看看單片機的一個電路圖。你會發(fā)現(xiàn)p0既跟74LS373連,又跟8155或8255或鍵盤或數(shù)模轉換器等連接。而8155或8255或鍵盤或數(shù)模轉換器等對單片機而言是當做數(shù)據(jù)存儲器處理的。74LS373連的多半是程序存儲器。那么p0送出的信號不是兩者都接受了嗎?注意看ALE接74LS373的G接口,鎖存地址用,PSEN有時用有時不用。WR和RD接數(shù)據(jù)存儲器的選通接口。因為WR和RD跟ALE的信號在時間上沒有重疊部分,所以p0的信號不會被程序存儲器和數(shù)據(jù)存儲器同時收到。這是一個舉例說明,具體情況要具體分析。

          存儲器相關文章:存儲器原理




          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();