历史上的今天
今天是:2025年03月14日(星期五)
2020年03月14日 | 嵌入式arm学习总结(九)--ARM启动代码总结-基于mini2440平台
2020-03-14 来源:eefocus
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 ;宏的结束
史海拾趣
|
考研就业专刊 考研流程+考研经验+人才招聘会+薪资洽谈+面试攻略+健康贴士+时间表…… 妹妹大餐都在这里面! 尤其适合自动化相关专业,特别版!一路陪伴从准备到结束!!! 为了节省大家的芯币 本人最新编辑了一下 把所有的东西打 ...… 查看全部问答> |
|
在ARM7下写了一个定时器中断程序。下面代码是进入IRQ中断后然后为了可重入中断,就切换到系统模式下。但是在切换的时候出现问题?如何直接MSR CPSR_C,#SYS32_MODE(1)就出现SIGBUS错误。切换代码改成MSR CPSR_C,#(SYS32_MODE|NO_INT)(2)就行了 ...… 查看全部问答> |
|
在VS2005下怎么没有wince5.0的模拟器,到哪有的下载? 注意: 是\"wince5.0的模拟器\", 不是\"pocket pc的模拟器\",也不是\"smart phone的模拟器\"… 查看全部问答> |
|
有人用过opencores上那个USB 2.0设备IP在FPGA上实现过吗?PHY芯片打算用cy7c68000有需要修改的地方吗?还是可以直接使用。 应该注意些什么… 查看全部问答> |
|
最近刚刚入手430,原来只接触过51,不过由于430的程序大都用C写得,所以学习起来还是比较方便的。前几天一直在学习uart的输出,具体做了一个有关uart的小程序,刚开始有例程可以看,不过不知道问什么,所有的例程都无法用串口助手加以显示输出,当 ...… 查看全部问答> |




