新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Eclipse開發調試ARM裸機程序(七)LCD

        Eclipse開發調試ARM裸機程序(七)LCD

        作者: 時間:2016-11-19 來源:網絡 收藏
        原本想這個LCD應該很難做,但是一個小時搞出來了,2個小時整理下,讓自己代碼好看一點。這個次不能像I2C一樣,用最簡的代碼來實現了,顯示一個圖片都要很大,4k的sdram根本不夠用,就要用到SDRAM了。啟動用的nand,sdram,clock,wathc_dog都是以前的模塊,基本上拿來就能用,并沒有太難。為了讓代碼同時具有調試和運行的特性。我想起來了u-boot對這個問題的解決方法,并照做了,效果不不錯。原理很簡單就是在copy_to_ram_from_nand前邊進行一下判斷。如果_start的運行地址就是鏈接地址說明是在調試,那么就不進行拷貝了;如果不是則進行拷貝。具體的代碼如下:
        relocate:/* relocate U-Boot to RAM */
        adrr0, _start/* r0 <- current position of code */
        ldrr1, =TEXT_BASE/* test if we run from flash or RAM */
        cmpr0, r1/* dont reloc during debug */
        beqstack_setup
        ldr sp, =1024*4 @ 設置堆棧
        bl copy_to_ram_from_nand @ 到SDRAM中
        注釋都沒有換,不過真心好用。完整的啟動代碼如下:
        @*
        @ File:start.S
        @ 功能:設置SDRAM,將程序到SDRAM,然后跳到SDRAM繼續執行
        @*
        .equ MEM_CTL_BASE, 0x48000000
        .equ TEXT_BASE, 0x33F80000
        .text
        .global _start
        _start:
        bl pre_lowlevel_init @ 關閉WATCHDOG,屏蔽中斷
        bl system_clock_init
        bl mem_ctrl_asm_init @ 設置存儲控制器
        bl nand_asm_init
        relocate:/* relocate U-Boot to RAM */
        adrr0, _start/* r0 <- current position of code */
        ldrr1, =TEXT_BASE/* test if we run from flash or RAM */
        cmpr0, r1/* dont reloc during debug */
        beqstack_setup
        ldr sp, =1024*4 @ 設置堆棧
        bl copy_to_ram_from_nand @ 到SDRAM中
        stack_setup:
        ldr sp, =0x33F80000 @ 設置堆棧
        ldrpc, _start_armboot @ 跳到SDRAM中繼續執行
        _start_armboot:.word main
        @stack_setup:
        @ ldr sp, =1024*4 @ 設置堆棧
        @ bl main
        halt_loop:
        b halt_loop
        /*
        * 板級初始化預處理函數
        * 關看門狗、屏蔽中斷
        */
        pre_lowlevel_init:
        /* turn off the watchdog */
        #define pWTCON0x53000000
        #define INTMSK0x4A000008/* Interrupt-Controller base addresses */
        #define INTSUBMSK0x4A00001C
        #define CLKDIVN0x4C000014/* clock divisor register */
        ldrr0, =pWTCON
        movr1, #0x0
        strr1, [r0]
        /*
        * mask all IRQs by setting all bits in the INTMR - default
        */
        movr1, #0xffffffff
        ldrr0, =INTMSK
        strr1, [r0]
        ldrr1, =0x7fff
        ldrr0, =INTSUBMSK
        strr1, [r0]
        movpc, lr
        /* end_of pre_lowlevel_init */
        /*
        * 系統時鐘初始化函數
        * S3C2440: FCLK:HCLK:PCLK = 1:4:8(FCLK is 405 MHz)
        */
        #define CLKDIVN0x4C000014
        #define CLK_CTL_BASE0x4C000000
        #define MDIV_4050x7f << 12
        #define PSDIV_4050x21
        #define MDIV MDIV_405
        #define PSDIV PSDIV_405
        #define CLKDIV 0x5 /* FCLK:HCLK:PCLK = 1:4:8 */
        system_clock_init:
        ldrr0, =CLKDIVN
        movr1, #CLKDIV
        strr1, [r0]
        /*
        * 設置arm920t為異步時鐘模式
        *
        * 復位時,arm920t處于快速總線時鐘模式,該模式下
        * core和AMBA都由BCLK控制,設置為異步模式后,core
        * 由FCLK控制
        */
        mrcp15, 0, r1, c1, c0, 0
        orrr1, r1, #0xc0000000
        mcrp15, 0, r1, c1, c0, 0
        movr1, #CLK_CTL_BASE
        movr2, #MDIV
        addr2, r2, #PSDIV
        strr2, [r1, #0x04]/* MPLLCON */
        movpc, lr
        /* end_of system_clock_init*/
        /*
        * NAND FLASH初始化函數
        * TACLS:TWRPH0:TWRPH1 = 1:2:1, BUS_WIDTH_8
        */
        #define S3C2440_NAND_BASE0x4E000000
        #define NFCONF_OFFSET 0x0
        #define NFCONT_OFFSET 0x4
        nand_asm_init:
        ldrr0, =S3C2440_NAND_BASE
        ldrr1, =0x001210
        str r1, [r0, #NFCONF_OFFSET]
        movr1, #0x3
        str r1, [r0, #NFCONT_OFFSET]
        movpc, lr
        /*end_of nand_asm_init*/
        mem_ctrl_asm_init:
        @ 設置存儲控制器以便使用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
        啟動完就跳到了main那里出了。關于LCD的參數什么的就不多說了,以前RVDS下的整個過來都沒有問題。很多博客,教材上講的很清楚。這里主要寫寫實現過程。
        調試截圖:

        顯示截圖:

        代碼:http://download.csdn.net/detail/kangear/5268137


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 安陆市| 吴旗县| 东莞市| 收藏| 毕节市| 台东县| 通城县| 赫章县| 潜山县| 永福县| 通辽市| 锦州市| 屏南县| 颍上县| 和龙市| 大悟县| 广丰县| 讷河市| 焉耆| 瑞丽市| 余干县| 农安县| 罗甸县| 贵州省| 都匀市| 新安县| 太仆寺旗| 永济市| 昆明市| 安徽省| 武胜县| 平阳县| 田林县| 扬州市| 文山县| 牟定县| 襄汾县| 林西县| 新巴尔虎左旗| 桂林市| 西华县|