嵌入式arm学习总结(九)--ARM启动代码总结-基于mini2440平台
来源:互联网 发布:大学生就业难 知乎 编辑:程序博客网 时间:2024/04/27 13:54
1.要看懂启动代码:首先要熟悉ARM9的存储系统和指令系统
2.启动的大概步骤:
进入复位异常--》关看门狗、关中断和子中断等--配置时钟(UPll和MPll)--》初始化内存(初始化13个存储器控制器),清零内存
--》初始化堆栈--拷贝代码到sdram,跳转到sdram中运行--》进入main函数
3.启动代码作用
启动代码的最终目的:把代码从nanflash复制到内存中并运行
1).进入管理模式,设置主频和分频比,初始化相关外设(串口)
2).判定代码是否进行复制(NORFLASH,还是NANDFLSASH复制)
3).异常怎样处理
4).跳入主函数main()
第一步:从resetEntry开始,运行到b ResteHandler
第二步:ResteHandler,关看门狗,关中断
第三步:配置系统时钟:主频,高速总线,低速总线
先配置分频比CLKDIVN 默认为1:1:1
主频FCLK PCLK,HCLK不能直接赋值,它们有一定的比例
再配置主频USB频率MPLLCON,UPLLCON
配置UPLL后必须延时7个时钟周期(芯片资料里面规定)
第四步:设置内存起始地址和长度,初始化SDRAM(严格来说叫存储器控制寄存器,不仅仅包含SDRAM)控制器:配置13个寄存器(一般默认)
5).清除按键中断(可以不要、启动代码这一步不是必须的)
6).清SDRAM
7).初始化堆栈段
8).复制代码到内存
4.启动代码的修改设置点
1)关看门狗、关中断(都是默认)
2)配置FCLK,PCLK,HCLK的比例
3)启动方式NOR,NAND BWSCON
4)复制代码到内存(自动)
5)LDR r0,=HandleIRQ 设置中断向量入口
LDR r1=IsrIRQ
STR r1,[r0] 必须
7)堆栈空间大小的配置
8)中断向量表一一对应,根据不同芯片进行配置、顺序不可颠倒
9)中断向量表的首地址、堆栈首地址,分散加载文件配置(配置debug,程序下载等的起始地址和空间大小即RuninRAM.sct文件中的配置)
5.启动代码中断服务函数的相关设置(这段程序主要把中断服务程序的入口地址传送给pc)
MACRO ;关键字,表示宏定义的开始
$HandlerLabel HANDLER $HandleLabel ; 相当于define max(x,y) 前面为x后面为y 宏名
$HandlerLabel ;以下为宏的内容
sub sp,sp,#4 ;decrement sp(to store jump address);先预留空间,为了存储跳转地址。
;把工作寄存器按入堆栈。 满地减压栈 LDMFA满地减出栈
;范例:压栈STMFD R0!,{R5-R6} ;出栈LDMFD R0!,{R5-R6} 堆栈压栈满递减,出栈必须用满递减
stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to original address)
;这两句的功能是把中断程序的入口地址先放在中间变量r0处。 将IsrIRQ标号放入r0中
ldr r0,=$HandleLabel ;load the address of HandleXXX to r0 把HandleLabel替换成HandleIRQ
;把HandlerXXX所指向的内容放入到r0
ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
;把中断服务程序的入口地址按入堆栈。 将 IsrIRQ地址压栈
str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack S3C2440采用满递减堆栈存储方式
;最后把堆栈中的中断程序入口地址弹出给pc寄存器,这样就可以执行相应的中断服务程序了。
ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR) 出栈过程
;恢复原来r0的值,同时程序跳转到IsrIRQ标号处执行。
MEND ;宏的结束
- 嵌入式arm学习总结(九)--ARM启动代码总结-基于mini2440平台
- 嵌入式arm学习总结(八)--存储知识-nandflash-norflash-基于MINI2440平台
- 嵌入式arm学习总结(三)--IIC 基于AT24C02
- 嵌入式arm学习总结(七)--中断-基于S3C2440
- 嵌入式arm学习总结(四)--LCD
- 嵌入式arm学习总结(二)--arm相关知识
- 如何学习嵌入式系统(基于ARM平台)(转)
- 如何学习嵌入式系统(基于ARM平台)
- 如何学习嵌入式系统(基于ARM平台)
- 如何学习嵌入式系统(基于ARM平台)
- 如何学习嵌入式系统(基于ARM平台)
- 如何学习嵌入式系统(基于ARM平台)
- 如何学习基于ARM平台的嵌入式系统(1)
- 如何学习基于ARM平台的嵌入式系统(2)
- 如何学习嵌入式系统(基于ARM平台)
- 如何学习嵌入式系统(基于ARM平台)
- 如何学习嵌入式系统(基于ARM平台)
- 如何学习嵌入式系统(基于ARM平台)
- JSP转译成Servlet详细过程
- 写代码的体会
- 企业网站优化误区
- java手册之字符串操作
- 浅析人脸检测之Haar分类器方法
- 嵌入式arm学习总结(九)--ARM启动代码总结-基于mini2440平台
- 编程面试的10大算法概念汇总
- 黑马程序员_java-GUI<九>
- Oracle 11.2.0.3 ORA-12012ORA-29280 ORA-06512
- 学习iphone界面编写代码
- 黑马程序员_java网络编程<十>
- (状态压缩、位运算)Corn Fields (P3254)
- 何海涛——《剑指Offer:名企面试官精讲典型编程题》一书中IT名企经典面试题
- java动态代理(JDK和cglib)