如何编写ARM7的启动代码(LPC2119为例)

发布者:SereneHeart最新更新时间:2023-03-06 来源: elecfans关键字:ARM7  启动代码  LPC2119 手机看文章 扫描二维码
随时随地手机看文章

随着生活水平的提高和IT技术的进步,8位处理器的处理能力已经不能满足嵌入式系统的需要了;而16位处理器在性能和成本上都没有很大的突破。并且在8位机的开发中,大多使用汇编语言来编写用户程序。这使得程序的可维护性、易移植性等都受到了极大的挑战。正是基于此,ARM公司适时的推出了一系列的32位嵌入式微控制器。目前广泛使用的是ARM7和ARM9系列,ARM7TDMI内核的ARM7处理器广泛应用于工业控制、仪器仪表、汽车电子、通讯、消费电子等嵌入式设备。本文主要以philips公司ARM7TDMI核的LPC2119为例来分析如何编写ARM7的启动代码。


1、启动代码

在嵌入式系统软件的开发中,应用程序通常是在嵌入式操作系统的开发平台上采用C语言编写的。然而,在ARM系统上电复位后,需要设置中断向量表、初始化各模式堆栈、设置系统时钟频率等,而这些过程都是针对ARM内部寄存器结构的操作,用C语言编程是很难实现的。因此在转到应用程序的c/c++编写之前,需要用ARM的汇编语言编写启动代码,由启动代码完成系统初始化以及跳转到用户C程序。在ARM设计开发中,启动代码的编写是一个极重要的过程。然而启动代码随具体的目标系统和开发系统有所区别,但通常包含以下部分:

·向量表定义

·地址重映射及中断向量表的转移

·堆栈初始化

·设置系统时钟频率

·中断寄存器的初始化

·进入C应用程序

下面就结合PHILIPS的LPC2119的启动代码来分析与说明ARM7处理器的启动代码的编写。


1.1向量表定义

ARM芯片上电或复位后,系统进入管理模式、ARM状态、PC(R15)指向0x00000000地址处。中断向量表为每一个中断设置1个字的存储空间,存放一条跳转指令,通过这条指令使PC指针指向相应的中断服务程序入口,继而执行相应的中断处理程序。LPC2219的中断向量表和其它基于ARM核的芯片中断向量表较类似,只要注意LPC2219要使向量表所有数据32位累加和为零(0x00000000-0x0000001C的8个字的机器码累加), 才能使用户的程序脱机运行。


1.2 地址重映射及中断向量表的转移

ARM7处理器在复位后从地址0读取第一条指令并执行,因此系统上电后地址0必须是非易失的ROM/FLASH,这样才能保证处理器有正确可用的指令。为了加快对中断的处理以及实现在不同操作系统模式下对中断的处理,这就需要重新映射中断向量表、BootbLOCk和SRAM空间的一小部分。ARM具有非常灵活的存储器地址分配特性。ARM处理器的地址重映射机制有两种情况:

①由专门的寄存器完成重映射(Remap),只需对相应的Remap寄存器相应位设置即可。

②没有专门的Remap控制寄存器需要重新改写用于控制存储器起始地址的块(Bank)寄存器来实现Remap。在LPC2119上的重映射,可以通过存储器映射控制器来实现。实现REMAP操作的程序实现如下:

MOV R8,#0x40000000; /设置新向量表起始地址/

LDR R9,=Interrupt_Vector_Table; /读原向量表源地址/

LDMIA R9!,(R0-R7); /复制中断向量表及中断处理程序的入口地址到RAM中(64字节)/

STMIA R8!,(R0-R7)

LDMIA R9!,(R0-R7)

STMIA R8!,(R0-R7)

LDR R8,=MEMMAP ; /REMMAP操作/

MOV R9,#0x02

STR R9, [R8]


1.3 堆栈初始化

启动代码中各模式堆栈空间的设置是为中断处理和程序跳转时服务的。当系统响应中断或程序跳转时,需要将当前处理器的状态和部分重要参数保存在一段存储空间中,所以对每个模式都要进行堆栈初始化工作,给每个模式的SP定义一个堆栈基地址和堆栈的容量。堆栈的初始化有两种方法:第一种方法是结合ADS开发套件中的分散加载文件来定义堆栈。第二种方法是最简单也是最常用的一种就是直接进入对应的处理器模式,为SP寄存器指定相应的值。下面给出了用第二种方法初始化管理模式和中断模式堆栈的程序:

MSR CPSR_c, #0xD3 ; /切换到管理模式,并初始化管理模式的堆栈/

LDR SP, Stack_Svc

