新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM編程中的ARM Boot 示例

        ARM編程中的ARM Boot 示例

        作者: 時間:2013-12-04 來源:網絡 收藏
        程序主要作用是通過串口下載VxWorks到 Flash ROM,主要過程是初始化硬件,初始化串口UART1,從串口接收VxWorks image到DRAM,初始化Flash ROM.最后將DRAM中的VxWorks寫入Flash ROM. arm 串口與PC機串口連接,由PC機下載(download)VxWorks 到主板Flash ROM.

        該程序對學習和理解arm編程很有幫助.為了便于理解,這里我全部采用實際地址,不用宏定義.

        程序語言為 arm 匯編,具體過程參考arm編程,具體寄存器接口定義參見arm硬件手冊


        VramBaseAddress EQU 0xC0000000 ;DRAM起始地址,在arm硬件地址映射定義,見arm編程
        Length1 EQU 0x100


        FlashBase EQU 0x70000000 ;Flash的基地址,在模式下,為0x70000000
        MMUCP CP 15 ;協處理器15

        AREA |C$$code|, CODE, READONLY

        ENTRY

        EXPORT main

        main
        MOV r14, #0x70 ;設置MMU無效, 32位模式, Little endian
        MCR MMUCP, 0, r14, c1, c0, 0

        MRS r14, CPSR
        BIC r14, r14, #0x1f ;Mask
        ORR r14, r14, #0xc0 + 0x13 ;關閉所有 IRQ FIQ, 用SVC32 模式
        MSR CPSR, r14

        LDR r11, =0x80000000 ;內部寄存器基地址 0x80000000
        LDR r12, =0x80001000

        MOV r0, #0

        STR r0, [r11, #0x280] ;disable 所有中斷
        STR r0, [r12, #0x280]

        LDR r0, =0x840100 ;在系統控制寄存器SYSCON1中
        STR r0, [r11, #0x100] ;使能外部時鐘 EXCKEN 和串口 UART1

         
        LDR r0, =0x06 ;在系統控制寄存器SYSCON2中
        STR r0, [r12, #0x100] ;使能16-bit DRAM, 鍵盤KBD6

        LDR r0, =0x03010100 ;在存儲控制寄存器MEMCFG1中
        STR r0, [r11, #0x180] ;設置外設數據線寬度CS0:16位,CS1,2:32位,CS3:8位

        ;特別注意:

        1. 如設置線寬為16位,由于CPU是32位,CPU會把32位數據分兩次操作寫入,每次寫16位,這樣對32位的外設來說是一種浪費

        例如: LDR r0, =0x10000000
        LDR r1, =0x12345678
        STR r1,[r0]
        實際情況是 第一次寫入地址0x10000000的數據是 0x1234
        第二次寫入地址0x10000002的數據是 0x5678

        示波器上觀察的情況是一個片選信號/CS低電平范圍內,有兩個寫入信號/WE低電平.

        1. 如設置線寬為32位,CPU會把32位數據一次寫入,如果外設是16位的話,如ISA網卡,就會造成高16位丟失.

        例如: LDR r0, =0x10000000
        LDR r1, =0x12345678
        STR r1,[r0]
        實際情況是 一次寫入地址0x10000000的數據是 0x12345678

        LDR r0, = 0xff ;DRAM刷新率refresh rate,設置要適當,否則數據丟失
        STR r0, [r11, #0x200]

        LDR r13, =0xc0020000 ;設置堆棧 Stack, r13 為arm定義的堆棧指針
        ;Init OK
        LDR r0, =receiving_msg
        BL printmsg

        BL dram_test ;跳轉指令,執行測試DRAM

        LDR r0, =startloader_cmdmsg
        BL printmsg

        BL Beep

        LDR r0, =0x60005 ;設置波特率 38400, 8位
        LDR r11, =0x80000000
        STR r0, [r11, #0x4c0] ;初始化串口 UART
        ;Receive data and save it to buffer ;開始接收數據
        LDR r12, =SaveAddr ;First 8 bytes are start address and length
        ;Receive address
        LDR r5, =0x4 ;Read first 4 bytes
        MOV r0, #0
        rx_loop1
        LDR r1, [r11, #0x140] ;檢查系統狀態寄存器System Status Register 1
        TST r1, #0x00400000 ;UART1 Rx 是否為空
        BNE rx_loop1 ;等待數據 Wait data
        LDR r1, [r11, #0x480] ;讀數據 Read data
        AND r1, r1, #0xff
        ORR r0, r1, r0, ROR #8
        SUBS r5, r5, #1
        BNE rx_loop1
        MOV r0, r0, ROR #8

        STR r0, [r12]
        ADD r12, r12, #4

        ;Receive count
        LDR r12, =Count
        LDR r5, =0x4 ;Read second 4 bytes
        MOV r0, #0
        rx_loop2
        LDR r1, [r11, #0x140] ;檢查系統狀態寄存器System Status Register 1
        TST r1, #0x00400000 ;UART1 Rx 是否為空
        BNE rx_loop2 ;等待數據 Wait data
        LDR r1, [r11, #0x480] ;讀數據 Read data
        AND r1, r1, #0xff
        ORR r0, r1, r0, ROR #8
        SUBS r5, r5, #1
        BNE rx_loop2
        MOV r0, r0, ROR #8

        STR r0, [r12]
        MOV r6, r0 ;Save the count to r6

        ;Receive data
        MOV r5, r0
        MOV r9, #0
        LDR r10, =BufferBase
        MOV r12, #0
        rx_loop3
        LDR r1, [r11, #0x140] ;System Status Register 1
        TST r1, #0x00400000 ;UART1 Rx Empty
        BNE rx_loop3 ;Wait data
        LDR r1, [r11, #0x480] ;Read data
        AND r1, r1, #0xff
        STRB r1, [r10, r12]
        ADD r12, r12, #1

        nextbyte ;讀下一個字節
        SUBS r5, r5, #1
        BNE rx_loop3
        ;Receive data OK ;數據接收完畢

        MOV r1, #0x31
        BL send_char
        MOV r1, #0x0d
        BL send_char
        MOV r1, #0x0a
        BL send_char

        ;Save it to Flash ROM 把數據寫入Flash ROM



        關鍵詞: ARM編程 ARM Boot

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 安丘市| 来宾市| 山阳县| 合水县| 清镇市| 太仓市| 乌拉特中旗| 确山县| 平塘县| 特克斯县| 成安县| 深州市| 沙河市| 西藏| 丽江市| 双峰县| 金溪县| 奉化市| 白沙| 台北县| 遂宁市| 新建县| 绥棱县| 尉犁县| 化州市| 东阳市| 华坪县| 淮北市| 策勒县| 浙江省| 安西县| 新巴尔虎右旗| 承德市| 龙泉市| 石门县| 两当县| 阿拉善盟| 博爱县| 远安县| 大足县| 修文县|