在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4480|回复: 17

[转帖]ARM Boot 示例

[复制链接]
发表于 2003-9-4 16:02:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
LBHIDDEN[0]LBHIDDEN[这个贴子最后由yangtch在 2003/09/10 08:42am 第 1 次编辑]

ARM Boot 示例[转帖]

程序主要作用是通过串口下载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编程
Length1 EQU 0x100

FlashBase EQU 0x70000000 ;Flash的基地址,在Boot模式下,为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位
;特别注意:
如设置线宽为16位,由于CPU是32位,CPU会把32位数据分两次操作写入,每次写16位,这样对32位的外设来说是一种浪费
例如: LDR r0, =0x10000000
LDR r1, =0x12345678
STR r1,[r0]
实际情况是 第一次写入地址0x10000000的数据是 0x1234
第二次写入地址0x10000002的数据是 0x5678
示波器上观察的情况是一个片选信号/CS低电平范围内,有两个写入信号/WE低电平.
如设置线宽为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
写入Flash参见Flash ROM驱动 部分
发表于 2003-9-9 22:17:43 | 显示全部楼层

[转帖]ARM Boot 示例

LBHIDDEN[0]LBHIDDEN[这个贴子最后由yangtch在 2003/09/09 11:25pm 第 1 次编辑]

谢了,兄弟,-----我看免费我自豪!
发表于 2003-9-10 09:14:14 | 显示全部楼层

[转帖]ARM Boot 示例

我要发一个
【引用】
启动程序是嵌入式程序的开头部分,应该与应用程序一起固件在ROM中,并在系统加电后首先执行,因此写好启动程序是设计嵌入式程序的关键。具体步骤如下:
(1)设置入口指针
初始化程序首先必须定义入口指针ENTRY,而且整个程序只有一个入口指针。
(2)设置中断向量
例如,ARM7要求中断向量表必须设置在从0地址开始,连续8×4字节的空间,分别是复位、未定义指令错误、软件中断、预取指令错误、数据存取错误、IRQ、FIQ和一个保留的中断向量。
如果ROM定位于0地址,向量表包含一系列跳转到中断服务程序的指令;如果RAM定位于0地址,则向量表必须被动态初始化,可以在启动程序中添加一段代码,使其在运行时将向量表拷贝到0地址开始的RAM空间。对于未用中断,使其指向一个只含返回指令的哑函数,以防止错误中断引起系统的混乱。
(3)初始化堆栈和寄存器
系统堆栈初始化取决于用户使用了哪些中断,以及系统需要处理哪些异常类型。一般来说SVC(管理者)堆栈必须设置,如果使用了IRQ,FIQ中断,则IRQ,FIQ堆栈也必须设置。如果系统使用了外设,需要设置相关的寄存器,通知系统外设的数据总线宽度,读写等待周期等信息。
(4)初始化存储器系统
有些芯片可通过寄存器编程初始化存储器系统,而对于较复杂系统通常集成有存储器管理单元(MMU)来管理内存空间。
(5)初始化C语言所需的存储器空间
为正确运行应用程序,在初始化期间应将系统需要读写的数据和变量从FLASH拷贝到RAM里;对静态变量和RAM区清零、建立堆(heap);一些要求快速响应的程序,如中断处理程序,需要拷贝到RAM中运行;如果使用FLASH,对FLASH的擦除和写入操作也一定要在RAM里运行,否则会出现一些不可预料的错误。ARM公司软件开发工具包中的链接器提供了分布装载功能,可以实现这一目的。
(6)设置中断有效
如果在系统中需要使用到IRQ、FIQ中断,在这里需要设置IRQ、FIQ使能。
(7)呼叫C程序
在此处进入到C语言编写的应用程序中,执行相应的操作。
发表于 2006-8-21 13:37:59 | 显示全部楼层
好东西啊啊啊
发表于 2006-8-21 18:19:57 | 显示全部楼层
好东西,非常感谢楼主分享!!!!!
发表于 2006-8-21 18:32:54 | 显示全部楼层
好东西,非常感谢楼主分享!!!!!
发表于 2006-8-23 09:43:16 | 显示全部楼层
支持楼主的免费分享
头像被屏蔽
发表于 2006-8-23 21:09:16 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2006-8-24 19:37:04 | 显示全部楼层
分值不够,多顶
发表于 2006-8-24 21:14:22 | 显示全部楼层
好东西。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-3-12 13:26 , Processed in 0.027183 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表