1、目 录前言11 绪论21.1 嵌入式系统定义21.2 嵌入式系统的组成21.3 嵌入式系统的应用领域21.4 嵌入式系统的发展历史及趋势31.5 ARM概述32 系统需求分析72.1 需求分析72.2 系统总体设计73 系统硬件设计93.1 核心处理器LPC2114简介93.2 系统功能模块103.2.1 电源模块103.2.2 复位电路103.2.3 系统时钟电路113.2.4 JTAG接口电路123.2.5 键盘电路123.2.6 I2C接口电路123.3 硬件开发工具ORCAD9.2简介134 嵌入式系统软件开发144.1 嵌入式系统软件的组成144.2 嵌入式系统软件运行流程154.3
2、 LPC2114的启动代码154.4 C/OS-简介204.5 选择C/OS-的原因214.6 应用程序开发224.6.1 键盘输入控制224.6.2 中断程序234.6.3 定时器控制程序255 系统调试295.1 程序调试295.1.1 CodeWarrior IDE集成开发环境和AXD调试器说明295.1.2 工程的编辑305.1.3 工程的调试355.1.4 程序调试375.2 固化程序395.2.1 使用JTAG接口下载405.2.2 使用ISP下载40总结43参考文献44致谢词45附录46 前言随着电子技术和计算机技术的进一步发展,嵌入式系统将起着越来越重要的作用,无论是民用还是军
3、用随处都可以看见嵌入式系统的身影。在我国,到目前为止,在嵌入式系统研究方面,比起世界先进技术,落后了很多,基本上没多少核心技术,先进技术的知识产权都在国外。我国目前还没有生产出可以在市场上竞争的芯片,但是随着国家的重视和投资,以及不断吸收世界先进技术,在一些领域已经能够实现国产化了。但是这离许多世界先进技术还相差甚远。虽然现在经济全球化,但我们得到的只是一些落后的技术。因此必须培养自己的人才,研究核心技术,掌握核心技术。本次毕业设计的题目正是“基于LPC2114微处理器的嵌入式系统研究”。本次设计涉及到了嵌入式系统开发的两个重要模块。包括硬件开发和应用程序开发。旨在研究嵌入式系统的开发流程,掌
4、握嵌入式系统的基本开发方法,以及掌握一些硬件和软件的开发和调试工具。显然,本次设计的任务量是繁重的。再加上,以前我并没有接触过嵌入式系统这一领域。所以,对我来说,任务就更加繁重。但我相信,通过我的努力,一定可以完成本次设计的任务。并且为我以后的工作和学习打下坚实的基础。1 绪论1.1 嵌入式系统定义从应用来看:嵌入式系统是计算机的一种应用形式,通常是指嵌入到对象系统中的专用计算机系统。嵌入式系统被定义为:以应用为中心、以计算机技术为基础、软件硬件可裁剪、能适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。从组成来看:把基于处理器(通用处理器和嵌入式处理器)的设备称为计算机,
5、把计算机分成两大部分,即通用计算机和嵌入式计算机。嵌入式系统也称为嵌入式计算机,因此嵌入式系统被定义为非通用计算机系统,即专用计算机系统。1.2 嵌入式系统的组成一个典型的嵌入式系统主要由以下几部分组成:(1) 硬件系统硬件系统由嵌入式微处理器、外围接口硬件设备组成。(2) 嵌入式操作系统在嵌入式操作系统中,一般都要采用嵌入式实时操作系统(RTOS),RTOS一般包括实时内核(kernel)及用户特定的板级支持包(BSP),它介于硬件系统及上层软件之间,为所有的上层软件提供一个多任务的实时操作系统环境及一整套API。当然,在一些简单的嵌入式应用系统中,并没有操作系统的支持。应用程序直接对底层硬
6、件进行访问。(3) 应用软件应用软件是针对特定的应用需求开发的软件,完成嵌入式系统的主要功能。大部分嵌入式系统开发人员选用的软件开发模式是先在PC机上编写软件,再进行软件的移植工作。1.3 嵌入式系统的应用领域嵌入式系统广泛地应用在人们生活、工作的各个方面。如:(1)消费类电子产品。如机顶盒,个人移动设备(PDA),数码音频播放器(MP3),数码相机,视频游戏播放器,IP电话等等。(2)办公自动化产品。如激光打印机,传真机,扫描仪,复印机和LCD投影仪等。(3)控制系统与工业自动化。如智能控制设备,智能仪表、现场总线设备,数控机床,机器人等。(4)生物医学系统。如X光机的控制部件,EEG和EC
7、G设备,CT,超声检测设备,核磁共振设备等。(5)现场仪器。如测量温度,湿度,电压,电流的仪器。还有各种协议分析器,用于分析网络协议。还有数字示波器等。(6)网络通信设备。调制解调器,数据通信基础设备,IP网上多媒体设备,网关,路由器,加密解密设备,GPS设备,交换机,网络接入盒等。(7)电信设备。电话交换机,终端适配器TA,ATM交换机,帧中继和一些通信设备。1.4 嵌入式系统的发展历史及趋势 嵌入式系统的出现至今已经有30多年的历史了,嵌入式技术也历经了几个发展阶段。第一阶段是以单芯片为核心的可编程控制器形式的系统,同时具有与监测、伺服、指示设备相配合的功能。第二阶段是以嵌入式CPU为基础
8、、以简单操作系统为核心的嵌入式系统。第三阶段是以嵌入式操作系统为标志的嵌入式系统。第四阶段是以基于Internet为标志的嵌入式系统,这是一个正在迅速发展的阶段。就嵌入式系统的而言,其发展趋势表现在如下几个方面。(1)开发平台的完备性嵌入式系统的开发是一项系统的工程,涉及到软件,硬件,系统集成等诸多方面。有的嵌入式厂商不公仅提供处理器,还提供完备的开发工具。其开发工具包括硬件工具和软件工具。(2)嵌入式系统的网络化网络化主要表现在在两个方面,一方面是嵌入式处理器集成了网络接口,另一方面是嵌入式设备应用于网络环境中(3)系统的集成度的提高和性能指标的提高。未来的嵌入式产品,是软硬件高度集成的产品
9、。这就要求设计者尽可能地提高系统的可靠性,降低系统的功耗,精简系统的内核,降低成本,对操作系统进行裁剪,用高效率的算法开发应用程序。 (4)友好的人机界面大多数的嵌入式系统都与人进行交互,所以友好的人机界面是开发嵌入式系统的基本要求。随着嵌入式技术的发展,新的人机界面不断被开发出来,如手写输入技术,语音输入/输出技术,图像输出技术。1.5 ARM概述ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,1991年ARM公司成立于英国剑桥。ARM公司是专门从事基于RISC技术芯片设计开发的公司,作为知识产权供应商,本身不直接从事芯片生产,靠转让设计许可由合作公司生产
10、各具特色的芯片,世界各大半导体生产商从ARM公司购买其设计的ARM微处理器核,根据各自不同的应用领域,加入适当的外围电路,从而形成自己的ARM微处理器芯片进入市场。目前,总共有30多家半导体公司与ARM签订了硬件技术使用许可协议,其中包括Intel、IBM、LG半导体、NEC、SONY、菲利浦和国民半导体这样的大公司,至于软件系统的合伙人,则包括微软、升阳和MRI等一系列知名公司。基于ARM技术的微处理器应用约占据了32位RISC微处理器75以上的市场份额,ARM技术正在逐步渗入到我们生活的各个方面。ARM架构是面向低预算市场设计的第一款RISC微处理器。到目前为止,ARM微处理器及技术的应用
11、几乎已经深入到各个领域: 工业控制领域:作为32位的RISC架构,基于ARM核的微控制器芯片不断占据了高端微控制器市场的大部分市场份额,同时也逐渐向低端微控制器应用领域扩展,ARM微控制器的低功耗、高性价比,向传统的8位/16位微控制器提出了挑战。 无线通讯领域:目前已有超过85%的无线通讯设备采用了ARM技术, ARM以其高性能和低成本,在该领域的地位日益巩固。 网络应用:随着宽带技术的推广,采用ARM技术的ADSL芯片正逐步获得竞争优势。此外,ARM在语音及视频处理上进行了优化,并获得广泛支持,也对DSP的应用领域提出了挑战。 消费类电子产品:ARM技术在目前流行的数字音频播放器、数字机顶
12、盒和游戏机中得到广泛采用。 成像和安全产品:现在流行的数码相机和打印机中绝大部分采用ARM技术。手机中的32位SIM智能卡也采用了ARM技术。除此以外,ARM微处理器及技术还应用到许多不同的领域,并会在将来取得更加广泛的应用。采用RISC架构的ARM微处理器一般具有如下特点: 体积小、低功耗、低成本、高性能; 支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件; 大量使用寄存器,指令执行速度更快; 大多数数据操作都在寄存器中完成; 寻址方式灵活简单,执行效率高; 指令长度固定;ARM微处理器目前包括下面几个系列,以及其它厂商基于ARM体系结构的处理器,除了具有AR
13、M体系结构的共同特点以外,每一个系列的ARM微处理器都有各自的特点和应用领域。 ARM7系列 ARM9系列 ARM9E系列 ARM10E系列 SecurCore系列 Inter的Xscale Inter的StrongARM其中,ARM7、ARM9、ARM9E和ARM10为4个通用处理器系列,每一个系列提供一套相对独特的性能来满足不同应用领域的需求。SecurCore系列专门为安全要求较高的应用而设计。ARM7微处理器系列:ARM7系列微处理器为低功耗的32位RISC处理器,最适合用于对价位和功耗要求较高的消费类应用。ARM7微处理器系列具有如下特点: 具有嵌入式ICERT逻辑,调试开发方便。
14、极低的功耗,适合对功耗要求较高的应用,如便携式产品。 能够提供0.9MIPS/MHz的三级流水线结构。 代码密度高并兼容16位的Thumb指令集。 对操作系统的支持广泛,包括Windows CE、Linux、Palm OS等。 指令系统与ARM9系列、ARM9E系列和ARM10E系列兼容,便于用户的产品升级换代。 主频最高可达130MIPS,高速的运算处理能力能胜任绝大多数的复杂应用。ARM7系列微处理器的主要应用领域为:工业控制、Internet设备、网络和调制解调器设备、移动电话等多种多媒体和嵌入式应用。ARM7系列微处理器包括如下几种类型的核:ARM7TDMI、ARM7TDMI-S、AR
15、M720T、ARM7EJ。其中,ARM7TMDI是目前使用最广泛的32位嵌入式RISC处理器,属低端ARM处理器核。TDMI的基本含义为:T: 支持16位压缩指令集Thumb;D: 支持片上Debug;M: 内嵌硬件乘法器(Multiplier)I: 嵌入式ICE,支持片上断点和调试点;ARM处理器共有37个寄存器,被分为若干个组(BANK),这些寄存器包括: 31个通用寄存器,包括程序计数器(PC指针),均为32位的寄存器。 6个状态寄存器,用以标识CPU的工作状态及程序的运行状态,均为32位,目前只使用了其中的一部分。同时,ARM处理器又有7种不同的处理器模式,在每一种处理器模式下均有一组
16、相应的寄存器与之对应。即在任意一种处理器模式下,可访问的寄存器包括15个通用寄存器(R0R14)、一至二个状态寄存器和程序计数器。在所有的寄存器中,有些是在7种处理器模式下共用的同一个物理寄存器,而有些寄存器则是在不同的处理器模式下有不同的物理寄存器。ARM微处理器的在较新的体系结构中支持两种指令集:ARM指令集和Thumb指令集。其中,ARM指令为32位的长度,Thumb指令为16位长度。Thumb指令集为ARM指令集的功能子集,但与等价的ARM代码相比较,可节省3040以上的存储空间,同时具备32位代码的所有优点。ARM的设计实现了非常小但高性能的结构。ARM处理器结构的简单使ARM的内核
17、非常小,这样使器件的功耗也非常低。ARM是精简指令集计算机(RISC),因为它集成了非常典型的RISC结构特性: 一个大的、统一的寄存器文件; 加载存储结构,数据处理的操作只针对寄存器的内容,而不直接对存储器进行操作; 简单的寻址模式,所有加载存储的地址都只由寄存器的内容和指令域决定; 统一和固定长度的指令域,简化了指令的译码。 每一条数据处理指令都对算术逻辑单元(ALU)和移位器进行控制,以实现对ALU和移位器的最大利用; 地址自动增加和自动减少的寻址模式实现了程序循环的优化; 多寄存器加载和存储指令实现了最大数据吞吐量; 所有指令的条件执行实现了最快速的代码执行。 这些在基本RISC结构上
18、增强的特性使ARM处理器在高性能、低代码规模、低功耗和小的硅片尺寸方面取得了良好的平衡。2 系统需求分析2.1 需求分析本次毕业设计的任务是基于LPC2114微处理器的嵌入式系统的开发,要求系统具有时钟电路,电源电路,复位电路,键盘电路,I2C接口电路,JTAG接口电路。CPU模块是系统中最核心的部分,系统通过CPU处理数据,控制系统中的其他模块,使其他模块根据系统发出的指令工作并且使各个部分协调工作。CPU要正常工作,最基本的就是配置相应的时钟电路和电源电路。CPU通过时钟信号的驱动,一步一步的控制程序执行。电源模块除了给CPU提供电源外,同时给其它各功能模块也供电。 通过外部输入的5V电压
19、,在系统的滤波以及电压转换芯片后,得到内核及片内外设所需的工作电压1.8V和I/O所需的工作电压3.3V。复位电路为系统提供复位信号,以实现系统的初始化操作;当系统程序运行出错时或者操作错误使系统处于死锁状态时,为了摆脱困境,也需要复位信号将系统重新启动。键盘电路主要是通过按键控制程序的执行,有时也作为参数实现一些简单的数据输入。 带有I2C接口电路的器件可十分方便地用来将一个或多个微控制器及外围器件构成系统。仿真器接口用来对程序进行调试和固化。2.2 系统总体设计根据要求设计的嵌入式系统的原理框图如图3.1所示:图1 系统原理框图系统是通过模块化的设计方式来实现各个功能的,系统框图中包含了C
20、PU模块、电源模块、复位电路模块、系统仿真模块、键盘接口、I2C接口。3 系统硬件设计3.1 核心处理器LPC2114简介根据本系统的需求分析,从性能、功耗、价格等方面进行考虑,我们发现飞利蒲的LPC2114已完全能满足本系统的设计要求。所以我们采用LPC2114作为核心处理器来进行开发。LPC2114 是基于一个支持实时仿真和跟踪的32位ARM7TDMI-S CPU,并带有128 KB的高速Flash存储器,128位宽度的存储器接口和独特的加速结构,使32位代码能够在最大时钟速率下运行。对代码有严格控制的应用可使用16位Thumb模式将代码规模降低超过30,而性能损失却很少。由于LPC211
21、4具有非常小的尺寸和极低的功耗,它们非常适合于那些将小型化作为主要要求的应用,例如存储控制和POS机。带有宽范围的串行通信接口、片内多达64KB的SRAM,由于具有大的缓冲区和强大的处理器能力,它们非常适合于通信网关和协议转换器、软件调制解调器、声音识别以及低端的图像处理。而多个32位定时器、PWM输出和32个GPIO,使它们特别适用于工业控制和医疗系统。它的主要特性有:32位ARM7TDMI-S核,超小LQFP64封装。 16 KB片内静态RAM。 128KB片内Flash程序存储器,128位宽度接口/加速器可实现高达60 MHz工作频率。 通过片内boot装载程序实现在系统编程(ISP)和
22、在应用编程(IAP)。512字节行编程时间为1ms。单扇区或整片擦除时间为400ms。 Embedded ICE可实现断点和观察点。当使用片内RealMonitor软件对前台任务进行调试时,中断服务程序可继续运行。 嵌入式跟踪宏单元(ETM)支持对执行代码进行无干扰的高速实时跟踪。 4路10位A/D转换器,转换时间低至2.44s。 2个32位定时器(带4路捕获和4路比较通道)、PWM单元(6路输出)、实时时钟和看门狗。 多个串行接口,包括2个16C550工业标准UART、高速I2C接口(400 kbit/s)和2个SPI口。 通过片内锁相环(PLL)可实现最大为60MHz的 CPU操作频率。
23、向量中断控制器。可配置优先级和向量地址。 多达46个通用I/O口(可承受5V电压),9个边沿或电平触发的外部中断引脚。 片内晶振频率范围:130 MHz。 2个低功耗模式:空闲和掉电。 通过外部中断将处理器从掉电模式中唤醒。 可通过个别使能/禁止外部功能来优化功耗。 双电源 CPU操作电压范围:1.651.95 V(1.8 V 0.15 V) I/O操作电压范围:3.03.6 V(3.0 V 10%),可承受5V电压。3.2 系统功能模块3.2.1 电源模块LPC2114要使用两组电源,I/O口供电电源为3.3V,内核及片内外设供电电源为1.8V,所以系统设计为3.3V应用系统。系统电源电路如
24、图2所示: 图2 系统电源模块3.2.2 复位电路在系统中,复位电路主要完成系统上电复位和系统在运行时用户的按键复位功能。复位电路可由简单的RC电路构成,也可使用其他的相对较复杂,但功能更完善的电路。本系统采用简单的RC复位电路,经使用证明,其复位逻辑是可靠的。复位电路如图3所示:图3 系统复位电路本系统采用的低电平复位。当用户按下SW1时,C4两端的电荷被泻放掉,RESET端输出为低电平。从而达到复位的目的。在系统上电时,电阻R1向电容C4充电,当C1两端的电压未达到高电平的门限电压时,RESET输出为低电平,系统处于复位状态。而当C4两端达到高电平的门限电压时,RESET为高电平,系统进入
25、正常工作状态。3.2.3 系统时钟电路LPC2114可使用外部晶振或外部时钟源,内部PLL电路可调整系统时钟,使系统运行速度更快(CPU最大操作时钟为60MHz)。倘若不使用片内PLL功能及ISP下载功能,则外部晶振频率范围是1MHz30MHz,外部时钟频率范围是1MHz50MHz;若使用了片内PLL功能或ISP下载功能,则外部晶振频率范围是10MHz25MHz,外部时钟频率范围是10MHz25MHz。系统使用了外部11.0592MHz晶振,电路如图4所示图4 系统时钟电路3.2.4 JTAG接口电路通过JTAG接口,可对芯片内部的的所有部件进行访问,因而是开发调试嵌入式系统的一种简洁高效的手
26、段。目前JTAG接口的连接有两种标准,即14针和20针。本系统采用的是20针的JTAG仿真接口。标准的JTAG接口是4线:TMS、TCK、TDI、TDO,分别为测试模式选择、测试时钟、测试数据输入和测试数据输出。 图4 系统仿真电路3.2.5 键盘电路 LPC2114提供了32个可编程的I/O端口,用户可将每个端口配置为输入模式、输出模式或特殊功能模式,由片内的特殊功能寄存器控制。在该系统的设计中,采用通用I/O口动态扫描的方式,外扩44矩阵键盘,键盘扫描的工作原理比较简单,在此不作详述。图6 系统键盘电路3.2.6 I2C接口电路I2C总线是一种用于IC器件之间连接的二线制总线。它通过SDA
27、(串地数据线)及SCL(串行时钟线)两线在连接到总线的器件之间传送信息,并根据地址识别每个器件。LPC2114内含一个I2C总线控制器,可方便地与各种带有I2C接口的器件相连。在该系统中,外扩一片AT24C01作为I2C存储器。AT24C01提供128字节的EEPROM存储空间,可用于存放少量在系统中掉电需要保存的数据。图7 IC接口电路3.3 硬件开发工具ORCAD9.2简介 ORCAD9.2是一款功能强大的EDA(Electronic Design Automation 电子设计自动化)工具。它主要有3大基本的功能。即Capture CIS,PSpice,Layout Plus。在设计过程
28、中,我们用Capture CIS进行原理图的绘制,用PSpice进行电路仿真与分析,用Layout Plus进行PCB的设计。4 嵌入式系统软件开发4.1 嵌入式系统软件的组成 嵌入式系统的软件通常包括了以下几个部分:(1)初始化引导代码初始化引导代码是任何嵌入式系统上电复位后第一个执行的代码。(2)板级支持包 操作系统提供商为了解决硬件平台的差异性,通常把操作系统的共性部分利用标准的C语言实现,把依赖于硬件的部分提供给用户进行编写代码,操作系统规定了一个标准的规范,用户编写的这些代码为用户的定制硬件和操作系统之间提供了一个接口和支持平台,这一部分代码称为板级支持包。(3)嵌入式操作系统操作系
29、统是嵌入式系统的一个重要的组成部分,特别是对于复杂的嵌入式系统的开发。嵌入式操作系统位于板级支持包和应用软件之间,应用软件开发调用操作系统功能,操作系统的功能以API的形式提供。(4)网络协议栈 协议栈对于具有网络工能的嵌入式产品是必要的。目前嵌入式协议栈的提供有两种方式。一种是独立的第三方协议栈产品,一种是嵌入式操作系统的提供商提供的协议栈产品。(5)应用软件嵌入式系统的应用软件一般需要自主开发,不同的嵌入式系统的应用软件各具特色功能。(6)图形用户界面GUI 对于大多数嵌入式系统,图形用户界面是必需的。GUI运行在嵌入式操作系统之上,用户开发与用户交互的应用软件通过GUI的功能调用一实现。
30、基于嵌入式操作系统的嵌入式系统软件结构如下图: 4.2 嵌入式系统软件运行流程(1)从引导程序入口开始。(2)复位向量入口,此时中断是禁止的。(3)设置处理器的工作模式,通常使用复位时的默认模式。(4)设置RAM和ROM的工作参数,包括DRAM的刷新参数、地址空间分配等,至此嵌入式系统的处理器和存储器子系统达到运行状态。(5)设置操作系统运行所需要的数据段、堆栈空间等。(6)设置中断向量,中断向量的设置根据需要进行,也可以在其他的时间设置,但是一定要在中断允许之前完成。(7)操作系统的初始化。(8)进入用户的应用。到这里开始执行用户的应用程序代码。4.3 LPC2114的启动代码一般在32位A
31、RM应用系统中,软件大多数采用C语言进行编程,并且以嵌入式操作系统为开发平台,这样就大大提高了开发效率及软件性能。为了能够进行系统初始化,采用一个汇编文件作为启动代码是常用的做法,它可以实现堆栈初始化、中断系统初始化、I/O初始化外围初始化以及地址重映射等操作。 (1)文件的划分可将启动代码划分为4个文件:Vectors.s、Init.s、Target.c和Target.h。Vectors.s包含异常向量表堆栈初始化及中断服务程序与C程序的接口,可根据需要修改。Init.s包含系统初始化代码,并跳转到ADS提供的初始化代码,一般无需改动。而Target.s和Target.h包含目标板特殊的代码
32、,包括异常处理程序和目标板初始化程序,可根据程序的需要修改。这样做的目的是为了尽量减少汇编代码,同时把不需要修改的代码独立出来以减少错误改动。(2)异常向量表异常是由内部或外部源产生的,以引起处理器的一个事件。ARM处理器核支持7种类型的异常。异常出现后,CPU强制从异常类型对应的固定存储地址开始执行程序。这个固定的地址称为异常向量。异常向量表的代码如程序1。这段代码位于文件Vector.s中。程序1 异常向量表VectorsLDR PC,ResetAddr (1)LDR PC,UndefinedAddr (2)LDR PC,SWI-Addr (3)LDR PC,PrefetchAddr (4
33、)LDR PC,DataAbortAddr (5)DCD OxB9205f80 (6)LDR PC,PC,#-Oxff0 (7)LDR PC,FIQ-Addr (8)ResetAddr DCD Reset (9)UndefinedAddr DCD Undefined (10)SWI-Addr DCD SoftwareInterrupt (11)PrefetchAddr DCD PrefetchAbort (12)DataAbortAddr DCD DataAbort (13)Nouse DCD 0 (14)IRQ-Addr DCD IRQ-Handler (15)FIQ-Addr DCD FI
34、Q-Handler (16)向量从上到下依次为复位、未定义指令异常、软件中断、预取指令中止、预取数据中止、保留的异常IRQ和FIQ。(3)系统初始化代码由于LPC2114微控制器的存储系统比较简单 ,所以系统初始化代码也比较简单。这段代码位于文件Init.s中。程序2 系统初始化代码Reset BL InitStack (1) BL TargetResetInit (2)B _main (3)由文件Vector.s程序清单可知,在芯片复位时程序会跳转到标号Reset处。程序首先调用InitStack初始化各种模式的堆栈,然后调用TargetResetInit对系统进行基本的初始化,最后跳转到A
35、DS提供的启动代码main。main是ADS提供的启动代码起始位置,它初始化库并最终引导CPU进入mian函数。(4)初始化CPU 堆栈 初始化CPU堆栈InitStack MOV R0, LR ;设置管理模式堆栈 MSR CPSR_c, #0xd3 LDR SP, StackSvc ;设置中断模式堆栈 MSR CPSR_c, #0xd2 LDR SP, StackIrq ;设置快速中断模式堆栈 MSR CPSR_c, #0xd1 LDR SP, StackFiq ;设置中止模式堆栈 MSR CPSR_c, #0xd7 LDR SP, StackAbt ;设置未定义模式堆栈 MSR CPSR_
36、c, #0xdb LDR SP, StackUnd ;设置系统模式堆栈 MSR CPSR_c, #0xdf LDR SP, StackUsr MOV PC, R0StackUsr DCD UsrStackSpace + (USR_STACK_LEGTH - 1) * 4StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1) * 4StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1) * 4StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1) * 4Sta
37、ckAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1) * 4StackUnd DCD UndtStackSpace +(UND_STACK_LEGTH - 1) * 4;/* 分配堆栈空间 */AREA MyStacks, DATA, NOINIT, ALIGN=2UsrStackSpace SPACE USR_STACK_LEGTH * 4 ;用户(系统)模式堆栈空间SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;管理模式堆栈空间IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;中断模
38、式堆栈空间FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;快速中断模式堆栈空间AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;中止义模式堆栈空间UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;未定义模式堆栈因为程序需要切换模式,而且程序退出时CPU的模式已经不再是管理模式而是系统模式,LR已经不再保存返回程序地址,所以程序首先把返回地址保持到R0中,同时使用R0返回。然后程序把处理器模式转化为管理模式,并设置管理模式的堆栈指针。其中,变量StackSvc保存着管理模式的堆栈指针的初始值,Sv
39、cStackSpace是分配给管理模式的堆栈空间的开始地址,而SVCSTACKLEGTH是用户定义的常量,用于设置管理模式的堆栈空间的大小。程序使用同样的方法设置IRQ模式堆栈指针、FIQ模式堆栈指针、中止模式堆栈指针、未定义模式堆栈指针和系统模式堆栈指针。设置CPU堆栈大小的代码见程序清单6,这部分代码在文件Vectors的开始处,可以根据需要改变它。程序4 设置CPU堆栈大小USR_STACK_LEGTH EQU 64SVC_STACK_LEGTH EQU 0FIQ_STACK_LEGTH EQU 16IRQ_STACK_LEGTH EQU 64ABT_STACK_LEGTH EQU 0U
40、ND_STACK_LEGTH EQU 0(5)系统基本初始化为了使系统基本能够工作,必须在进入main()函数前对系统进行一些基本的初始化工作,这些工作TargetResetInit()完成。见程序5,这部分代码在target.c中定义,可根据需要修改。程序5 TargetResetInit函数sSgets114DEfor ARMGNU+GDBjivoid TargetResetInit(void) /* 设置系统各部分时钟 */ PLLCON = 1;#if (Fcclk / 4) / Fpclk) = 1 VPBDIV = 0;#endif#if (Fcclk / 4) / Fpclk)
41、= 2 VPBDIV = 2;#endif#if (Fcclk / 4) / Fpclk) = 4 VPBDIV = 1;#endif#if (Fcco / Fcclk) = 2 PLLCFG = (Fcclk / Fosc) - 1) | (0 5);#endif#if (Fcco / Fcclk) = 4 PLLCFG = (Fcclk / Fosc) - 1) | (1 5);#endif#if (Fcco / Fcclk) = 8 PLLCFG = (Fcclk / Fosc) - 1) | (2 5);#endif#if (Fcco / Fcclk) = 16 PLLCFG = (F
42、cclk / Fosc) - 1) | (3 5);#endif PLLFEED = 0xaa; PLLFEED = 0x55; while(PLLSTAT & (1 10) = 0); PLLCON = 3; PLLFEED = 0xaa; PLLFEED = 0x55; /* 设置存储器加速模块 */ MAMCR = 2;#if Fcclk 20000000 MAMTIM = 1;#else#if Fcclk 40000000 MAMTIM = 2;#else MAMTIM = 3;#endif#endif /* 初始化VIC */ VICIntEnClr = 0xffffffff; VICVectAddr = 0; VICIntSelect = 0;时钟是芯片各部分正常工作的基础,虽然时钟可以在任何时候设置,但为了避免混乱,最好在进入main()函数前设置。这段代码使用友好的接口正确地设置系统各部分时钟,设置方法是在系统配置文件config.h中定义各部分的时钟,见程序6。程序6 系统时钟设置/*系统设置,Fosc、Fcclk、Fcco、Fpclk必须定义*/#define Fosc 11059200 /晶振频率,1025MHz#define
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。
Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1
陕公网安备 61072602000132号 违法和不良信息举报:0916-4228922