新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 存儲器的操作

        存儲器的操作

        作者: 時間:2016-11-21 來源:網絡 收藏
        @*************************************************************************

        @ File:head.S
        @ 功能:設置SDRAM,將程序復制到SDRAM,然后跳到SDRAM繼續執行
        @*************************************************************************

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

        .equ MEM_CTL_BASE, 0x48000000
        .equ SDRAM_BASE, 0x30000000

        .text
        .global _start
        _start:
        bl disable_watch_dog @ 關閉WATCHDOG,否則CPU會不斷重啟
        bl memsetup @ 設置存儲控制器
        bl copy_steppingstone_to_sdram @ 復制代碼到SDRAM中
        ldr pc, =on_sdram @ 跳到SDRAM中繼續執行
        on_sdram:
        ldr sp, =0x34000000 @ 設置堆棧
        bl main
        halt_loop:
        b halt_loop

        disable_watch_dog:
        @ 往WATCHDOG寄存器寫0即可
        mov r1, #0x53000000
        mov r2, #0x0
        str r2, [r1]
        mov pc, lr @ 返回

        copy_steppingstone_to_sdram:
        @ 將Steppingstone的4K數據全部復制到SDRAM中去
        @ Steppingstone起始地址為0x00000000,SDRAM中起始地址為0x30000000

        mov r1, #0
        ldr r2, =SDRAM_BASE
        mov r3, #4*1024
        1:
        ldr r4, [r1],#4 @ 從Steppingstone讀取4字節的數據,并讓源地址加4
        str r4, [r2],#4 @ 將此4字節的數據復制到SDRAM中,并讓目地地址加4
        cmp r1, r3 @ 判斷是否完成:源地址等于Steppingstone的未地址?
        bne 1b @ 若沒有復制完,繼續
        mov pc, lr @ 返回

        memsetup:
        @ 設置存儲控制器以便使用SDRAM等外設

        mov r1, #MEM_CTL_BASE @ 存儲控制器的13個寄存器的開始地址
        adrl r2, mem_cfg_val @ 這13個值的起始存儲地址
        add r3, r1, #52 @ 13*4 = 54
        1:
        ldr r4, [r2], #4 @ 讀取設置值,并讓r2加4
        str r4, [r1], #4 @ 將此值寫入寄存器,并讓r1加4
        cmp r1, r3 @ 判斷是否設置完所有13個寄存器
        bne 1b @ 若沒有寫成,繼續
        mov pc, lr @ 返回


        .align 4
        mem_cfg_val:
        @ 存儲控制器13個寄存器的設置值
        .long 0x22011110 @ BWSCON
        .long 0x00000700 @ BANKCON0
        .long 0x00000700 @ BANKCON1
        .long 0x00000700 @ BANKCON2
        .long 0x00000700 @ BANKCON3
        .long 0x00000700 @ BANKCON4
        .long 0x00000700 @ BANKCON5
        .long 0x00018005 @ BANKCON6
        .long 0x00018005 @ BANKCON7
        .long 0x008C07A3 @ REFRESH
        .long 0x000000B1 @ BANKSIZE
        .long 0x00000030 @ MRSRB6
        .long 0x00000030 @ MRSRB7

        #defineGPBCON(*(volatile unsigned long *)0x56000010)
        #defineGPBDAT(*(volatile unsigned long *)0x56000014)

        #defineGPB5_out(1<<(5*2))
        #defineGPB6_out(1<<(6*2))
        #defineGPB7_out(1<<(7*2))
        #defineGPB8_out(1<<(8*2))

        void wait(unsigned long dly)
        {
        for(; dly > 0; dly--);
        }

        int main(void)
        {
        unsigned long i = 0;

        GPBCON = GPB5_out|GPB6_out|GPB7_out|GPB8_out;// 將LED1-4對應的GPB5/6/7/8四個引腳設為輸出

        while(1){
        wait(30000);
        GPBDAT = (~(i<<5)); // 根據i的值,點亮LED1-4
        if(++i == 16)
        i = 0;
        }

        return 0;
        }




        關鍵詞: 存儲器SDRA

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 瓮安县| 梅河口市| 阿图什市| 西峡县| 永丰县| 南汇区| 汉源县| 托克托县| 马边| 阿鲁科尔沁旗| 鄂托克前旗| 惠水县| 临泽县| 汉中市| 高雄县| 南昌县| 无为县| 铁岭市| 冀州市| 随州市| 宣城市| 六安市| 外汇| 申扎县| 南和县| 临高县| 新乡市| 霍州市| 祁东县| 兴海县| 莒南县| 吐鲁番市| 天全县| 英吉沙县| 福清市| 河池市| 卓尼县| 扶风县| 陕西省| 汾阳市| 福海县|