MSR CPSR_c, #0xD2 ; /切换到IRQ模式,并初始化IRQ模式的堆栈/

LDR SP, Stack_Irq

1.4 系统部分时钟初始化

时钟是芯片各部分正常工作的基础,应该在进入main()函数前设置。部分ARM7片子内部集成有PLL(锁相环)电路,用户可以用低频率的晶振通过PLL电路获得一个较高频率的时钟。LPC2119内部的PLL电路接受的输入时钟频率范围为10~25MHz,输入频率通过一个电流控制振荡器(CCO)倍增到范围10~60MHz。同时为了使高速的ARM处理器与低速的外设正常通讯和降低功耗(降低外设运行速度使功耗降低),LPC2119又集成了一个额外的分频器。PLL的激活是由PLLCON寄存器控制。PLL倍频器和分频器的值由PLLCFG寄存器控制。对PLLCON或PLLCFG寄存器的更改必须遵循严格的顺序,否则所作更改是无法生效的(在连续的VPB周期内向PLLFEED寄存器写入0xAA、0x55,在此期间中断必须是被禁止的。)


1.5 中断初始化

ARM7的向量中断控制器(Vectored Interrupt Controller)可以将中断编程为3类:FIQ、向量IRQ、非向量IRQ。FIQ中断请求的优先级最高,其次是IRQ中断请求,非向量IRQ的优先级最低。VIC具有32个中断请求输入,但在LPC2219中只占用了17个中断输入。对于这17个中断源的IRQ/FIQ选择,由VICIntSelect寄存器控制,当对应位设置位1时,则此中断为FIQ中断,否则为IRQ中断。若再将IRQ中断设置到向量控制寄存器(VICVectCntIn)中,则此中断为向量IRQ中断,否则为非向量IRQ中断。FIQ中断是专门用来处理那些需要及时响应的特殊事件,尽可能地只给FIQ分配一个中断源。


1.6 进入C应用程序

至此,系统各部分的初始化基本完成,可以直接从启动代码转入到应用程序的main()函数入口。从启动代码转入到应用程序的实例代码如下:

IMPORT main

LDR R0,=main

BX R0


2、总结

一个优秀的启动代码将给应用程序的开发提供一个良好的开发平台。本文中较详细的讨论了启动代码的编写及难点。其中在堆栈初始化过程中要特别的注意两点:

①要尽量给堆栈分配快速和高带宽的存储器。

②尽量避免过早将处理器切换到用户模式,一般在系统初始化的最后阶段才切换到用户模式(用户模式没有权限通过修改CPSR来进行模式切换)。

嵌入式系统的迅猛发展,使启动代码的编写成为嵌入式系统开发人员应该具备的能力。本文有助于正在从事嵌入式ARM开发的读者理解启动代码的内涵与编写出适合自己的启动代码。


关键字:ARM7  启动代码  LPC2119 引用地址:如何编写ARM7的启动代码(LPC2119为例)

上一篇:基于ARM7内核LPC2119芯片实现双向DC/DC变换器的设计
下一篇:基于LPC2119微控制器设计实现高速公路隧道智能照明控制器的设计

推荐阅读最新更新时间:2024-11-13 19:54

