新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機上電清空RAM區

        單片機上電清空RAM區

        作者: 時間:2016-11-17 來源:網絡 收藏
        上電后清空RAM是必須要做的,由于上電后RAM中的數據處于不確定的狀態,會給單片機的運算或者條件判斷帶來影響,所以是必須必須清空的。清空做的操作也不難,做成子程序后,在程序的開始調用一下就完事了,挺方便。下面分別是 EM78P156 , EM78P259/260 ,EM78P468 等有不同RAM數的單片機的清RAM操作。

        本文引用地址:http://www.104case.com/article/201611/315481.htm

        編程的基本思想,根據白皮書(ELAN的官方說明書,咱們習慣的叫法)R0是間接尋址,R4是RAM選擇,根據這兩個的組合就可以完成操作。具體操作和說明可以參考白皮書。

        hint: 根據我的理解,這里其實可以很簡單的,只需要知道,R4放的是寄存器的地址,R0是放對應的那個寄存器的數據,就OK了,例如

        MOV A,@0X10

        MOV R4,A

        MOV A,@0X11

        MOV R0,A

        根據hint里面說的,R4放地址,看前兩句,將 0x10移入R4,對了,表示地址,表示 0x10號寄存器,而后面將0x11移入R0,這個就是數據,放在什么地方?就是放在當前R4指向的寄存器里面,也就是說 0x10地址放的數據是 0x 11,可能開始看有點抽象,不過相信我,那是很簡單的東西。

        下面的程序都是按照這種思想來做的 EM78P156 的RAM從 0x10 ~ 0x3f ,如果153的話只有 0x2f,修改一下就行了,而259/260 468 的RAM比較多,ELAN 是以bank來處理的,也就是分頁處理,所以在清空的時候切換一下bank就可以了,關于bank的操作,看白皮書,說到低就是對R4最高兩位的操作而已。

        有問題的話歡迎回帖子,或者發我郵件 etual@163.com

        當然如果有更好的思想,或者我的程序里面犯錯誤的話,非常歡迎大家指出,大家共同討論,共同學習和進步,在下不吝賜教。

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

        ; 適用于 em78p156 & 153

        ; 如果Em78P153S 將 0x3f 改成 0x2f就可以了

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

        clear_all_ram:

        mov a,@0x10 ; 開始地址

        mov r4,a

        clr_ram:

        clr r0 ; 清空內容

        inc r4 ; 地址加1

        mov a,@0x3f ; 是否達到最大的地址 ,bank最大為0x3f

        and a,r4

        jbs psw,z

        jmp clr_ram ; 是的話推出,不是的話繼續循環

        ret

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

        ; 適用于 em78p259/260 等只有2個bank的mcu

        ; 先做一下宏定義,不同的mcu宏定義可能不同,注意修改一下

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

        ;-------------------------macro definition--------------------------

        bank0 macro

        bc 0x04,6 ; R4 的第六位決定是bank0 還是bank1

        endm

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

        bank1 macro

        bs 0x04,6

        endm

        ;----------------------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

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

        ; 適用于 em78p468 4個bank , 而且本身有bank指令不用宏定義

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

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

        clear_all_ram:

        mov a,@0x10

        mov r4,a

        bank 0

        call clr_ram

        bank 1

        call clr_ram

        bank 2

        call clr_ram

        bank 3

        call clr_ram

        jmp clr_ram_end

        clr_ram:

        clr r0

        inc r4

        mov a,@0x3f

        and a,r4

        jbs psw,z

        jmp clr_ram

        mov a,@0x10

        mov r4,a

        clr_ram_end:

        ret



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 临安市| 台北市| 肃北| 宁国市| 博野县| 井研县| 克拉玛依市| 江川县| 河西区| 文水县| 霍山县| 应用必备| 平和县| 青浦区| 明光市| 洪湖市| 青阳县| 阳曲县| 贺兰县| 称多县| 延边| 邹平县| 文化| 井研县| 东丰县| 盐源县| 景德镇市| 云霄县| 南充市| 博野县| 建德市| 开江县| 子长县| 吉林省| 德清县| 宜阳县| 当阳市| 鄱阳县| 怀宁县| 扬中市| 大丰市|