嵌入式arm学习总结(九)--ARM启动代码总结-基于mini2440平台



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 ;宏的结束



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值