ARM Boot 示例
2013-02-09
标签: ARM

程序主要作用是通过串口下载VxWorks到ARM Flash ROM,主要过程是初始化ARM硬件,初始化串口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编程

Length1EQU0x100

FlashBaseEQU0x70000000;Flash的基地址,在Boot模式下,为0x70000000

MMUCPCP15;协处理器15

AREA |C$code|, CODE, READONLY

ENTRY

EXPORT main

main

MOVr14, #0x70;设置MMU无效, 32位模式, Little endian

MCRMMUCP, 0, r14, c1, c0, 0

MRSr14, CPSR

BICr14, r14, #0x1f;Mask

ORRr14, r14, #0xc0 + 0x13;关闭所有 IRQ FIQ, 用SVC32 模式

MSRCPSR, r14

LDRr11, =0x80000000;内部寄存器基地址 0x80000000

LDRr12, =0x80001000

MOVr0, #0

STRr0, [r11, #0x280];disable 所有中断

STRr0, [r12, #0x280]

LDRr0, =0x840100;在系统控制寄存器SYSCON1中

STRr0, [r11, #0x100];使能外部时钟 EXCKEN 和串口 UART1

LDRr0, =0x06;在系统控制寄存器SYSCON2中

STRr0, [r12, #0x100];使能16-bit DRAM, 键盘KBD6

LDRr0, =0x03010100;在存储控制寄存器MEMCFG1中

STRr0, [r11, #0x180];设置外设数据线宽度CS0:16位,CS1,2:32位,CS3:8位

;特别注意:

如设置线宽为16位,由于CPU是32位,CPU会把32位数据分两次操作写入,每次写16位,这样对32位的外设来说是一种浪费

例如:LDRr0, =0x10000000

LDRr1, =0x12345678

STRr1,[r0]

实际情况是 第一次写入地址0x10000000的数据是 0x1234

第二次写入地址0x10000002的数据是 0x5678

示波器上观察的情况是一个片选信号/CS低电平范围内,有两个写入信号/WE低电平.

如设置线宽为32位,CPU会把32位数据一次写入,如果外设是16位的话,如ISA网卡,就会造成高16位丢失.

例如:LDRr0, =0x10000000

LDRr1, =0x12345678

STRr1,[r0]

实际情况是 一次写入地址0x10000000的数据是 0x12345678

LDRr0, = 0xff;DRAM刷新率refresh rate,设置要适当,否则数据丢失

STRr0, [r11, #0x200]

LDRr13, =0xc0020000;设置堆栈 Stack, r13 为ARM定义的堆栈指针

;Init OK

LDRr0, =receiving_msg

BLprintmsg

BLdram_test;跳转指令,执行测试DRAM

LDRr0, =startloader_cmdmsg

BLprintmsg

BLBeep

LDRr0, =0x60005;设置波特率 38400, 8位

LDRr11, =0x80000000

STRr0, [r11, #0x4c0];初始化串口 UART

;Receive data and save it to buffer;开始接收数据

LDRr12, =SaveAddr;First 8 bytes are start address and length

;Receive address

LDRr5, =0x4;Read first 4 bytes

MOVr0, #0

rx_loop1

LDRr1, [r11, #0x140];检查系统状态寄存器System Status Register 1

TSTr1, #0x00400000;UART1 Rx 是否为空

BNErx_loop1;等待数据 Wait data

LDRr1, [r11, #0x480];读数据 Read data

ANDr1, r1, #0xff

ORRr0, r1, r0, ROR #8

SUBSr5, r5, #1

BNErx_loop1

MOVr0, r0, ROR #8

STRr0, [r12]

ADDr12, r12, #4

;Receive count

LDRr12, =Count

LDRr5, =0x4;Read second 4 bytes

MOVr0, #0

rx_loop2

LDRr1, [r11, #0x140];检查系统状态寄存器System Status Register 1

TSTr1, #0x00400000;UART1 Rx 是否为空

BNErx_loop2;等待数据 Wait data

LDRr1, [r11, #0x480];读数据 Read data

ANDr1, r1, #0xff

ORRr0, r1, r0, ROR #8

SUBSr5, r5, #1

BNErx_loop2

MOVr0, r0, ROR #8

STRr0, [r12]

MOVr6, r0;Save the count to r6

;Receive data

MOVr5, r0

MOVr9, #0

LDRr10, =BufferBase

MOVr12, #0

rx_loop3

LDRr1, [r11, #0x140];System Status Register 1

TSTr1, #0x00400000;UART1 Rx Empty

BNErx_loop3;Wait data

LDRr1, [r11, #0x480];Read data

ANDr1, r1, #0xff

STRBr1, [r10, r12]

ADDr12, r12, #1

nextbyte;读下一个字节

SUBSr5, r5, #1

BNErx_loop3

;Receive data OK;数据接收完毕

MOVr1, #0x31

BLsend_char

MOVr1, #0x0d

BLsend_char

MOVr1, #0x0a

BLsend_char

;Save it to Flash ROM把数据写入Flash ROM

写入Flash参见Flash ROM编程 部分

可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号