概述
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学习总结(九)--ARM启动代码总结-基于mini2440平台所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复