历史上的今天
返回首页

历史上的今天

今天是: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 ;宏的结束

推荐阅读

史海拾趣

Fullywell Semiconductor Co Ltd公司的发展小趣事

为了进一步拓宽业务范围和提升技术实力,Fullywell在2015年进行了一次重要的收购。公司成功收购了某家专注于传感器技术的初创企业,将其先进的技术和产品线纳入麾下。这次收购不仅丰富了Fullywell的产品线,还使其在物联网、智能家居等新兴领域具备了更强的竞争力。随后,公司进行了业务整合,优化了资源配置,实现了优势互补,为公司的持续发展注入了新的动力。

ERNI Electronics公司的发展小趣事

ERNI Electronics的源头可以追溯到1947年,当时其瑞士母公司成立。而在1956年,ERNI Electronics以生产继电器为起点,正式进入电子行业。在创立初期,公司专注于继电器的开发和制造,积累了丰富的电子行业经验。随着市场需求的不断变化,ERNI在1967年开发了第一个背板连接器,这一创新产品迅速成为公司的核心产品,并推动了公司的快速发展。

Digital公司的发展小趣事

DIALIGHT公司的故事始于1938年的纽约布鲁克林,当时该公司专注于为飞机生产仪表板灯。随着技术的不断进步和市场的变化,公司在1971年,即LED推出仅一年后,推出了他们的第一个LED产品。这一举措标志着DIALIGHT正式从传统的飞机仪表板灯制造转向LED照明技术的研发和应用。从此,DIALIGHT彻底改变了LED的用途,将其广泛应用于世界各地的交通控制、指示灯、结构塔和工业场所,为全球提供了优质的照明解决方案。

Caddell-Burns Manufacturing公司的发展小趣事

为了进一步扩大市场份额,Caddell-Burns Manufacturing公司开始积极寻求国际合作。他们与多个国家的电子制造商建立了稳定的合作关系,将产品出口到世界各地。同时,公司还参加了多个国际电子展会,展示了公司的最新产品和技术成果,吸引了众多客户的关注。这些举措不仅提升了公司的国际知名度,也为公司的长期发展奠定了坚实基础。

Discrete Semiconductor Industries公司的发展小趣事

在电子行业的早期,一家名为“晶元科技”的Discrete Semiconductor Industries公司凭借其独特的技术革新,成功地在市场中脱颖而出。该公司专注于研发新型半导体材料,通过不断的实验和测试,最终成功开发出了具有更高性能、更低功耗的半导体产品。这些产品迅速得到了市场的认可,晶元科技也因此成为了半导体行业的领军企业之一。随着技术的不断进步,晶元科技不断推出新产品,满足市场对高性能半导体元件的需求,逐渐巩固了其市场地位。

Ceratech Corporation公司的发展小趣事

随着全球化进程的加速推进,Ceratech Corporation公司意识到要想在激烈的国际竞争中立于不败之地,必须实施全球化战略。公司开始积极拓展海外市场,通过建立海外分公司、参加国际展会等方式,加强与国际同行的交流与合作。同时,公司还积极引进国际先进的技术和管理经验,不断提升自身的创新能力和管理水平。通过全球化战略的实施,Ceratech Corporation逐渐成为了国际电子行业中的佼佼者。

问答坊 | AI 解惑

意外的惊喜!考研+就业!

考研就业专刊 考研流程+考研经验+人才招聘会+薪资洽谈+面试攻略+健康贴士+时间表…… 妹妹大餐都在这里面! 尤其适合自动化相关专业,特别版!一路陪伴从准备到结束!!! 为了节省大家的芯币 本人最新编辑了一下 把所有的东西打 ...…

查看全部问答>

32位摇摇棒

快毕业了,没什么做的,就做了个摇摇棒,上次也做到了个,但那次是16位的,这次做了个32位。它可以显示两行字,分辨率更高,但棒子也要求更长,摇起来更累。 我已将视频上传到优酷,地址:http://v.youku.com/v_show/id_XMTgzMjE0MzI4.html & ...…

查看全部问答>

大家给我出出主意

几个问题 1.嵌入式的前景不错嘛?酬薪怎样? 2.嵌入式工程师没有35岁瓶颈吗? 3.我是个学生,想问下培训费用大概多少钱? 4.对于现在的情况,大学生是不是很需要培训,培训的目的和作用是什么? 我是个新手,希望大家好好指导我下。谢谢。大二 ...…

查看全部问答>

ARM7中断疑惑?请哪个大虾帮忙看看。小弟不胜感激!

在ARM7下写了一个定时器中断程序。下面代码是进入IRQ中断后然后为了可重入中断,就切换到系统模式下。但是在切换的时候出现问题?如何直接MSR CPSR_C,#SYS32_MODE(1)就出现SIGBUS错误。切换代码改成MSR CPSR_C,#(SYS32_MODE|NO_INT)(2)就行了 ...…

查看全部问答>

WinCE5.0的模拟器

在VS2005下怎么没有wince5.0的模拟器,到哪有的下载? 注意: 是\"wince5.0的模拟器\", 不是\"pocket pc的模拟器\",也不是\"smart phone的模拟器\"…

查看全部问答>

FPGA 调用USB2.0 的CORE

有人用过opencores上那个USB 2.0设备IP在FPGA上实现过吗?PHY芯片打算用cy7c68000有需要修改的地方吗?还是可以直接使用。 应该注意些什么…

查看全部问答>

uCOS-II内部机制

附件中的文件非常简洁的讲述了uCOS-II的内部机制,是不错的学习OS的资料…

查看全部问答>

EZ430——Rf2500学习小感

最近刚刚入手430,原来只接触过51,不过由于430的程序大都用C写得,所以学习起来还是比较方便的。前几天一直在学习uart的输出,具体做了一个有关uart的小程序,刚开始有例程可以看,不过不知道问什么,所有的例程都无法用串口助手加以显示输出,当 ...…

查看全部问答>

430选型指南

关于430非常齐全的资[local]4[/local]料…

查看全部问答>

新人求指点。。

准备做嵌入式wifi开发。从书上了解到要用嵌入式操作系统。。。所以想问一下。。ARM-Linux是嵌入式操作系统吗?书上用这个作为范例但是在网上一直没有搜到相应资源,到时下载到了μCLinux相关的代码。。那么μCLinux与其有什么不同?用前者编译的wif ...…

查看全部问答>