毕业论文-ARM-Cortex-M0-嵌入式微处理器中断控制系统研究-_第1页
毕业论文-ARM-Cortex-M0-嵌入式微处理器中断控制系统研究-_第2页
毕业论文-ARM-Cortex-M0-嵌入式微处理器中断控制系统研究-_第3页
毕业论文-ARM-Cortex-M0-嵌入式微处理器中断控制系统研究-_第4页
毕业论文-ARM-Cortex-M0-嵌入式微处理器中断控制系统研究-_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

河南城建学院本科毕业设计(论文)摘要I毕业设计[论文]题目:学院:电气与信息工程学院专业:自动化摘要本文介绍了ARMCortex-M0嵌入式微处理器中断控制系统的设计。Cortex-M0是ARM公司开发的一款提供超低功耗、低成本微处理器,采用独特的中断控制系统,能够有效加速中断响应过程。通过对M0处理器的中断控制系统研究,可以更深入的了解微处理器架构以及中断控制系统设计。本文首先简述了嵌入式系统的结构、现状以及发展趋势,然后解释了中断和中断嵌套优先级的概念,重点介绍了ARMCortex-M0的结构特点,总结了M0异常和中断的特点,并对M0的中断优先级、嵌套向量中断控制器(NVIC)和ARMCortex微控制器软件接口标准(CMSIS)作说明,最后在ALTERADE2-115上用按键边沿触发中断,通过观察LED的闪烁状态来验证编写的中断控制程序。关键词:ARMCortex-M0,中断,NVIC=2\*ROMANIIABSTRACTThisarticledescribestheARMCortex-M0embeddedmicroprocessorinterruptcontrolsystemdesign.ARMCortex-M0isthedevelopmentofacompanytoprovideultra-low-power,low-costmicroprocessors,usingauniqueinterruptcontrolsystemthatcaneffectivelyacceleratetheprocessinterruptresponse.ByM0processor'sinterruptcontrolsystemcanbemorein-depthunderstandingofmicroprocessorarchitectureandinterruptcontrolsystemdesign.Thispaperoutlinesthestructureoftheembeddedsystem,statusquoanddevelopmenttrends,thenexplainedthepriorityofinterruptsandinterruptnestingconcept,focusingontheARMCortex-M0structuralcharacteristics,summarizedM0exceptionandinterruptcharacteristics,andtheinterruptpriorityforM0,nestedVectoredInterruptcontroller(NVIC)andtheARMCortexmicrocontrollerSoftwareInterfaceStandard(CMSIS)forillustration,thelastinALTERADE2-115withthekeypadonedge-triggeredinterrupts,byobservingthestatusLEDflashingtoverifythatimplementsinterruptcontrol.Keywords:ARMCortex-M0,interrupt,NVIC绪论1.1研究背景随着半导体行业进入深亚微米乃至纳米时代,在单一集成电路芯片上就可以实现一个复杂的电路系统,即SoC系统。随着人们对消费电子产品的多功能、智能化的要求越来越高,SoC芯片被大量使用,而微处理器是SoC系统的核心。纵观嵌入式微处理器的发展历史,从高端微控制器领域到低端微控制器领域,人们对低成本、低功耗、高性能的追求似乎永无止境。ARM公司推出了低成本、低功耗、高性能的Cortex-M系列产品,其中于2009年初推出了Cortex-M0处理器,这是市场上现有的除Cortex-M0+外尺寸最小、能耗最低、最节能的ARM处理器。该处理器能耗非常低、门数量少、代码占用空间小,能以8位器的价位获得32位处理器的性能,将逐步取代现有市场中的8051微控制器。1.2研究内容ARMCortex-M0处理器采用独特的中断控制系统,能够有效加速中断响应过程。通过对M0处理器的中断控制系统的研究,了解主流的嵌入式微处理器及其主流架构,掌握基本的微处理器中断处理流程,了解M0中断控制系统,并针对M0微处理器编写实例程序,使用keil软件仿真器仿真验证M0的中断控制过程。本次设计需要有单片机原理和C语言基础,自行查阅Cortex-M0的有关资料,了解M0中断控制系统,在此理论基础上,用M0的中断控制系统去控制LED的闪烁状态,具体来说就是:当按下电源开关后,LED开始慢闪,当按下按键后,LED进入快闪状态,当松开后,LED恢复慢闪,但是当按键按下去和松开的时间间隔小于200ms时,NVIC禁止中断,LED保持常亮。编写相应的程序代码,用keiluvision4编译代码并在ALTERADE2-115上进行中断控制实验。实验结果应符合中断控制系统控制要求,体现出M0中断控制的特点。1.3研究成果在ARMCortex-M0中断控制系统的设计中,了解基本的微处理器中断处理流程,重点是掌握ARMCortex-M0中断控制系统,对Cortex-M0处理器的抢占、末尾连锁、迟到等加速中断响应的技术作细致的了解,并对比所学过的51单片机的中断控制过程,充分的体会到M0能够有效加速中断响应过程的特点。1.4论文结构第二章讲述了嵌入式系统的概念、结构及应用领域,嵌入式微处理器分类、主流的体系结构和未来发展趋势,并介绍了当前主流的嵌入式操作系统。第三章简要的阐述了计算机技术上中断的概念、类型和作用,同时也介绍了中断嵌套优先级的概念。第四章介绍ARMCortex-M0的中断,首先简单介绍了M0的结构特点,其次讲解了M0的异常处理模型,另起一节讲解了嵌套向量中断控制器(NVIC),并在此总结了M0中断的特点,最后介绍了CMSIS软件接口标准。第五章为实验,按照控制要求进行硬、软件的设计,绘制程序流程图,编写程序代码,并记录下实验结果,并对其进行分析。河南城建学院本科毕业设计(论文)嵌入式系统2嵌入式系统2.1嵌入式系统简介嵌入式系统是将计算机的硬件或是软件嵌入其他机、电设备或应用系统中去,所构成了一种新的系统,即嵌入式系统。是以应用为中心,以计算机技术为基础,采用可裁剪软硬件,适用于对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统,用于实现对其他设备的控制、监视或管理等功能。嵌入式系统具有系统内核小、专用性强、系统精简、高实时性的特征[1]。由于嵌入式系统具有体积小、性能好、功耗低、可靠性高以及面向应用的突出特点,因此嵌入式系统已被广泛应用于军事、国防、电子信息、家电、网络通信、工业控制等领域。嵌入式系统的应用前景是非常广阔的,IC卡、手持电脑、智能手机、车载GPS、数字电视机顶盒,人们在生活中无时无处不接触到嵌入式产品,尤其是嵌入式无线网络产品的出现,使嵌入式产品和我们的生活紧密相连[2]。军事电子军事电子信息家电信息家电嵌入式应用嵌入式应用工业设备智能玩具工业设备智能玩具智能仪表通讯设备智能仪表通讯设备汽车电子移动设备汽车电子移动设备网络设备电子商务网络设备电子商务网络图嵌入式系统的应用领域工业控制工业控制消费电子军事国防网络其他……图2.1嵌入式系统的应用领域嵌入式系统可以说无处不在,无所不在,有着广阔的发展前景,也充满了机遇和挑战[3]。2.2嵌入式系统的组成与分类嵌入式系统一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统(可选),以及用户应用软件系统等四个部分组成[4]。嵌入式系统结构如图2.2所示。嵌入式应用软件系统嵌入式应用软件系统嵌入式操作系统嵌入式操作系统嵌入式处理器为核心的硬件平台嵌入式处理器为核心的硬件平台应用系统的I/O应用系统的I/O图2.2嵌入式系统结构嵌入式系统由嵌入式硬件与嵌入式软件组成。嵌入式硬件以芯片、模板、组件、控制器形式埋藏于设备内部。嵌入式软件是实时多任务操作系统和各种专用软件,一般固化在ROM或闪存中。嵌入式系统软硬兼施,融为一体,成为产品,但在开发过程中需要一些开发工具进行辅助开发。如图2.3所示。功能层功能层应用程序软件层文件系统图形用户接口任务管理实时操作系统(RTOS)中间层BSP/HAL硬件抽象层/板极支持包硬件层D/A嵌入式微处理器通用接口A/DROMI/OSDRAM人机交换接口图2.3嵌入式系统的整体架构嵌入式处理器毫无疑问是嵌入式系统的核心部分,其直接关系到整个嵌入式系统的性能。通常情况下嵌入式处理器被认为是对嵌入式系统中运算和控制核心器件总的称谓,但如果要仔细划分的话,大体上可以将其分为四大类,即嵌入式微处理器、嵌入式微控制器、嵌入式数字信号处理器、系统级芯片。①嵌入式微处理器:嵌入式微处理器(EmbeddedMicroprocessorUnit,简称MPU)的基础是通用计算机中的CPU。在应用中将微处理器装配在专门设计的电路板上,只保留和嵌入式应用有关的母板功能,这样可以大幅度减小系统体积和功耗。为了满足嵌入式应用的特殊要求,嵌入式微处理器虽然在功能上和标准微处理器基本是一样的,但在工作温度、抗电磁干扰、可靠性等方面一般都做了各种增强。②嵌入式微控制器:嵌入式微控制器(MicrocontrollerUnit,简称MCU,也称单片机)一般以某一种微处理器内核为核心,芯片内部集成ROM、RAM、总线、总线逻辑、定时计数器、I/O、串行口等各种必要功能和外设。为适应不同的应用需求,产品的处理器内核都是一样的,不同的是存储器和外设的配置及封装。和嵌入式微处理器相比,微控制器的最大特点是单片化,体积大大减小,从而使功耗和成本下降、可靠性提高。③嵌入式数字信号处理器:嵌入式数字信号处理器(EmbeddedDigitalSignalProcessor,简称DSP)对系统结构和指令进行了特殊设计,使其适合于执行DSP算法,编译效率较高,指令执行速度也较高。在数字滤波、FFT、谱分析等方面,DSP算法正在大量进入嵌入式领域,DSP应用正从在通用单片机中以普通指令实现DSP功能,过渡到采用嵌入式DSP处理器。④系统级芯片:系统级芯片(SystemOnChip,简称SOC,也称片上系统)是一个有专用目标的集成电路,其中包含完整系统,并有嵌入式软件的全部内容。在SOC中通常将一个以上MPU和DSP,以及RAM、ROM、Cache、时钟电路、定时器、中断控制器、I/O端口、ADC、DAC等电路集成到一块芯片中,同时可以由外部对芯片进行编程。应用SOC可以使系统电路板变得很简洁,起到减小体积、降低功耗、提高可靠性的作用。2.3常见嵌入式处理器的体系结构各种嵌入式处理器层出不穷,嵌入式处理器市场呈现出百花齐放的景象。目前常用的嵌入式处理器的主要结构归结起来有:8051体系结构、ARM体系结构、MIPS体系结构、PowerPC、DSP、x86等[2]。①8051体系结构:8051单片机最早由Intel公司推出。它在一块超大规模集成电路芯片上同时集成了CPU、ROM、RAM以及TIMER、COUNTER等部件,具有64KB的寻址能力。由于某些原因,8051在国内的使用非常普遍,但总的来说8051因其微处理器性能落后,仍然是一款低端产品。②ARM体系结构:ARM处理器遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场,基于ARM技术的处理器应用约占据了32位RISC微处理器75%以上的市场。目前市面上常见的ARM处理器架构,可分为ARM7、ARM9、ARM11和Cortex系列。IPhone、NOKIA、HTC等智能手机中的微处理器,就是由高通和德州仪器授权生产的ARM处理器。③MIPS体系结构:MIPS是美国历史悠久的RISC处理器体系,分为32-bit以及64-bit两大家族,以技术授权作为主要营利模式。MIPS除了在手机中应用的比例极小外,其在一般数字消费、网络语音、个人娱乐、通讯、与商务应用市场有着相当不错的成绩,不过近年来因为其它IP授权公司的兴起,其占有比率稍有衰退。MIPS应用最为广泛的应属家庭视听电器(包含机顶盒)、网通产品以及汽车电子方面。④PowerPC体系结构:PowerPC是早期Motorola和IBM联合为Apple的MAC机开发的CPU芯片,PowerPC的体系结构也是RISC,有200多条定长32位的指令,通常只执行一个单一的操作(比如将内存加载到寄存器,或者将寄存器数据存储到内存),同时支持字节(8位)、半字(16位)、字(32位)和双字(64位)数据类型。⑤DSP体系结构:DSP是一种专用微处理器,主要对数字信号进行实时处理,以得到相应的处理结果。DSP在存储容量和运算速度上都很高,成为语音处理、图像硬件处理技术的基础,同时在高端的工业控制方面也得到广泛应用,如空间矢量PWM控制系统,电机的DSP控制系统等。⑥x86体系结构:x86处理器应用在嵌入式系统的历史相当悠久,但其普遍都有功耗过高且芯片数量庞大的缺点,因而不适合应用在要求精简省电的嵌入式架构中。可是在有些对于能耗控制要求不高的领域,如工控电脑产业中,可以看到许多x86处理器仍然在被使用。同时Inter最新的嵌入式处理器Atom系列也是兼容x86结构的[5]。2.4嵌入式处理器的发展趋势①嵌入式处理器性能的提高。嵌入式处理器给人的第一感觉就是稳定、功耗低、性能差。实际上嵌入式处理器确实需要有很好的稳定性,较低的功耗,但这并不表明嵌入式处理器不需要高性能。事实上对于嵌入式处理器性能的追求从来就没有停止过,尤其在消费类电子产品中,嵌入式处理器的性能往往对产品具有决定性的影响。未来对于嵌入式处理器性能的追求肯定也不会停止,更好的处理器设计和更先进的制造工艺都将被运用进来,使嵌入式处理器的性能产生巨大的提升。②更高的集成度和更丰富的功能。嵌入式处理器的集成度将不断提高,越来越多的功能将被集成到处理器当中。如内存控制器已经被普遍集成到处理器当中,未来USB控制器、网络控制器,甚至是图形显示功能都可能被集成到处理器当中。③更低的功耗和更小的体积。嵌入式系统因其工作环境的限制,往往决定了其体积必须小巧,这就要求其核心部分嵌入式处理器也必须在性能保证的情况下尽可能的小。同时,嵌入式系统的能耗也必须很低,有的系统需要在一节电池供电的情况下使用几个月,这就对嵌入式处理器的功耗提出了近乎苛刻的要求,而这些也正是推动嵌入式处理器发展的动力。④嵌入式处理器中将会实现CPU和GPU的融合。CPU和GPU的融合并不是把一个CPU核心和一个GPU核心简单的集成到一块芯片当中。其还需要一套适合的调度算法,融合CPU强大的处理能力和GPU强大的运算能力,使之可以协同工作[2]。目前,AMD已经在通用处理器上实现了上述功能,而其嵌入式产品APU-C系列也开始出现在市场上,并被运用在平板电脑等领域,带来了性能的巨大提升,由此可见嵌入式处理器中CPU和GPU的融合是未来发展的必然趋势[15]。河南城建学院本科毕业设计(论文)中断3中断3.1中断的定义中断是指CPU正常执行程序被某种临时发生的事件所打断,当前程序暂时中止,处理器转去处理所发生的事件,处理完毕在返回执行暂时中止的程序。就是说,在当前程序中插进一段别的程序——中断服务程序或中断处理程序。CPU执行现行的程序被中断时的后继指令(下一条指令)的地址称为断点地址(简称断点)。中断时,CPU执行程序过程中所处的状态成为现场。中断流程如图3.1。正是有了中断,外部设备才能主动的改变CPU正常执行程序的顺序。何时中断,CPU预先并不知道,因此,中断具有随机性。由外部硬件引起的终端成为硬中断。有主机内部产生,或由程序预先安排的中断称为软中断。通常,在接收到来自外围硬件(相对于中央处理器和内存)的异步信号,或来自软件的同步信号之后,处理器将会进行相应的硬件/软件处理。发出这样的信号称为进行中断请求(interruptrequest,即IRQ)。硬件中断导致处理器通过一个上下文切换(contextswitch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通常作为CPU指令集中的一个指令,以可编程的方式直接指示这种上下文切换,并将处理导向一段中断处理代码。中断在计算机多任务处理,尤其是即时系统中尤为有用[10]。CPU收到中断信号CPU收到中断信号中断服务程序执行结束,返回继续执行原中断服务程序执行结束,返回继续执行原来的程序正在运行的程序正在运行的程序中断返回中断中断返回中断CPU中断正在执行的程序,转到执行中断服务程序CPU中断正在执行的程序,转到执行中断服务程序图图3.1中断处理过程3.2中断源凡是能够引起中断原因或提出中断请求的设备和异常故障均称被称为“中断源”。有以下几种:①外部设备请求中断。一般的外部设备(如键盘、打印机和A/D转换器等)在完成自身的操作后,向CPU发出中断请求,要求CPU为他服务。由计算机硬件异常或故障引起的中断,也称为内部异常中断。②故障强迫中断。计算机在一些关键部位都设有故障自动检测装置。如运算溢出、存储器读出出错、外部设备故障、电源掉电以及其他报警信号等,这些装置的报警信号都能使CPU中断,进行相应的中断处理。③实时时钟请求中断。在控制中遇到定时检测和控制,为此常采用一个外部时钟电路(可编程)控制其时间间隔。需要定时时,CPU发出命令使时钟电路开始工作,一旦到达规定时间,时钟电路发出中断请求,由CPU转去完成检测和控制工作。④数据通道中断。数据通道中断也称直接存储器存取(DMA)操作中断,如磁盘、磁带机或CRT等直接与存储器交换数据所要求的中断。⑤程序自愿中断。CPU执行了特殊指令(自陷指令)或由硬件电路引起的中断是程序自愿中断,是指当用户调试程序时,程序自愿中断检查中间结果或寻找错误所在而采用的检查手段,如断点中断和单步中断等[6]。3.3中断分类按中断处理方式,中断可分为以下几类:①简单中断,即采用周期窃用的方法来执行中断服务,有时也称数据通道或DMA。②程序中断,它不是窃用中央处理机的周期来进行中断处理,而是中止现行程序的执行,转去执行中断服务程序。按中断产生的方式,中断可分为:①自愿中断,即通过自陷指令引起的中断,或称软件中断。②强迫中断,这是一种随机发生的实时中断。按中断产生的位置,中断可分为:①外部中断,或称外部硬件实时中断,它由发至CPU某一引脚上的信号引起。②内部中断,或称软件指令中断,是为了处理程序运行过程中发生的一些意外情况或调试程序而提供的中断。3.4中断应具有的功能中断应具有以下功能:①实现中断及返回。当某一中断源发出申请时,CPU能决定是否响应这个中断请求(当CPU在执行更紧急、更重要的工作时,可以暂不响应中断),若允许响应这个中断请求,CPU必须在现行的指令执行完成后,把断点处的IP和CS值(即下一条应执行的指令的地址)、各个寄存器的内容和标志位的状态推入堆栈保留下来——称为保护断点和现场。然后转到需要处理的中断源的服务(InterruptServiceRoutine,即ISR)的入口,同时清除中断请求触发期。当中断处理完后,再恢复被保留下来的各个寄存器和标志位的状态(称为恢复现场),恢复IP和CS值(称为恢复断点),使CPU返回断点,继续执行主程序。②实现优先权排队。在系统中通常有多个中断源,会出现两个或更多个中断源同时提出中断请求的情况,这样就必须要设计者事先根据轻重缓急,给每个中断源确定一个终端级别——优先权。当多个中断源同时发出中断申请时,CPU能找到优先权级别最高的中断源,响应它的中断请求;在优先权级别最高的中断源处理完了以后,在相应级别较低的中断源。③高级中断源能中断低级的中断处理。当CPU响应某一中断源的请求,在进行中断处理时,若有优先级别更高的中断源发出中断申请,则CPU要能中断正在进行的中断服务程序;保留这个程序的断点和现场(类似于子程序嵌套),响应高级中断,在高级中断处理完以后,再继续进行被中断的中断服务程序。而当发出新的中断申请的中断源的优先级别与正在处理的中断源同级或更低时,则CPU就先不响应这个中断申请,直至正在处理的中断服务程序执行完以后才去处理新的中断申请。3.5中断嵌套与优先级3.5.1中断优先级为了管理众多的中断请求,需要按每个(类)中断处理的急迫程度,对中断进行分级管理,称其为中断优先级。在有多个中断请求时,总是响应与处理优先级高的设备的中断请求。中断的优先级有两个:查询优先级和执行优先级。=1\*GB3①中断的查询优先级是不可以更改和设置的。这是一个中断优先权排队的问题。是指多个中断源同时产生中断信号时,中断仲裁器选择对哪个中断源优先处理的顺序。而这与是否发生中断服务程序的嵌套毫不相干。当CPU查询各个中断标志位的时候,会依照上述5个查询优先级顺序依次查询,当数个中断同时请求的时候,会优先查询到高优查询先级的中断标志位,但并不代表高查询优先级的中断可以打断已经并且正在执行的低查询优先级的中断服务。IP寄存器不做设置,上电复位后为00H的优先级:外部中断0>定时/计数器0>外部中断1>定时/计数器1>串行中断=2\*GB3②中断的执行优先级就是你对IP寄存器的设置。在2个优先级的情况下,某位为1,则相应的中断源为高优先级;为0,则为低优先级。关于中断的优先级有三条原则:1)CPU同时接收到几个中断时,首先响应优先级最高的中断请求;2)正在进行的中断过程不能被新的同级或低行优优先级的中断请求所中断;3)正在进行的低行优优先级中断服务,能被高行优优先级中断请求中断。若同一执行优先级中的中断申请不止一个时,则有一个中断优先权排队问题。同一执行优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,优先权自高到低的顺序即:外部中断0>定时/计数0>外部中断1>定时/计数1>串行接口3.5.2中断嵌套当CPU正在处理优先级较低的一个中断,又来了优先级更高的一个中断请求,则CPU先停止低优先级的中断处理过程,去响应优先级更高的中断请求,在优先级更高的中断处理完成之后,再继续处理低优先级的中断,这种情况称为中断嵌套。中断程序嵌套模型如图3.2所示。中断3服务程序中断3服务程序中断2服务程序中断1服务程序中断2服务程序中断1服务程序主程序中断1请求中断2请求中断3请求中断1请求中断2请求中断3请求IRETIRET(中断返回)IRET(中断返回)IRET(中断返回)IRET(中断返回)图图3.2中断程序嵌套示意图当一个中断正在执行的时候,如果事先设置了中断优先级寄存器IP,那么当一个更高优先级的中断到来的时候会发生中断嵌套,如果没有设置则不会发生任何嵌套;如果有同一个优先级的中断触发,它并不是在“不断的申请”,而是将它相应的中断标志位置即IE寄存器的某位置位,当CPU执行完当前中断之后,按照查询优先级重新去查询各个中断标志位,进入相应中断[6]。3.6中断控制方式的优点中断是用以提高计算机工作效率、增强计算机功能的一项重要技术。如果计算机系统没有中断,则处理器与外部设备通信时,它必须在向该设备发出指令后进行忙等待(Busywaiting),反复轮询该设备是否完成了动作并返回结果。这就造成了大量处理器周期被浪费。引入中断以后,当处理器发出设备请求后就可以立即返回以处理其他任务,而当设备完成动作后,发送中断信号给处理器,后者就可以再回过头获取处理结果。这样,在设备进行处理的周期内,处理器可以执行其他一些有意义的工作,而只付出一些很小的、切换上下文所引发的时间代价。具体有以下好处:①同步操作。有了中断就可以使CPU和外设同时工作。CPU在启动外设工作后,就继续执行主程序,同时外设也在工作,当外设把数据准备好之后发出中断请求,请求CPU中断它的程序,执行输入或输出(中断处理),处理完成以后,CPU恢复执行主程序,外设也继续工作。并且有了中断功能,CPU可以命令多个外设同时工作。这样大大提高了CPU的利用率,也提高了输入输出的速度。②实现实时处理。当计算机用于实时控制时,中断是一个十分重要的功能。现场的各个参数、信息,可在任何时间发出中断申请,要求CPU处理;CPU则可以马上响应(若中断是开放的话)并加以处理。这样的及时处理在查询的工作方式下是做不到的。③故障处理。计算机在运行的过程中,往往会出现事先预料不到的情况,或者出现一些故障如电源突跳、存储出错、运算溢出等。计算就可以利用终端系统自行处理,而不必停机或报告工作人员。中断系统明显的提高了计算机系统中信息处理的并行度和处理器的效率,改善了计算机系统的性能。它解决了CPU与各种慢速外部设备之间的速度匹配问题。中断系统在故障检测、实时处理与控制、分时系统、多级系统与通信、并行处理、人机交互中得到广泛使用和不断发展。河南城建学院本科毕业设计(论文)ARMCortex-M0的中断4ARMCortex-M0的中断4.1ARMCortex-M0简介ARM公司于2009年推出了Cortex-M0微控制器,这是市场上现有的尺寸最小、能耗最低、最节能的ARM微控制器。该微控制器能耗非常低、门数量少、代码占用空间小,能保留8位微控制器的价位获得32位微控制器的性能。超低门数还使其能够用于模拟信号设备和混合信号设备及MCU应用中,可明显降低系统成本,同时保留功能强大的Cortex-M3微控制器的工具和二进制兼容能力。该微控制器的推出把ARM的MCU路线图拓展到了超低能耗MCU和SoC应用中,如医疗器械、电子测量、照明、智能控制、游戏设置、紧凑型电源、电源和马达控制、精密模拟系统和IEEE802.15.4(ZigBee)及Z-Wave系统等[13]。4.2ARMCortex-M0总线架构随着深亚微米工艺技术日益成熟,集成电路芯片的规模越来越大。数字IC从基于时序驱动的设计方法,发展到基于IP复用的设计方法,并在SOC设计中得到了广泛应用。在基于IP复用的SoC的设计中,片上总线设计是最关键的问题。为此,业界出现了很多片上总线标准。其中,由ARM公司推出的AMBA片上总线受到了广大IP开发商和SoC系统集成者的青睐,已成为一种流行的工业标准片上结构。AMBA规范主要包括了系统总线(AdvancedHighperformanceBus,简称AHB)和外围总线(AdvancedPeripheralBus,简称APB)[7]。 图图4.1Cortex-M0处理器架构Cortex-M0属于ARMv6-M架构,包括1颗专为嵌入式应用而设计的ARM核、紧耦合的可嵌套中断处理器NVIC、可选的唤醒中断控制器WIC,对外提供了基于AMBA结构的AHB-lite总线和基于CoreSight技术的SWD或JTAG调试接口。Cortex-M0处理器的硬件实现包含多个可配置选项:中断数量、WIC、睡眠模式和节能措施、存储系统大小端模式、系统滴答时钟等,半导体厂商可以根据应用需要选择合理的配置[14]。Cortex-M0处理器架构如图4.1所示。4.3异常处理模型4.3.1异常状态=1\*GB3①未激活(Inactive)异常没有被激活也没有被挂起。=2\*GB3②挂起(Pending)异常正等待被处理器服务。来自外设或软件的中断请求,能让相应中断变为挂起状态。=3\*GB3③激活(Active)异常正在被处理器服务,并且服务尚未结束。注意:一个异常处理能中断另一个异常处理,在这种情况下,两个异常都处于激活态。=4\*GB3④激活且挂起(Activeandpending)异常正在被处理器服务时,又出现了来自同一异常源的异常。4.3.2异常类型=1\*GB3①Reset复位由加电或热复位引起,异常模型把复位当作一个特殊形式的异常。当复位信号有效时,无论指令执行到什么位置,处理器都停止当前的指令。复位信号失效之后,从复位异常规定的入口地址处开始执行,按Thread模式工作。=2\*GB3②NMI不可屏蔽中断可由外设引起或软件触发,NMI是除Reset之外,最高优先级的异常,NMI被永久允许,拥有固定的优先级-2。NMI不能被:a.任何别的异常屏蔽或阻止;b.除复位之外的任何异常抢占。=3\*GB3③HardFault硬故障是指在正常情况或异常处理时出现错误(error)所引起的一种异常,硬故障有固定的优先级-1,表明硬故障比任何一个可以配置优先级的异常的优先级都高。=4\*GB3④SVCall系统服务调用,利用SVC指令调用系统服务。=5\*GB3⑤PendSV可挂起的系统服务请求,是一种中断驱动的请求,用于面向系统级服务。在操作系统环境下,当没有别的异常激活时,使用PendSV进行上下文切换。=6\*GB3⑥SysTick如果处理器实现系统滴答定时器,那么SysTick是由系统滴答定时器计数到0时所产生的一种异常。软件也能产生SysTick异常,在操作系统环境下,处理器能使用这一异常作为系统滴答计时。=7\*GB3⑦中断(IRQ)中断是由外设或软件请求而产生的异常,所有的中断对指令的执行是异步进行的。在计算机系统中,外设通过中断与处理器通信[16]。各种异常的优先级如下表4.1所示。表4.1不同类型异常的优先级异常编号IRQ编号异常类型优先级向量地址激活1-Reset-3,最高0x00000004异步2-14NMI-20x00000008异步3-13HardFault-10x0000000同步4-10-保留11-5SVCall可配置0x000000同步12-13-保留14-2PendSV可配置0x00000038异步15-1SysTick-0x000000异步15-保留可配置--16及以上0及以上IRQ可配置0x000000040及以上异步为简化软件层,CMSIS仅使用IRQ号,因此采用负数作为异常的编号,IPSR返回异常编号。如果处理器没有系统滴答定时器,则异常15保留。IRQ中断号是在处理器实现时定义的,范围是1-32。未实现的IRQ异常编号被保留,例如,如果某处理器仅实现一个IRQ,则异常号17及以上的编号均被保留。增长步长为4。对于异步异常,除Reset外,处理器在异常被触发到异常开始被处理的这段时间内,仍能继续执行指令。特权软件可以禁止以上具有可配置优先级的异常。4.3.3异常处理=1\*GB3①ISRs中断服务子程序处理IRQ中断异常。=2\*GB3②Faulthandler故障处理程序处理硬故障。=3\*GB3③SystemhandlersNMI,PendSV,SVCall,SysTick和HardFault。4.3.4异常向量表异常向量表包含堆栈指针的复位值,以及起始地址。堆栈指针的复位值和起始地址一起被称为异常向量,用于所有异常处理。下图列出了异常向量表中的异常向量的次序。每一个向量的最低位必须为1,表明异常处理是用Thumb代码实现的。Cortex-M0异常向量表如下表4.2所示。表4.2Cortex-M0异常向量表16+nn0x440x40+4nIRQn0x440x40+4n…………171IRQ11600x40IRQ00x4015-10x3C0x3C14-20x100x2C0x380x100x2C0x3813Reserved1211-5SVCall10Reserved9876543-130x0C0x0C2-140x040x08NMI0x040x081Reset-0x00InitialSPvalue0x004.3.5异常优先级所有的异常都有一个优先级。优先级数值越小,优先级越高。除Reset、HardFault和NMI之外,其余所有异常都能配置其优先级。如果软件没有配置优先级,那么所有可配置优先级的异常的优先级为0。可配置优先级的数值范围是0-192,步长为64。Reset、HardFault和NMI是具有负数值的固定优先级异常,比其它异常具有更高的优先级。给IRQ[0]分配一个较大的优先级数值,而给IRQ[1]分配一个较小的优先级数值,就意味着IRQ[1]比IRQ[0]的优先级高,如果IRQ[1]和IRQ[0]都被触发,则IRQ[1]比IRQ[0]先执行。如果多个挂起的异常具有同等的优先级,那么具有较小异常号的异常优先执行。例如,如果IRQ[0]和IRQ[1]具有相同的优先级,且都挂起,则IRQ[0]比IRQ[1]优先执行。当处理器在执行一个异常处理时,如果有更高优先级的异常发生,则该异常可以被抢占。如果发生的异常与正在执行的异常具有相同的优先级,则不管其异常号为多少,正在执行的异常都不会被抢占,而新发生的异常的状态变为挂起。4.3.6异常处理的进入与返回=1\*GB3①抢占(Preemption)。当处理器在执行一个异常处理时,另一个异常处理可以抢占这个正在被执行的异常处理,只要其优先级比正在被处理的异常优先级高。一个异常处理抢占另一个异常处理,被称为异常嵌套。=2\*GB3②返回(Return)。当没有以下情况时,异常处理结束之后就异常返回:1)没有挂起的异常需要服务。2)所完成的异常处理不是一个迟到异常。处理器从堆栈弹出数据,现场恢复到中断发生之前的状态。=3\*GB3③尾链(Tail-chaining)。该机制加速了异常服务。当一个异常处理刚好完成时,若此时有一个挂起的异常满足进入执行的条件,则从堆栈弹出数据的操作就跳过,直接转到这个新的异常处理。=4\*GB3④迟到(Late-arriving)。该机制加速抢占。当一个异常处理正在保存状态时,如果出现了一个更高优先级的异常,则处理器切换去执行这个更高优先级的异常,为新异常初始化预取向量。迟到异常并不影响向量的保存,因为两个异常需要保存的状态是一致的。在迟到异常返回时,正常的尾链规则依然有效。=5\*GB3⑤异常进入。有一个具有足够高优先级的挂起异常,以及以下条件之一,则可以进入异常:1)处理器处于Thread模式。2)新的异常比正在处理的异常具有更高的优先级。这种情况下,新异常抢占正在执行的异常。当一个异常抢占另一个异常时,将出现异常嵌套。足够高优先级的含义是,该异常比屏蔽寄存器的任一有限集的优先级都高。而比有限集的优先级低的异常就挂起,不执行。当处理器处理一个异常时,除非该异常是一个尾链或迟到的异常,处理器把信息压入当前堆栈,这一操作称为入栈,而这个8字的数据结构被称为一个堆栈帧,堆栈帧包含如下图4.2所示。DecreasingDecreasingSP+0x00SP+0x04SP+0x08SP+0x0CSP+0x10SP+0x14SP+0x18 SP+0xSP+0x00SP+0x04SP+0x08SP+0x0CSP+0x10SP+0x14SP+0x18 SP+0x1CxPSRAddressAddressLRR12R3R2R1图4.2堆栈帧入栈后,堆栈指针指向帧的最低地址,堆栈帧是双字地址对齐的。地址,该地址值保存在堆栈帧信息的PC中,因此被中断程序能恢复现场。处理器从向量表中读取异常处理程序的起始地址,当保护现场的入栈操作完成后,处理器开始执行异常处理程序。与此同时,处理器会将一个EXC_RETURN值写到LR寄存器,这能指明与堆栈信息帧相应的堆栈指针,以及进入异常之前处理器所处的操作模式。如果在进入异常时没有发生更高优先级的异常,则处理器开始执行该异常处理,并自动把该异常的状态由挂起修改为激活。如果在进入异常时发生了另一个更高优先级的异常,则处理器将执行高优先级的异常处理,先前的异常的挂起状态保持不变,这属于迟到异常的情况。⑥异常返回。当处理器处于Handler模式,且执行以下之一指令将PC的值置为EXC_RETURN的值,则发生异常返回:1)执行POP指令,加载PC寄存器。2)执行BX指令(任何寄存器均可)。在异常进入时,处理器把EXC_RETURN的值保存到LR寄存器。处理器根据此数值来决定异常处理完成时的动作。EXC_RETURN值的[31:4]位是0xFFFFFFF,当处理器加载的值与之匹配时,处理器将检测到这不是一个正常的分支操作,而是异常结束。因此,处理器将开始异常返回操作。EXC_RETURN值的[3:0]位指出所需的返回堆栈以及处理器模式,如表4.3所示。表4.3异常返回行为EXC_RETURN描述0xFFFFFFF1返回Handler模式。异常返回从主站获取状态。返回之后使用MSP。0xFFFFFFF1返回Thread模式。异常返回从主站获取状态。返回之后使用MSP。0xFFFFFFF1返回Thread模式。异常返回从主站获取状态。返回之后使用MSP。其他值保留⑦故障处理。故障是异常的一个子集。在NMI或HardFault异常处理时发生的故障将会引起HardFault异常或导致锁定(Lockup)。故障包含:执行一条SVC指令,该指令的优先级高于或等于SVCall。缺少调试器连接时,执行BKPT指令。在加载或存储数据时,系统产生总线错误。执行XN存储区的指令。执行来自系统已产生总线故障的地址位置的指令。取向量时系统产生总线错误。执行一条未定义的指令。T位已清为0,处理器不在Thumb状态时执行指令。试图读取或保存数据到未对齐的地址。注意,只有Reset和NMI能抢占具有固定优先级的HardFault异常。而HardFault异常则能抢占除Reset、NMI或另一个HardFault异常之外的所有异常[6]。⑧锁定。以下这些情况处理器会进入锁定状态:执行NMI或HardFault异常处理时发生故障;或在使用MSP异常返回时,还没有从堆栈恢复PSR寄存器的值系统就产生总线错误。当处理器处于锁定状态时,不能执行任何指令。处理器将保持锁定状态直到以下情况之一发生:处理器被复位;调试器中止处理器运行;发生NMI异常,并且当前锁定是处于HardFault异常处理中。注意如果锁定状态出现在NMI异常处理中,后续的NMI异常不能导致处理器离开锁定状态[7]。4.3.7Cortex-M0异常处理机制=1\*GB3①异常的流程当异常发生时,Cortex-M0通过硬件自动按顺序8个寄存器压栈:将编程计数器(PC)、编程状态寄存器(XPSR)、链接寄存器(LR)和R0~R3、R12等寄存器压进堆栈(在完成压栈之后,SP减小8个字)。在Dbus(数据总线)保存处理器状态的同时,处理器通过Ibus(指令总线)从一个可以重新定位的向量表中识别出异常向量,并获取ISR函数的地址,也就是保护现场与取异常向量是并行处理的。一旦压栈和取指令完成,中断服务程序或故障处理程序就开始执行。执行完ISR,硬件进行出栈操作,中断前的程序恢复正常执行。下图4.3为Cortex-M0处理器的异常处理流程。复位复位图4.3图4.3Cortex-M0处理器的异常处理流程=2\*GB3②异常的进入Cortex-M0支持迟到和抢占机制,以便对各种可能事件做出确定性的响应。抢占是一种对更高优先级异常的响应机制。Cortex-M0异常抢占的处理过程如下图4.4所示。当新的更高优先级异常到来时,处理器打断当前的流程,执行更高优先级的异常操作,这样就发生了异常嵌套。迟到是处理器用来加速抢占的一种机制。如果一个具有更高优先级的异常在上一个异常执行压栈期间到达,则处理器保存状态的操作继续执行,因为被保存的状态对于两个异常都是一样的。但是,NVIC马上获取的是更高优先级的异常向量地址。这样在处理器状态保存完成后,开始执行高优先级异常的ISR。异常的抢占流程如图4.4所示。抢占抢占执行指令执行指令4.4异常的抢占流程=3\*GB3③异常的返回Cortex-M3异常返回的操作如下图4.5所示。当从异常中返回时,处理器可能会处于以下情况之一:1)尾链到一个已挂起的异常,该异常比栈中所有异常的优先级都高;2)如果没有挂起的异常,或是栈中最高优先级的异常比挂起的最高优先级异常具有更高的优先级,则返回到最近一个已压栈的ISR;3)如果没有异常已经挂起或位于栈中,则返回到Thread模式。为了应对异常返回阶段可能遇到的新的更高优先级异常,Cortex-M0支持完全基于硬件的尾链机制,简化了激活的和未决的异常之问的移动,能够在两个异常之间没有多余的状态保存和恢复指令的情况下实现back-to-back处理。尾链发生的2个条件:异常返回时产生了新的异常;挂起的异常的优先级比所有被压栈的异常的优先级都高。尾链发生后,Cortex-M0处理过程如下图4.5中尾链分支所示。这时,Cortex-M0处理器终止正在进行的出栈操作并跳过新异常进入时的压栈操作,同时通过Ibus立即取出挂起异常的向量。在退出前一个ISR返回操作6个周期后,开始执行尾链的ISR。返回返回执行指令执行指令执行指令执行指令图图4.5异常的返回4.4嵌套向量中断控制器Cortex-M0提供中断控制器,作为异常模式的组成部分,称之为嵌套向量中断控制器(NVIC)。它与微控制器内核紧密联系,并具有以下特性:①支持嵌套和向量中断②自动保存和恢复微控制器状态③可动态改变优先级④简化的精确的中断延迟NVIC对所有支持的异常按优先级排序并处理,所有异常在处理模式处理。NVIC结构支持具有四级优先级的32个(IRQ[31:0])离散中断。所有的中断和大多数系统异常可以配置为不同优先级。当中断发生时,NVIC将比较新中断与当前中断的优先级,如果新中断优先级高于当前中断,则新中断将代替当前中断被处理。当任何中断被响应时,中断服务程序ISR的起始地址可从内存的向量表中取得。不需要确定哪个中断被响应,也不要软件分配相关中断服务程序(ISR)的起始地址。当起始地址取得时,NVIC将自动保存处理状态,包括以下寄存器PC,、PSR、LR、R0~R3、R12的值到栈中。在ISR结束时,NVIC将从栈中恢复相关寄存器的值,恢复正常操作,因此微控制器将花费更少的确定的时间去处理中断请求。NVIC支持末尾连锁(TailChaining),有效处理背对背中断(back-to-backinterrupts),即无需保存和恢复当前状态从而减少从当前ISR结束切换到挂起的ISR的延迟时间。NVIC还支持晚到(LateArrival),改善同时发生的ISR的效率。当较高优先级中断请求发生在当前ISR开始执行之前(保存微控制器状态和获取起始地址阶段),NVIC将立即选择处理更高优先级的中断,从而提高了实时性[8]。开关全局中断用到的函数为__enable_irq()、__disable_irq()。4.4.1异常模式和系统中断映射表4.5列出了NuMicroM051系列支持的异常模式。软件可以对其中一些异常以及所有中断设置4级优先级。最高用户可配置优先级记为0,最低优先级记为3,所有用户可配置的优先级的默认值为0。注意:优先级为0在整个系统中为第4优先级,排在Reset、NMI与HardFault之后[17]。表4.4系统中断映射异常名称向量号优先级Reset1-3NMI2-2HardFault3-1-4~10-SVCall11可配置-12~13-PendSV14可配置SysTick15可配置Interrupt(IRQ0~IRQ31)16~47可配置表4.5异常模式异常号向量地址中断号中断名源IP中断描述掉电1-150x00-0x3C系统异常160x400BOD_OUTBrown-Out欠压检测中断Yes170x441WDT_INTWDT看门狗定时器中断Yes180x482EINT0GPIOP3.2脚上的外部信号中断Yes190x4C3EINT1GPIOP3.3脚上的外部信号中断Yes200x504GP01_INTGPIOP0[7:0]/P1[7:0]外部信号中断Yes210x545GP234_INTGPIOP2[7:0]/P3[7:0]/P4[7:0]外部信号中断,除P32和P33Yes220x586PWMA_INTPWM0~3PWM0,PWM1,PWM2和PWM3中断No230x5C7PWMB_INTPWM4~7PWM4,PWM5,PWM6,PWM7中断No240x608TMR0_INTTMR0Timer0中断No250x649TMR1_INTTMR1Timer1中断No260x6810TMR2_INTTMR2Timer2中断No270x6C11TMR3_INTTMR3Timer3中断No280x7012UART0_INUART0UART0中断Yes290x7413UART1_INTUART1UART1中断Yes300x7814SPI0_INTSPI0SPI0中断No310x7C15SPI1_INTSPI1SPI1中断No32-330x70-0x8416-17340x8818I2C_INTI2CI2C中断No35-430x8C-0xAC19-27440xB028PWRWU_INTCLKC从掉电状态唤醒的时钟控制器中断Yes450xB429ADC_INTADCADC中断No46-470xB8-0xBC30-31表4.6向量表格式向量表字偏移量描述0SP_main-主堆栈指针VectorNumber异常入口指针,用向量号表示表4.7系统中断映射异常名称向量号优先级Reset1-3NMI2-2HardFault3-1-4~10-SVCall11可配置-12~13-PendSV14可配置SysTick15可配置Interrupt(IRQ0~IRQ31)16~47可配置当任何中断被响应时,微控制器会自动从内存的向量表中获取中断服务程序(ISR)的起始地址。对ARMv6-M,向量表的基地址固定在0x00000000。向量表包括复位后栈指针的初始值,所有异常处理数的入口地址。在定义的向量号定义向量表中与上一部分说明的异常处理函数入口相关的入口序[6]。4.4.2操作描述通过写相应中断使能设置寄存器或清使能寄存器位域,可以使能NVIC中断或禁用NVIC中断,这些寄存器通过写1使能和写1清零,读取这两种寄存器均返回当前相应中断的使能状态。当某一个中断被禁用时,中断声明将使该中断挂起,然而,该中断不会被激活。如果某一个中断在被禁用时处于激活状态,该中断就保持在激活状态,直到通过复位或异常返回来清除。清使能位可以阻止相关中断被再次激活。NVIC中断可以使用互补的寄存器对来挂起/解除挂起以使能/禁用这些中断,这些寄存器分别为Set-Pending寄存器与Clear-Pending寄存器,这些寄存器使用写1使能和写1清零的方式,读取这两种寄存器返回当前相应中断的挂起状态。Clear-Pending寄存器不会对处于激活状态的中断的执行状态产生任何影响。NVIC中断通过更新32位寄存器中的各个8位字段(每个寄存器支持4个中断)来分配中断的优先级。与NVIC相关的通用寄存器都可以从内存系统控制空间的一块区域访问[9]。表4.8IRQ0~IRQ31设置挂起控制寄存器(NVIC_ISPR)Bits描述[31:0]SETENA使能1个或多个中断每位代表从IRQ0~IRQ31的中断号(量号16~47)。写1使能相关中断。写0无效。寄存器读取返回当前使能状态。表4.9NVIC控制寄存器寄存器偏移量R/W描述复位后的值SCS_BA=0xE000_E000NVIC_ISERSCS_BA+100R/WIRQ0~IRQ31设置使能控制寄存器0x0000_0000NVIC_ICERSCS_BA+180R/WIRQ0~IRQ31清使能控制寄存器0x0000_0000NVIC_ISPRSCS_BA+200R/WIRQ0~IRQ31设置挂起控制寄存器0x0000_0000NVIC_ICPRSCS_BA+280R/WIRQ0~IRQ31清挂起控制寄存器0x0000_0000NVIC_IPR0SCS_BA+400R/WIRQ0~IRQ3优先级控制寄存器0x0000_0000NVIC_IPR1SCS_BA+404R/WIRQ4~IRQ7优先级控制寄存器0x0000_0000NVIC_IPR2SCS_BA+408R/WIRQ8~IRQ11优先级控制寄存器0x0000_0000NVIC_IPR3SCS_BA+40CR/WIRQ12~IRQ15优先级控制寄存器0x0000_0000NVIC_IPR4SCS_BA+410R/WIRQ16~IRQ19优先级控制寄存器0x0000_0000NVIC_IPR5SCS_BA+414R/WIRQ20~IRQ23优先级控制寄存器0x0000_0000NVIC_IPR6SCS_BA+418R/WIRQ24~IRQ27优先级控制寄存器0x0000_0000NVIC_IPR7SCS_BA+41CR/WIRQ28~IRQ31优先级控制寄存器0x0000_0000表4.10IRQ0~IRQ31清使能控制寄存器(NVIC_ICER)Bits描述[31:0]CLRENA禁用1个或多个中断,每位代表从IRQ0~IRQ31的中断号(向量号:16~47)。写1禁用相应中断。写0无效。寄存器读取返回当前使能状态。表4.11IRQ0~IRQ31设置挂起控制寄存器(NVIC_ISPR)Bits描述[31:0]SETPEND软件写1挂起相应中断每位代表从IRQ0~IRQ31的中断号(向量号:16~47)。写0无效。寄存器读取返回当前挂起状态。表4.12IRQ0~IRQ31清挂起控制寄存器(NVIC_ICPR)Bits描述[31:0]CLRPEND写1清除相应中断挂起,每位代表从IRQ0~IRQ31的中断号(向量号:16~47)。写0无效。寄存器读取返回当前挂起状态。表4.13NMI中断源选择控制寄存器(NMI_SEL)Bits描述[31:5]--[4:0]NMI_SELCortex-M0的NMI中断源可以从interrupt[31:0]中选择一个NMI_SELbit[4:0],用于选择NMI中断源表4.14IRQ[M]~IRQ[M+3]中断优先级寄存器(NVIC_IPR[N])Bits描述[31:30]PRI_[M+3]IRQ[M+3]优先级0表示最高优先级&3表示最低优先级[23:22]PRI_[M+2]IRQ[M+2优先级0表示最高优先级&3表示最低优先级[15:14]PRI_[M+1]IRQ[M+1]优先级0表示最高优先级&3表示最低优先级[7:6]PRI_[M]IRQ[M]优先级0表示最高优先级&3表示最低优先级M:0、4、8、12、16、20、24、28N:0、1、2、3、4、5、6、7表4.15NMI中断源选择控制寄存器(NMI_SEL)Bits描述[31:5]--[4:0]NMI_SELCortex-M0的NMI中断源可以从interrupt[31:0]中选择一个NMI_SELbit[4:0],用于选择NMI中断源表4.16MCU中断请求源寄存器(MCU_IRQ)Bits描述[31:0]MCU_IRQMCU_IRQ源寄存器MCU_IRQ从外围设备收集所有中断,同步对Cortex-M0产生中断。以下两种模式均可中断Cortex-M0,正常模式与测试模式。MCU_IRQ从每一个外设收集中断,同步他们,然后触发Cortex-M0中断。MCU_IRQ[n]是0:置MCU_IRQ[n]为1,向Cortex_M0NVIC[n]发生一个中断。MCU_IRQ[n]是1:(意味着有中断请求)置位MCU_bit[n]将清中断。4.4.3Cortex-M0中断的特点Cortex-M0处理器和NVIC对所有优先级进行划分和处理,可动态重设优先级,NVIC结构支持具有四级优先级的32个(IRQ[31:0])离散中断,所有的异常处理均在Handle模式下进行。处理器状态的自动保存和恢复。当出现异常时,处理器的状态被自动保存到栈中;在中断服务子程序结束之后,又会自动从栈中恢复处理器的状态。中断向量表读取与处理器状态保存并行处理。当任何中断被响应时,中断服务程序ISR的起始地址可从内存的向量表中取得。不需要确定哪个中断被响应,也不要软件分配相关中断服务程序(ISR)的起始地址。当起始地址取得时,NVIC将自动保存处理状态,包括以下寄存器PC、PSR、LR、R0~R3、R12的值到栈中。在ISR结束时,NVIC将从栈中恢复相关寄存器的值,恢复正常操作,因此微控制器将花费更少的确定的时间去处理中断请求。在较高优先级中断到达之前的中断尚未进入服务程序的情况下,Cortex-M0的内建机制可以避免重新入栈,减少中断延时和抖动。NVIC支持末尾连锁,有效处理背对背中断,不需要在2个中断服务子程序之间进行入栈和出栈操作,即无需保存和恢复当前状态从而减少从当前ISR结束切换到挂起的ISR的延迟时间。NVIC还支持晚到,改善同时发生的ISR的效率。当较高优先级中断请求发生在当前ISR开始执行之前(保存微控制器状态和获取起始地址阶段),NVIC将立即选择处理更高优先级的中断,从而提高了实时性。在中断发生时,中断优先级和上下文保护均由硬件进行处理,避免了处理中断时需要编写汇编代码,从而可以完全用C语言来编写中断处理程序。4.5CMSIS软件接口标准ARM公司于2008年11月12日发布了ARMCortex微控制器软件接口标准(CortexMicrocontrollerSoftwareInterFaceStandard,简称CMSIS)是ARM和一些编译器厂家以及半导体厂家共同遵循的一套标准,是由ARM提出,专门针对Cortex-M系列的标准。CMSIS是独立于供应商的根据近期的调查研究,软件开发已经被嵌入式行业公认为最主要的开发成本。图4.6为近年来软件开发与硬件开发成本对比图。因此,ARM与Atmel、IAR、Keil、hami-naryMicro、Micrium、NXP、SEGGER和ST等诸多芯片和软件厂商合作,将所有Cortex芯片厂商产品的软件接口标准化,制定了CMSIS标准。此举意在降低软件开发成本,尤其针对新设备项目开发,或者将已有软件移植到其他芯片厂商提供的基于Cortex微控制器的微控制器的情况。有了该标准,芯片厂商就能够将他们的资源专注于产品外设特性的差异化,并且消除对微控制器进行编程时需要维持的不同的、互相不兼容的标准的需求,从而达到降低开发成本的目的。硬件成本硬件成本硬件成本硬件成本软件成本不断上涨软件成本软件成本不断上涨软件成本软件成本硬件成本软件成本硬件成本硬件成本硬件成本软件成本软件成本硬件成本硬件成本软件成本软件成本软件成本软件成本2000年1990年2010年1980年1970年2000年1990年2010年1980年1970年图图4.6近年来软件开发与硬件开发成本对比图4.5.1CMSIS标准的软件架构基于CMSIS标准的软件架构主要分为以下4层:用户应用层、操作系统及间件接口层、CMSIS层、硬件寄存器层。其中CMSIS层起着承上启下的作用:一方面该层对硬件寄存器层进行统一实现,屏蔽了不同厂商对Cortex-M系列微控制器核内外设寄存器的不同定义;另一方面又向上层的操作系统及中间件接口层和应用层提供接口,简化了应用程序开发难度,使开发人员能够在完全透明的情况下进行应用程序开发。也正是如此,CMSIS层的实现相对复杂[12]。CMSIS标准的软件架构如下图4.7所示。用户应用层代码用户应用层代码CMSIS中间件设备外设访问层中间访问层CMSIS中间件设备外设访问层中间访问层中间件操作系统实时操作系统内核中间件操作系统实时操作系统内核核内外访问层核内外访问层外设寄存器以及中断向量的定义外设寄存器以及中断向量的定义MCU图4.图4.7CMSIS标准的软件架构CMSIS层主要分为3部分:①核内外设访问层(CorePeripheralAccessLayer,简称CPAL):由ARM负责实现。包括对寄存器地址的定义,对核寄存器、NVIC、调试子系统的访问接口定义以及对特殊用途寄存器的访问接口(如CONTROL和xPSR)定义。由于对特殊寄存器的访问以内联方式定义,所以arm针对不同的编译器统一用_INLINE来屏蔽差异。该层定义的接口函数均是可重入的。②中间件访问层(MiddlewareAccessLayer,简称MWAL):由ARM负责实现,但芯片厂商需要针对所生产的设备特性对该层进行更新。该层主要负责定义一些中间件访问的API函数,例如为TCP/IP协议栈、SD/MMC、USB协议以及实时操作系统的访问与调试提供标准软件接口。该层在1.1标准中尚未实现。③设备外设访问层(DevicePeripheralAccessLayer,简称DPAL):由芯片厂商负责实现。该层的实现与CPAL类似,负责对硬件寄存器地址以及外设访问接口进行定义。该层可调用CPAL层提供的接口函数,同时根据设备特性对异常向量表进行扩展,以处理相应外设的中断请求[6]。4.5.2CMSIS规范=1\*GB3①文件结构。CMSIS的文件结构如图4.8所示(以NuMiroM051为例)。其中stdint.h包括对8位、16位、32位等类型指示符的定义,主要用来屏蔽不同编译器之前的差异。core_cm0.h和core_cm0.c中包括Cortex-M0核的全局变量声明和定义,并定义一些静态功能函数。M051Series.h定义了与特定芯片厂商相关的寄存器以及各中断异常号,并可定制M0核中的特殊设备,如MCU、中断优先级位数以及寄存器定义。虽然CMSIS提供的文件很多,但在应用程序中只需包含.h[11]。图图=2\*GB3②工具链。CMSIS支持目前嵌入式开发的三大主流工具链,即ARMReakView(armcc)、IAREWARM(iccarm)以及GNU工具链(gcc)。通过在core_cm0.c中的如下定义,来屏蔽一些编译器内置关键字的差异,如程序清单4.1所示。程序清单4.1编译器内置关键字的差异#ifdefined(CC_ARM)#defineASMasm#defineINLINEinline#elifdefined(ICCARM)#defineASMasm#defineINLINEinline#elifdefined(GNUC)#defineASMasm#defineINLINEinline#elifdefined(TASKING)#defineASMasm#defineINLINEinline#endif这样,CPAL中的功能函数就可以被定义成静态内联类型(static_INLINE),实现编译优化。=3\*GB3③中断异常。CMSIS对异常和中断标识符、中断处理函数名以及中断向量异常号都有严格的要求。异常和中断标识符需加后缀_IRQn,系统异常向量号必须为负值,而设备的中断向量号是从0开始递增,具体的定义如下程序清单4.2所示(以M051微控制器系列为例):程序清单4.2中断异常号定义typedefenumIRQn{NonMaskableInt_IRQn=-14HardFault_IRQn=-13SVCall_IRQn=-5PendSV_IRQn=-2SysTick_IRQn=-1BOD_IRQn=0WDT_IRQn=1EINT0_IRQn=2EINT1_IRQn=3GPIO_P0P1_IRQn=4GPIO_P2P3P4_IRQn=5PWMA_IRQn=6PWMB_IRQn=7TMR0_IRQn=8TMR1_IRQn=9TMR2_IRQn=10TMR3_IRQn=11UART0_IRQn=12UART1_IRQn=13SPI0_IRQn=14SPI1_IRQn=15I2C0_IRQn=18I2C1_IRQn=19CAN0_IRQn=20CAN1_IRQn=21SD_IRQn=22USBD_IRQn=23PS2_IRQn=24ACMP_IRQn=25PDMA_IRQn=26I2S_IRQn=27PWRWU_IRQn=28ADC_IRQn=29DAC_IRQn=30RTC_IRQn=31}IRQn_Type;CMSIS对系统异常处理函数以及普通的中断处理函数名的定义也有所不同。系统异常处理函数名需加后缀_Handler,而普通中断处理函数名则加后缀_IRQHandler。这些异常中断处理函数被定义为weak属性,以便在其他的文件中重新实现时不出现重复定义的错误。这些处理函数的地址用来填充中断异常向量表,并在启动代码中给以声明,例如:BOD_IRQHandlerr、WDT_IRQHandler、TMR0_IRQHandler、UART0_IRQHandler等。=4\*GB3④数据类型。CMSIS对数据类型的定义是在stdint.h中完成的,对核寄存器结构体的定义是在core_cm0.h中完成的,寄存器的访问权限是通过相应的标识来指示的。CMSIS定义以下3种标识符来指定访问权限:_I(volatileconst)、_O(volatile)和_IO(volatile)。其中_I用来指定只读权限,_O指定只写权限,_IO指定读写权限。=5\*GB3⑤安全机制。在嵌入式软件开发过程中,代码的安全性和健壮性一直是开发人员所关注的,因此CMSIS在这方面也作出了努力,所有的CMSIS代码都基于MISRA-C2004(MotorIndustrySoftwareReliabilityAssociationfortheCprogramminglanguage)标准。MIRSA-C2004制定了一系列安全机制用来保证驱动层软件的安全性,是嵌入式行业都应遵循的标准。对于不符合MISRA标准的,编译器会提示错误或警告,这主要取决于开发者所使用的工具链[6]。河南城建学院本科毕业设计(论文)参考文献5实验5.1控制要求当按下KEY0时:如果按下去KEY0与松开KEY0的时间差大于200ms的时间间隔,那么LED3由5次/秒的慢闪变成20次/秒的快闪,并且可重复;如果按下去KEY0与松开KEY0的时间差小于20ms,那么将跳出这个死循环,LED3将常亮。5.2实验准备5.2.1KeiluVision4简介2009年2月发布的KeiluVision4,引入灵活的窗口管理系统,是开发人员能够使用多带监视器,并提供了视觉上的表面对窗口位置的完全控制的任何地方。新的用户界面可以更好地利用屏幕空间和更有效的组织多个窗口,提供一个整洁,高效的环境来开发应用程序。新版本支持更多

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论