📄 程序示例-arm boot.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0049)http://drew.nease.net/mypage/example/ARM_Boot.htm -->
<HTML><HEAD><TITLE>程序示例-ARM boot</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY background="程序示例-ARM boot.files/background.gif">
<P>>><BIG><BIG><A name=returntop></A></BIG><A
href="http://drew.nease.net/">Drew的主页</A></BIG>----><BIG><BIG><A
name=returntop></A></BIG><A
href="http://drew.nease.net/mypage/sourcecode.htm">程序示例</A></BIG>---->ARM
Boot</P>
<DIV align=center>
<CENTER>
<TABLE borderColor=#88deea height=23 cellSpacing=1 borderColorDark=#88deea
width=754 bgColor=#ffffff borderColorLight=#88deea
background="程序示例-ARM boot.files/bg1.gif" border=1>
<TBODY>
<TR>
<TD align=middle width=83 height=1>
<P align=center><A href="http://drew.nease.net/"><BIG>主页</BIG></A></P></TD>
<TD align=middle width=83 height=1>
<P align=center><A href="http://drew.nease.net/mypage/VxWorks.htm"><FONT
lang=ZH-CN face=System>VxWorks</FONT></A></P></TD>
<TD align=middle width=84 height=1>
<P align=center><A href="http://drew.nease.net/processor/arm.htm"><FONT
lang=ZH-CN face=System>ARM</FONT></A></P></TD>
<TD align=middle width=84 height=1>
<P align=center><A href="http://drew.nease.net/processor/mpc860.htm"><FONT
lang=ZH-CN face=System>PowerPC</FONT></A></P></TD>
<TD align=middle width=84 height=1>
<P align=center><A href="http://drew.nease.net/mypage/driver.htm"><FONT
lang=ZH-CN face=System>硬件驱动</FONT></A></P></TD>
<TD align=middle width=84 height=1>
<P align=center><A href="http://drew.nease.net/mypage/network.htm"><FONT
lang=ZH-CN face=System>网络协议</FONT></A></P></TD>
<TD align=middle width=84 height=1>
<P align=center><A
href="http://drew.nease.net/mypage/sourcecode.htm"><FONT lang=ZH-CN
face=System>程序示例</FONT></A></P></TD>
<TD align=middle width=84 height=1><A href="http://www.embhelp.com/bbs"
target=_blank><FONT face=System color=#8000ff>技术论坛</FONT></A></TD>
<TD align=middle width=84 height=1>
<P align=center><A href="http://www.embhelp.com/download"><FONT lang=ZH-CN
face=System>下载</FONT></A></P></TD></TR></TBODY></TABLE></CENTER></DIV>
<P align=center> </P>
<P align=center><BIG><BIG><BIG><FONT color=#0000ff>ARM Boot
示例</FONT></BIG></BIG></BIG></P>
<P align=left> </P>
<P align=left> <STRONG>程序主要作用是通过串口下载VxWorks到ARM Flash
ROM,主要过程是初始化ARM硬件,初始化串口UART1,从串口接收VxWorks image到DRAM,初始化Flash
ROM.最后将DRAM中的VxWorks写入Flash ROM. ARM 串口与PC机串口连接,由PC机下载(download)VxWorks 到主板Flash
ROM.</STRONG></P>
<P align=left><STRONG>该程序对学习和理解ARM编程很有帮助.为了便于理解,这里我全部采用实际地址,不用宏定义.</STRONG></P>
<P align=left><STRONG>程序语言为 ARM 汇编,具体过程参考<A
href="http://drew.nease.net/processor/arm.htm"><FONT lang=ZH-CN
face=System>ARM编程</FONT></A>,具体寄存器接口定义参见ARM硬件手册</STRONG></P>
<P align=left><BR>VramBaseAddress EQU 0xC0000000
<STRONG>;DRAM起始地址,在ARM硬件地址映射定义,见<A
href="http://drew.nease.net/processor/arm.htm"><FONT lang=ZH-CN
face=System>ARM编程</FONT></A></STRONG><BR>Length1
EQU 0x100
<BR><BR><BR>FlashBase EQU
0x70000000
<STRONG>;Flash的基地址,在Boot模式下,为0x70000000</STRONG><BR>MMUCP
CP 15
<STRONG>;协处理器15</STRONG><BR><BR> AREA |C$$code|, CODE,
READONLY<BR><BR> ENTRY<BR><BR> EXPORT
main<BR><BR>main<BR> MOV
r14, #0x70
<STRONG>;设置MMU无效, 32位模式, Little
endian</STRONG><BR> MCR
MMUCP, 0, r14, c1, c0,
0<BR><BR> MRS
r14,
CPSR<BR> BIC
r14, r14, #0x1f
;Mask<BR> ORR
r14, r14, #0xc0 + 0x13
<STRONG>;关闭所有 IRQ FIQ, 用SVC32
模式</STRONG><BR> MSR
CPSR,
r14<BR><BR> LDR
r11, =0x80000000
<STRONG>;内部寄存器基地址
0x80000000</STRONG><BR> LDR
r12,
=0x80001000<BR><BR> MOV
r0,
#0<BR><BR> STR
r0, [r11, #0x280]
<STRONG>;disable
所有中断</STRONG><BR> STR
r0, [r12,
#0x280]<BR><BR> LDR
r0, =0x840100
<STRONG>;在系统控制寄存器SYSCON1中
</STRONG><BR> STR
r0, [r11, #0x100]
<STRONG>;使能外部时钟 EXCKEN 和串口
UART1</STRONG></P>
<P align=left> <BR> LDR
r0, =0x06
<STRONG>;在系统控制寄存器SYSCON2中</STRONG><BR>
STR r0, [r12, #0x100]
<STRONG>;使能16-bit DRAM, 键盘KBD6
</STRONG><BR><BR> LDR
r0, =0x03010100
<STRONG>;在存储控制寄存器MEMCFG1中</STRONG><BR>
STR r0, [r11, #0x180]
<STRONG>;设置外设数据线宽度CS0:16位,CS1,2:32位,CS3:8位</STRONG></P>
<P align=left><STRONG>;特别注意: </STRONG></P>
<BLOCKQUOTE>
<OL>
<LI>
<P
align=left><STRONG>如设置线宽为16位,由于CPU是32位,CPU会把32位数据分两次操作写入,每次写16位,这样对32位的外设来说是一种浪费</STRONG></P></LI></OL></BLOCKQUOTE>
<BLOCKQUOTE>
<BLOCKQUOTE>
<BLOCKQUOTE>
<P align=left><STRONG>例如: LDR
r0,
=0x10000000<BR>
LDR r1,
=0x12345678<BR>
STR r1,[r0]<BR>实际情况是 第一次写入地址0x10000000的数据是
0x1234<BR>
第二次写入地址0x10000002的数据是 0x5678</STRONG></P>
<P
align=left><STRONG>示波器上观察的情况是一个片选信号/CS低电平范围内,有两个写入信号/WE低电平.</STRONG></P></BLOCKQUOTE></BLOCKQUOTE></BLOCKQUOTE>
<BLOCKQUOTE>
<OL start=2>
<LI>
<P
align=left><STRONG>如设置线宽为32位,CPU会把32位数据一次写入,如果外设是16位的话,如ISA网卡,就会造成高16位丢失.</STRONG></P></LI></OL></BLOCKQUOTE>
<BLOCKQUOTE>
<BLOCKQUOTE>
<BLOCKQUOTE>
<P align=left><STRONG>例如: LDR
r0,
=0x10000000<BR>
LDR r1,
=0x12345678<BR>
STR r1,[r0]<BR>实际情况是 一次写入地址0x10000000的数据是
0x12345678</STRONG><BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -