<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 單片機page和bank切換問(wèn)題

單片機page和bank切換問(wèn)題

作者: 時(shí)間:2016-11-17 來(lái)源:網(wǎng)絡(luò ) 收藏
(1) 切換bank 問(wèn)題

458一共有兩個(gè)bank,每個(gè)都是由20-3f 。

本文引用地址:http://dyxdggzs.com/article/201611/315474.htm

如果需要切換bank來(lái)用的話(huà),則需要改變操作寄存器 R4的第6和第7位來(lái)實(shí)現。我定義一個(gè)宏來(lái)處理:

;-----------------------macro defination---------------------

bank0 macro

bc 0x04,6

bc 0x04,7

endm

;------------------------

bank1 macro

bs 0x04,6

bc 0x04,7

endm

這里就定義了兩個(gè)宏,分別是 bank0,bank1,用的時(shí)候直接用就可以。而這里想說(shuō)說(shuō)程序開(kāi)始初始化的時(shí)候清bank的程序,相對于156是需要改程序的,反而這個(gè)跟 468非常相似,倒是可以直接跟 468通用了(468相應修改成4個(gè)bank就可以了。),簡(jiǎn)單用了一下二重循環(huán)搞定。

程序清單:

;----------------------clear rams of all banks----------------------

clear_all_ram:

mov a,@0x10

mov r4,a

bank0

call clr_ram

bank1

call clr_ram

ret

clr_ram:

clr r0

inc r4

mov a,@0x3f

and a,r4

jbs psw,z

jmp clr_ram

mov a,@0x10

mov r4,a

ret

這里的

and a,r4

jbs psw,z

不能換成 xor ,因為xor會(huì )受R4最高兩位選擇bank位的影響。

(2) 切換 page 問(wèn)題

實(shí)際用的話(huà)是在是太簡(jiǎn)單了,所以這里著(zhù)重分析原理。

首先R2是PC和堆棧,都是12位寬。 不要和程序代碼的13位寬度搞反了。參看datasheet的第7頁(yè)的內容:

這個(gè)就是PC的結構,一個(gè)page一共就是1K字節(1024字節),也就是210 ,顯然需要用到 A0-A9 一共10個(gè)位來(lái)尋址。A11和A10是用來(lái)切換Page的。Call和jmp 指令(也只有這兩個(gè)指令是需要切換page的了。),有個(gè)共同點(diǎn),操作的時(shí)候的步驟:都是將R2低10位的值載入,這樣可以訪(fǎng)問(wèn) 210 個(gè)地址,也就是1個(gè)page的程序頁(yè),不切page的話(huà)他們都可以訪(fǎng)問(wèn)整個(gè)程序頁(yè)。Jmp是直接跳轉,不用考慮返回問(wèn)題,所以這個(gè)屬于比較簡(jiǎn)單的,只需要

page1

jmp process

這樣就可以跳到其他頁(yè)面了,之后PC指針也在后來(lái)的頁(yè)面工作。這個(gè)比較簡(jiǎn)單,pass掉吧。

Call是需要考慮程序調用后的返回的問(wèn)題。

首先跟jmp一樣,先將PC+1壓入堆棧,然后裝載低10位的地址,然后根據10和11位來(lái)決定在哪個(gè)頁(yè)面工作

page0

……..

page1

call subprogram

這樣就調用了page1的子程序了。當子程序結束,執行ret返回的時(shí)候,由于堆棧和PC都是12位的,所以PC出棧的時(shí)候能直接恢復,這個(gè)時(shí)候的PC指針是正常的,也就是之前壓入堆棧的PC+1值了。但是有個(gè)問(wèn)題,雖然PC值正常,但是實(shí)際上 R3里面的5,6位的PS0和PS1位是并沒(méi)有改變的,這樣有個(gè)隱患,如果不執行 jmp 的話(huà)那是正常的沒(méi)有問(wèn)題,但是一旦執行了jmp,PC的10和11位會(huì )自動(dòng)裝載 R3 的PS0,PS1位,變成了上次執行call的時(shí)候切換的那個(gè)頁(yè)面了。程序跑飛。如果這個(gè)時(shí)候想執行同一個(gè)page的子程序,沒(méi)有切換page的指令,那么call指令同樣會(huì )出錯。所以對于call指令應該是:

page0

………..

page1

call subprogram

page0

調用完子程序之后記得切換回原來(lái)的Page

關(guān)于中斷

中斷發(fā)生的時(shí)候是將這個(gè)PC壓入堆棧,盡管PC指針已經(jīng)跳到0x08的中斷入口處,但是R3的PS0和PS1位并沒(méi)有被改變,所以,如果在中斷服務(wù)程序中,不執行call和jmp指令就沒(méi)有關(guān)系,一旦執行就會(huì )出錯。所以需要進(jìn)行一次切換Page的動(dòng)作的,切換回page0就可以了,這樣可以保證jmp的時(shí)候是在中斷服務(wù)程序的范圍之內跳。退出中斷之前是恢復了R3的值的,所以是不需要在結尾切換page了。

雖然說(shuō)能切換,但是基本上個(gè)人不是很建議多次來(lái)回的切換,盡量將比較整體的部分寫(xiě)在同一個(gè)page,這樣可以減少出錯的機會(huì )。



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>