• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    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

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 龙口市| 南郑县| 江口县| 莒南县| 哈巴河县| 霍州市| 孟村| 吉木萨尔县| 安多县| 吉首市| 射洪县| 新昌县| 大洼县| 武义县| 绵阳市| 双峰县| 济宁市| 镇江市| 九台市| 鄱阳县| 漠河县| 伊吾县| 安康市| 甘南县| 南开区| 罗甸县| 金华市| 临沭县| 工布江达县| 呼玛县| 武冈市| 柘荣县| 余庆县| 高雄市| 连云港市| 南乐县| 兴安县| 新余市| 嘉善县| 皮山县| 南投县|