基于GSM短消息的油罐区监控系统
1 引言 油品灌区监控系统是油库储备公司的基本组成部分。目前大多数油品罐区普遍存在技术落后、自动化水平低、手工作业等问题。因此,为了适应市场竞争要求,提高灌区安全运行,开发一种新型基于ARM7和GSM短消息的油罐监控系统。该系统设计利用ARM7丰富的外围模块、强大的管理功能和控制能力,以及GSM的网络覆盖面广、用户投资小、运营费用少等优点,将采集数据以短消息方式有效传给监控中心,再由控制中心处理数据并建立数据文件,从而解决油品灌区现场数据的传输和决策指令的发送问题。 2 系统总体结构设计 图1为基于GSM的油罐区远程监控系统总体结构,它由测控单元、GSM无线网络和监控中心构成。测控单元以微处理器LPC2119为核心,同
[单片机]
基于GSM短消息的油罐区监控系统
ARM7嵌入式系统中Bootloader分析与设计
1.引言 作为一种16/32位的高性能、低成本、低功耗的嵌入式RISC(Reduced Instruction Set Computer)微处理器,ARM(Advanced RISC Machines )微处理器目前已经成为应用最为广泛的嵌入式微处理器 。在嵌入式系统开发中Bootloader常常是嵌入式系统开发中可能遇到的第一个技术难点。应用程序运行环境能否正确构建,内核能否启动成功,都取决于Bootloader能否正确的工作。一个功能完善的嵌入式系统Bootloader还要求能够提供系统更新的能力,以及为了实现这一操作所需要的一个简单的命令控制台。本文在基于ARM7-uClinux嵌入式系统的硬件平台和软件平台基础上,描述了系统
[单片机]
S3C2416裸机开发系列八_MDK启动代码工程应用实例
笔者前面章节简单介绍了s3c2416启动代码的实现过程,启动代码就是用来处理cpu体系结构中一些底层内容,一个功能强大的启动代码是可以当作bootloader(如uboot)来用的。有了启动代码,用户就可以专注于用c来作其它的功能函数开发了,现今的c编译器效率都很高,很智能,不会逐句翻译用户的c代码,而是总体把握编译。用c开发项目对于代码移植,提高效率都是很有必要的,笔者此处就加入启动代码到c工程,用c开发的过程作一个简单的介绍。 1. 启动代码工程架构 与启动代码相关的代码文件放在System目录文件夹中。目录架构如下: s3c2416.s,启动代码文件,代码执行时的入口,用来初始化系统到一个必要的c环境中,最后进入c函数入口
[单片机]
S3C2416裸机开发系列八_MDK<font color='red'>启动</font><font color='red'>代码</font>工程应用实例
ARM7单片机轻松入门与实践
ARM7是32 位通用微处理器ARM(Advanced RISC Machines)家族中的一员,具有比较低的电源消耗和良好的性价比,基于(精简指令)RISC结构,指令集和相关的译码机制与微程序控制的复杂指令系统的计算机相比要相对简单,这使得它拥有比较高的指令处理能力和实时中断响应能力。 本课程是ARM7单片机学习者从入门到深入的一套经典视频教程,以初学者为对象,从零开始手把手教你学习单片机,循序渐进地基于理论讲解并结合实验项目实战开发,讲解当前最热门的ARM7单片机的C程序设计! 本教程的亮点就是在分析初学者认知规律的基础上,结合国内重点大学一线教师的教学经验以及借鉴国外经典教材的写作手法,对ARM7单片机的应用基础知
[单片机]
<font color='red'>ARM7</font>单片机轻松入门与实践
基于μC/OS-II操作系统KDG15A型远程控制开关的研究
  1.前言   随着煤矿综合自动化程度的提高,井下网络系统的应用也越来越广泛,通过网络系统不仅能在井下现场操作各种设备,同时能在地面实现远程控制,而且能在地面实时监测各种设备的运行参数等,真正实现远程综合自动化系统。   目前国内现场的远程控制开关种类比较繁杂,造成系统接人控制总线种类大,给现场应用造成困难,我单位目前研制的KDG15A型远程控制开关是KJ95N型煤矿综合监控系统的配套产品,通过现场总线RS485,用于远距离控制设备的开关,同时带有馈电状态检测功能,可反映被控设备的状态。   2.需求及技术分析   随着井下自动化程度的提高,井下各种设备的控制及监控系统,可以挪移到地面控制中心,实现集中控制,减少了人工系
[单片机]
基于μC/OS-II操作系统KDG15A型远程控制开关的研究
如何让 keil MDK v5 支持 ARM7/9 设备
最近有位同事接私活时遇到一个问题,用 Keil-5 可以打开甲方给的工程,但是仿真和下载出错。 根据报的错误,找到了问题,原来是 Keil 5 不支持 LPC2368 这款设备。如下图: 打开 pack installer 也没有找到 LPC2000 系列的单片机。如下图: 最后去官网溜达了一圈,在 MDK5 Device List 中找到了原因。第二段话说的就是: For maintaining existing MDK Version 4 projects, or using devices that are not yet supported by a Software Pack, please install Le
[单片机]
如何让 keil MDK v5 支持 <font color='red'>ARM7</font>/9 设备
如何使用Keil3开发51单片机程序
1.双击图标打开Keil软件 2.单击菜单栏 - 3.将新工程保存到一个文件夹 4.选择一款 CPU 芯片,这里STC89C52RC对应着Philips的P89V51RD2 5.提示是否复制8051的启动代码到文件夹,这里选择“否” 6.完成后,在Project Workspace中可以看到Source Group1 7.新建一个代码文件 8.以“*.c”作为后缀名保存 9.将刚刚保存的文件 led .c添加到工程中来 10.选中源代码文件,添加 11.可以看到led.c已经在Source Group1中 12.添加代码如下 13.单击 工具 栏上的“Op
[单片机]
如何使用Keil3开发51单片机程序
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved