汽车电子KEA系列微控制器——基于ARM Cortex-M0+内核(txt+pdf+epub+mobi电子书下载)


发布时间:2021-01-23 10:27:32

点击下载

作者:王宜怀,李跃华

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

汽车电子KEA系列微控制器——基于ARM Cortex-M0+内核

汽车电子KEA系列微控制器——基于ARM Cortex-M0+内核试读:

前言

飞思卡尔于 2014 年开始推出的面向汽车电子 KEA 系列微控制器,该微控制器以 ARM Cortex-M0+为内核,内核频率48 MHz,运行温度范围-40 ℃~125 ℃,内含温度传感器,具有位操作引擎及良好的EMC特性,将广泛地应用于汽车电子中的信息娱乐系统连接、停车辅助系统、车身中控、空调控制、车窗/天窗/车门控制、防盗装置、通用传感器节点等。整个 KEA 系列引脚兼容,还将与未来的Kinetis Auto系列的其他系列产品引脚兼容,并提供多个引脚和存储选择,使开发人员能够在不同芯片之间进行移植,最大限度地提高硬件、软件重用性并缩短投放市场的时间。相比于一般微控制器,KEA 系列微控制器具有更宽的温度范围及更高的可靠性。因其具有性能好、可靠性高、价格低等突出特点,将是汽车电子领域的重要成员,也能更好地应用于其他对可靠性要求较高的领域。

本书以构件化底层驱动为基础阐述KEA系列微控制器应用程序的设计方法。

主要特点(1)按照由浅入深的原则,在简要给出基本软件、硬件要素的基础上,尽快给出符合嵌入式软件工程规范的工程框架、第一个C语言样例、第一个汇编样例及启动过程解析,以便快速规范入门。一些较深的内容,随后给出。(2)对底层驱动进行构件化封装。书中对每个模块均给出了根据嵌入式软件工程基本原则并按照构件化封装要求,编制面向芯片级底层驱动程序,同时给出较为详细、规范的注释及对外接口,为实际应用提供底层构件,方便移植与复用,可以为读者进行实际项目开发节省大量时间。面向芯片级底层驱动程序为芯片的实际应用提供了基础,避免了面向板级驱动给不用用户带来的不便。(3)设计合理的测试用例。书中所有源程序均经测试通过,并保留测试用例在本书的网上光盘中,避免了因例程的书写或固有错误给读者带来烦恼。这些测试用例,也为读者验证与理解带来方便。每个测试用例均为独立的工程,包含文档说明,为读者重复实验现象提供便利。书中附录还提供了KDS简明使用方法、写入器驱动与使用方法、部分工具软件。(4)网上光盘提供了所有模块完整的底层驱动构件化封装程序与测试用例。需要使用PC的程序的测试用例,还提供了PC的C#源程序。网上光盘的版本将会适时更新。(5)提供硬件核心板、写入调试器等硬件,方便读者进行实践与应用。

主要内容

全书共16章,第1章给出汽车电子概述及KEA的基本特性;第2章给出ARM Cortex-M0+的寄存器、指令系统及汇编语法;第3章给出KEA的存储地址映像、中断系统及最小硬件系统;第4章以GPIO为例给出工程框架、第一个C语言实例、第一个汇编语言实例及程序执行过程分析;第5章给出底层驱动构件设计规范;第6章给出串行通信及printf函数的融入方法。1~6章囊括了学习一个新微控制器入门的基本知识要素及基本规范。第7~12章分别给出了Systick、RTC、PWT、PIT、FTM(含输入捕捉、输出比较及PWM)、Flash在线编程、ADC、ACMP、SPI、I2C、CAN等程序设计方法;第13章给出时钟系统及其他模块;第14章给出基于实时操作系统MQX-Lite的编程方法;第15章给出一个汽车冷却风扇控制实例;第16章给出位带及位操作引擎等技术的进一步讨论。

作者分工与致谢

本书由王宜怀负责编制提纲和统稿工作,并撰写第2~6章。李跃华撰写7~14章及第16章部分内容。飞思卡尔李兴参与全书的策划,田茂昕撰写第1章,唐华标撰写第15章及第16章部分内容。研究生李会、王磊、陈瑞杰、范宁宁等协助书稿整理及程序调试工作,他们卓有成效的工作,使本书更加实用。飞思卡尔马莉女士一直关心支持苏州大学飞思卡尔嵌入式中心的建设,为本书的撰写提供了技术条件。飞思卡尔李越、陈馨宇等工程人员提供了技术支持。苏州华祥信息科技有限公司的蒋建辉、刘辉工程师提出了有益的建议。电子工业版社的田宏峰先生为本书的出版做了大量细致的工作。在此一并表示诚挚的谢意。

鉴于作者水平有限,书中难免存在不足和错误之处,恳望读者提出宝贵意见和建议,以便再版时改进。

王宜怀

2015年6月

第1章 概述

本章导读:鉴于本书阐述面向汽车电子的微控制器,作为全书导引,本章首先简要阐述汽车电子技术的基本概念、我国汽车电子发展概况及飞思卡尔在汽车电子市场中地位。随后给出飞思卡尔面向汽车电子的微控制器KEA系列型号标识与基本特点。KEA系列微控制器与一般工业级微控制器主要区别是提高了运行温度等级及电磁兼容等级等,当然也可用于一般工业控制领域。

本章参考资料:本章1.4节的KEA系列MCU的型号标识总结自《KEA128数据手册》的第2章,KEA系列MCU的基本特点及简明资源参考自《KEA简介》。有关简称含义见本书参考文献,下同。

1.1 汽车电子技术的基本概念

汽车电子是车体汽车电子控制装置和车载汽车电子控制装置的总称,其最重要的作用是提高汽车的安全性、舒适性、经济性和娱乐性。近年来,随着信息技术的快速发展,以及汽车制造业水平的不断提升,汽车电子技术得到了广泛应用和创新,越来越多的电子控制单元(Electronic Control Unit,ECU)被集成在汽车中。电子设备在汽车总成本中所占的比例也随之攀升,据统计,1970年全球汽车电子设备的成本占比为2%,1980年为5%,1990年为15%,2000年为20%,2012年为25%;预计到2015年将升至50%。这些汽车电子产品的加入,一方面对提高汽车的动力性、燃油经济性、安全性,以及降低汽车排放污染起到了非常关键的作用,另一方面提供了如仪表显示、信息娱乐、通信互连等丰富的人车交互系统及智能化的车身控制模块,大大增强了整车的驾驶舒适性。专家指出,近10年来汽车产业70%的创新来源于汽车电子技术及其产品的开发应用,汽车电子技术的应用水平已成为衡量汽车档次水平的主要标志,其应用程度的提高是汽车生产企业提高市场竞争力的重要手段。

汽车电子化被认为汽车技术发展进程中的一次革命,是用来开发新车型、改进汽车性能最重要的技术措施。按照应用方向,汽车电子技术可划分成四类:第一类是车身电子,如车身控制器(BCM)、车内网关(Gateway),以及对车灯、车窗、车门等部件进行控制的车身节点;第二类是汽车动力总成,指对发动机、变速箱、驱动电机的控制;第三类是汽车底盘与安全,如对底盘、悬架、制动系统、电子助力转向(Electric Power Steering,EPS)等的控制,以及近期发展势头强劲的高级驾驶员辅助系统(Advanced Driver Assistance Systems,ADAS);第四类是驾驶员信息系统(Driver Information System,DIS),包括仪表显示、信息娱乐、GPS导航等。

1.2 中国汽车电子发展概况

自2001年正式加入WTO以来,中国巨大的市场潜力吸引了全球众多知名汽车厂商的目光,汽车产业因此得到了飞速发展。短短几年,中国一举成为世界最大的汽车生产国和消费国。据中汽协公布的统计数据显示,2013年,中国汽车产销双双超过2000万辆,再创全球产销最高记录,其中产量2211.68万辆,销量2198.41万辆,同比增长14.76%和13.87%。预计未来较长的一段时间,中国都将保持汽车产销大国地位。

汽车产业的迅猛发展为汽车电子及相关半导体提供了广阔的市场前景。根据Strategy Analytics的最新数据显示,2013年中国汽车半导体(包括MCU、Sensor以及MOSFET、IGBT、三极管、二极管等分立器件,下同)的总需求量为120.87亿颗,较2012年增长26.2%,其中MCU需求量为4.34亿颗,平均每辆汽车大约包含19颗MCU;2013年中国汽车半导体的市场规模为39.99亿美元,较2012年增长22.2%,其中MCU的市场规模为10.46亿美元;到2014年,半导体的市场需求增长至46.01亿美元。

图1-1可以看到,未来几年,中国汽车电子及相关的半导体产业将保持稳步增长。其中,随着消费者对汽车安全性的关注日益提高,EPS、轮胎压力监测系统(Tire Pressure Monitoring System,TPMS),以及基于雷达和视觉的ADAS等一系列安全技术将逐步得到广泛应用,并成为今后一段时间的热点话题。而仪表显示与信息娱乐系统将在图形化仪表与大屏幕显示需求的推动下,继续成为汽车电子市场增长的引擎。随着国家各项节能减排政策的发布和落实,以混合动力(Hybrid Electric Vehicle,HEV)应用为主的新能源技术也将成为业界聚焦的热点。图1-1 中国汽车半导体的市场规模(百万美元)

1.3 飞思卡尔在汽车电子市场中的地位

飞思卡尔是汽车电子以及嵌入式处理解决方案的领导者,其主要业务涉及汽车电子、消费电子、工业电子及网络设备等市场,其中,汽车电子类客户遍及全球各大顶尖零部件厂商和整车厂。

几十年来,凭借突破性思维、工程技术专长、对高品质的追求,以及长久保持的市场领军地位等优势,飞思卡尔在汽车电子市场上发挥着举足轻重的作用。

● 北美汽车半导体供应商领域:第一(来源Strategy Analytics,2014年4月)。

● 全球商用汽车MEMS传感器领域:第一(来源HIS,2014年5月)。

● 全球商用汽车加速度传感器领域:第一(来源HIS,2014年5月)。

● 全球汽车微控制器(Micro Controller Unit,MCU)领域:第二(来源IHS,2014年3月)。

● 全球车载信息娱乐处理器领域:第二(来源Strategy Analytics,2014年4月)。

● 飞思卡尔创造了全球第一款发动机控制芯片,并保持领先至今。

● 飞思卡尔是全球首家集成77 GHz雷达技术的汽车半导体供应商。

● 全球TOP10的汽车厂商有7家选择i.MX6应用处理器来支持其信息娱乐系统的连接和解决方案。

● 全球6大顶尖豪华车品牌将在其图形化仪表盘中采用i.MX应用处理器。

飞思卡尔拥有丰富的微控制器、处理器、模拟器件和传感器产品线,覆盖了从低端到高端的汽车电子产品,能够帮助客户实现全新的突破性汽车设计,包括动力总成、车身、底盘与安全性、车载信息娱乐和通信系统及车内网络应用。基于世界一流的架构,以及业界领先的安防和功能安全技术,飞思卡尔可以帮助客户实现开发的可靠性和自由性。凭借Power Architecture技术及ARM技术,客户可以获得多种设计选择。

飞思卡尔为汽车电子市场提供产品长期供货保障,广泛的器件都包含在该计划中,保证至少15年的供货期。飞思卡尔全面贯彻高品质企业文化,致力于保证产品质量、交货时间和最高服务水平,并成为客户眼中最卓越的半导体公司。

1.4 面向汽车电子的微控制器KEA系列MCU简介

Kinetis EA系列(简称KEA系列)MCU是飞思卡尔针对汽车市场最新开发的MCU,有非常广泛的应用范围,具体的目标应用在本节有详细阐述。整个KEA系列引脚兼容,还将与未来的Kinetis Auto系列的其他系列产品引脚兼容,并提供多个引脚和存储选择,使开发人员能够在不同芯片之间进行移植,最大限度地提高硬件、软件重用性并减少投放市场的时间。[1]

1.KEA系列MCU的型号标识

飞思卡尔Kinetis系列MCU的型号众多,但同一子系列的CPU核是相同的,多种型号只是为了适用于不同的应用场合。为了方便选型或订购,飞思卡尔给出MCU型号标识,Kinetis EA系列型号标识格式为“QKEA A C FFF M T PP CCN”,其中,各字段说明如表1-1所示。本书使用的芯片型号为SKEAZ128MLK,从该芯片型号标识可以获得如下信息:该芯片为汽车级、KEA系列、M0+内核、包含CAN模块、程序Flash大小为128 KB、运行温度范围是–40~125℃、80引脚LQFP封装、CPU最高频率为48 MHz、盒包装。

Kinetis EA系列芯片命令字段说明如表1-1所示。表1-1 Kinetis EA系列芯片命令字段说明

2.KEA系列MCU的简明特性与结构框图

KEA系列MCU基于的ARM Cortex-M0+处理器是目前市场上能效最高的32位处理器,每微安数据吞吐量居业内领先水平。KEA系列MCU具有多种灵活的超低功耗模式,适合不同的应用情形,可最大限度延长电池使用时间;在不唤醒内核的情况下,智能外设在深度睡眠模式下仍然可以工作,可进行智能决策并处理数据。KEA系列MCU包含了一组功能强大的模拟、通信、定时和控制外设,提供各种闪存规格和引脚数。KEA系列MCU简明特性如下,以下特性均可在图1-2中直观地看到。图1-2 KEA系列MCU结构框图(1)MCU内核运行频率高达48 MHz,通过AEC-Q100一级认证,可满足温度范围为-40~125 ℃的严苛要求,并且增强了ESD/EMC性能。(2)可扩展解决方案,包括高达128 KB的闪存及80LQFP(71GPIO)的封装选项,并且可轻松扩展设计,以满足不同的汽车应用需求。(3)工作电压范围为2.7~5.5 V,可驱动高电流电机/组件,5 V模拟/传感器组件可轻松连接至系统级设计。(4)时钟模块:振荡器(Oscillator,OSC),支持32.768 kHz晶振或4~24 MHz晶体或陶瓷谐振器;内部时钟源(ICS),带有内部参考时钟(ICSIRCLK)和FLL(Frequency Locked-Loop,锁频环),为48 MHz系统时钟提供37.5 kHz的预调整内部参考电压;内部带有1 kHz低功耗振荡器(Low Power Oscillator,LPO)。(5)系统功能:电源管理模块(Power Management Module,PMM),具有Run(运行)、Wait(等待)、Stop(停止)三种电源模式;低电压检测(Low-voltage detection,LVD),提供可选择的复位或中断触发;具有独立的时钟源看门狗(WDOG);可编程循环冗余校验模块(CRC);串行线调试接口(Serial Wire Debug,SWD);位操作引擎(Bit Manipulation Engine,BME)。(6)人机接口:具有71个通用输入/输出口(GPIO);两个32位键盘中断模块(Keyboard Interrupt Modules,KBI);外部中断(External Interrupt,IRQ)。(7)模拟模块:一个16通道的12位SAR ADC,可在停止模式下运行,提供硬件触发(ADC)选项;两个模拟比较器,包含一个6位DAC和可编程参考电压输入(ACMP)。(8)定时器:一个6通道FlexTimer/PWM (FTM);两个2通道FlexTimer/PWM (FTM);一个2通道周期中断定时器(Periodic Interrupt Timer,PIT);一个16位脉冲宽度定时器(Pulse Width Timer,PWT);一个实时时钟(Real-Time Clock,RTC)。(9)通信接口:两个SPI模块(串行外设接口);三个UART模块;2两个IC模块;一个MSCAN模块。可通过丰富的通信模块实现车内通信需求。(10)快速原型工具可实现高质量软件开发,包括Kinetis Design Studio、CodeWarrior IDE、Processor Expert软件建模工具、MQX™RTOS和AUTOSAR。

KEA系列MCU的结构框图如图1-2所示。

3.KEA系列MCU的简明资源列表

KEA系列MCU由六个子系列组成,分别是内部不含CAN模块的KEAZN8、KEAZN16、KEAZN32、KEAZN64,以及内部含CAN模块的KEAZ64和KEAZ128,表1-2给出了KEA系列MCU的简明资源列表。所有KEA系列MCU均具有低功耗与丰富的混合信号控制外设,提供了不同的闪存容量和引脚数量,供实际应用选型。

4.KEA系列MCU的相关参考设计

飞思卡尔提供了KEA系列MCU的相关参考资源,供读者实际应用时参考,这些资源可从飞思卡尔网站获得。

5.KEA系列MCU的目标应用

KEA系列MCU在汽车电子领域有着广泛的应用,例如,在信息娱乐系统连接模块、停车辅助系统、DC/BLDC电机控制、电子驻车制动、电池管理、泵/风扇控制器、智能无钥匙进入及启动系统、汽车照明、车身中控/空调、车窗/天窗/车门、座椅/后视镜/雨刮器、防盗装置、动力总成配套芯片、通用传感器节点等方面都可以作为目标应用。表1-2 KEA系列MCU的简明资源列表表1-3 KEA系列MCU的相关参考设计[1] 来自《KEA数据手册》第2章,该文档中给出的型号标识字段中含有程序存储器类型,实际出厂的芯片并未使用该字段,默认程序存储器为Flash。

第2章 ARM Cortex-M0+处理器

本章导读:KEA系列MCU的内核使用ARM Cortex-M0+处理器,需要学习ARM Cortex-M0+汇编的读者可以阅读本章,一般读者简要了解2.1节即可。虽然本书使用C语言阐述ARM Cortex-M0+KEA系列MCU的嵌入式开发,但理解1至2个结构完整、组织清晰的汇编程序对嵌入式开发将有很大帮助,也有助于更深层次的理解ARM Cortex-M0+软件的设计。第4章中将结合GPIO的应用给出汇编实例,供学习参考。实际上,一些诸如初始化、操作系统调度、快速响应等特殊功能必须使用汇编完成。本章给出ARM Cortex-M0+的特点、内核结构、存储器映像及内部寄存器概述;给出指令简表、寻址方式及指令的分类介绍;给出指令集与机器码对应表,供机器码级别的调试使用;给出ARM Cortex-M0+汇编语言的基本语法。

本章参考资料:本章2.1.1节与2.1.3节参考自《M0+用户指南》;2.4节参考自《GNU汇编语法》、《Kinetis汇编参考手册》及《M0+用户指南》。

2.1 ARM Cortex-M0+处理器简介

ARM Cortex-M0+系列处理器是2012年推出主要目标市场是8位/16位微控制器的升级换代,具有性价比高、功耗低等特点。了解其特点、内核结构、存储器映像、内部寄存器、寻址方式及指令系统,可以为进一步学习和应用ARM Cortex-M0+提供基础。

2012年3月14日,ARM公司于中国上海发布了一款拥有全球最低功耗的微处理器ARM Cortex-M0+。该处理器采用低成本的90 nm低功耗(Low Power,LP)工艺,耗电量仅为 9 μA/MHz;该微处理器基[1][2]于ARMv6M架构支持Thumb指令集和部分Thumb2指令集;加入多个重要新特性,包括单周期输入输出(IO)以加快通用输入输出(GPIO)和外围设备的存取速度、改良的调试和追踪能力、二阶流水线技术以减少每个指令所需的时钟周期数(CPI)和优化的闪存访问方式等,以进一步降低功耗。

Cortex-M0+处理器不仅延续了易用性、C语言编程模型等优势,而且能够兼容已有的Cortex-M0处理器的工具。作为Cortex-M处理器系列中的一员,Cortex-M0+处理器同样可获得ARM Cortex-M整个系统的全面支持,其良好的软件兼容性,使其能够方便地被移植到更高性能的Cortex-M3或Cortex-M4等系列处理器。2.1.1 ARM Cortex-M0+处理器特点与结构图

Cortex-M0+处理器组件结构图见图2-1,图中虚线表示可选组件,下面简要介绍各部分。

1.Cortex-M0+内核

32位ARM Cortex-M0+处理器是以一个“处理器子系统”的形式出现的,其CPU内核本身与NVIC和一系列调试块都亲密耦合。[3]Cortex-M0+处理器基于2级流水线冯· 诺依曼架构,内核版本为ARMv6-M,支持16位Thumb指令集,同时采用Thumb2技术。Cortex-[4]M0+内核的性能接近8位或16位竞争产品CoreMark/mA的2倍。

2.嵌套中断向量控制器(NVIC)

NVIC(Nested Vectored Interrupt Controller)是一个在Cortex-M0+中内建的中断控制器,中断的具体路数由芯片厂商定义,本书使用的MCU(飞思卡尔公司以Cortex-M0+为内核设计的微处理器系列之一)共有32个可屏蔽外部中断源并支持4级优先级。NVIC是与CPU紧耦合的,它还包含了若干个系统控制寄存器。因为NVIC支持中断嵌套,使得在Cortex-M0+上处理嵌套中断时清晰而强大。它还采用了向量中断的机制,在中断发生时,会自动取出对应的服务例程入口地址,并且直接调用,无须软件判定中断源,缩短中断延时。为优化低功耗设计,NVIC嵌套中断控制器还集成一个可选WIC(唤醒中断控制器),在睡眠模式或深度睡眠模式下,芯片可快速进入超低功耗状态,且只能被WIC唤醒源唤醒。图2-1 Cortex-M0+处理器结构图

3.总线网络(BusMatrix)[5]

BusMatrix是Cortex-M0+内部总线系统的核心。它是一个AHB互连的网络,通过它可以让数据在不同的总线之间并行传送(只要两个总线主机不试图访问同一块内存区域)。BusMatrix还提供了附加的数据传送管理设施,包括一个写缓冲和一个按位操作的逻辑,这个按位操作的逻辑被称为位带(bit-band)。

4.调试组件

Cortex-M0+处理器实现了一个完全基于硬件的调试解决方案,该调试方案通过2针脚串行线协议(SWD)访问处理器、内存和外设,能够支持2个硬件断点和2个观察点;支持单步调试和向量捕捉;支持多个软件断点;通过总线网络非侵入式访问内核外设和零等待系统从机,调试器甚至能够在处理器运行时,访问包括内存在内的设备;在处理器停止状态时,可完全访问内核寄存器组。

5.总线接口

ARM Cortex-M0+处理器提供一个基于被称之为高级微控制器总线体系结构的总线规范AMBA技术的单一32位系统接口,可以高速整体访问所有系统外设和内存。所谓总线规范AMBA(Advanced Microcontroller Bus Architecture),是一组针对基于ARM内核、片上系统之间通信而设计的标准协议。总线规范AMBA具有可选的32位单周期I/O接口,支持高速访问紧密耦合外设,如GPIO外设模块,该接口可从处理器、调试器以载入、存储方式访问,但不能执行代码;可选的32位从机接口,支持调试访问端口(Debug Access Port,DAP),该端口可通过串行或JATG协议调试;可选的内存保护单元接口;可选的执行跟踪接口(Execution Trace Interface,ETI),可配置执行跟踪缓冲区执行跟踪组件功能。在AMBA总线规范中,定义了AHB、APB、ASB三种总线。

6.SysTick定时器

SysTick定时器是一个24位倒计时定时器,即使系统在睡眠模式下也能工作,是作为嵌套中断向量控制器NVIC的一部分实现的,用于实时操作系统RTOS的时钟或仅仅作为计数器,一旦使能,定时器将从预设值减到0,直到下个循环开始,标志位会被置位。

7.其他模块

系统控制块(System Control Block,SCB)提供了系统运行信息和系统配置功能,包括配置、控制、报告系统异常等。微型跟踪缓冲器(MTB)提供程序追踪功能,可以产生指令用来访问变化的数据。存储器保护单元(MPU)是一个选配的单元,本书中介绍的KEA128芯片不包含此组件。2.1.2 ARM Cortex-M0+处理器存储器映像

ARM Cortex-M0+只有一个单一固定的存储器映射,这一点极大地方便了软件在各种Cortex-M0+内核间的移植。举个简单的例子,各款Cortex-M0+核MCU的NVIC和MPU都在相同的位置布设寄存器,使得它们变得通用。尽管如此,Cortex-M0+定出的条条框框是粗线条的,它依然允许芯片制造商灵活地分配存储器空间,以制造出各具特色的MCU产品。图2-2给出了M0+的存储器空间地址映像。图2-2 Cortex-M0+的存储器空间地址映像(1)它的存储器映射是预定义的,并且还规定好了哪个位置使用哪条总线。(2)Cortex-M0+的存储器系统支持所谓的“位带”(bit-band)[6]操作,通过它可以实现对单一比特的原子操作。位带操作仅适用于一些特殊的存储器区域中。[7](3)Cortex-M0+的存储器系统支持小端格式和大端格式的配置,一般具体某款芯片在出厂时已经被厂商定义过。本书中MCU芯[8]片被配置为小端格式。2.1.3 ARM Cortex-M0+处理器的寄存器

ARM Cortex-M0+处理器的寄存器有R0~R15,如图2-3所示。其中R13作为堆栈指针SP,SP实质上有两个,但在同一时刻只能有一个可以看到,这也就是所谓的“banked”寄存器。特殊功能寄存器有预定义的功能,而且必须通过专用的指令来访问。图2-3 ARM Cortex-M0+处理器的寄存器组

1.通用寄存器R0~R12

R0~R12是最具“通用目的”的32位通用寄存器,用于数据操作。32位的Thumb2指令则可以访问所有通用寄存器。但绝大多数16位Thumb指令只能访问R0~R7,因而R0~R7又称为低组寄存器,所有指令都能访问它们,它们的字长全是32位,复位后的初始值是随机的。R8~R12也被称为高组寄存器,这是因为只有很少的16位Thumb指令能访问它们,32位的指令则不受限制,它们也是32位字长,复位后的初始值是随机的。

2.堆栈指针R13

R13是堆栈指针,在ARM Cortex-M0+处理器内核中共有两个堆栈指针,主堆栈指针MSP和进程堆栈指针PSP,若用户用到其中一个,另一个必须用特殊指令来访问(MRS、MSR指令),因此任一时刻只能使用其中的一个。主堆栈指针MSP是复位后缺省使用的堆栈指针,它可由操作系统内核、中断服务例程及所有需要特权访问的应用程序代码来使用;进程堆栈指针PSP用于常规的应用程序代码(不处于中断服务例程中时),该堆栈一般供用户的应用程序代码使用。要注意的是,并不是每个应用工程都用到这两个堆栈指针,简单的应用程序只用MSP就够了,并且PUSH指令和POP指令默认使用MSP(有时MSP直接记为SP)。另外,堆栈指针的最低两位永远是0,即堆栈总是4字节对齐的。

3.连接寄存器R14(LR)

当调用一个子程序时,由R14存储返回地址。不像大多数其他处理器那样,ARM为了减少访问内存的次数(访问内存的操作往往要3个以上指令周期,带MMU和cache的就更加不确定了),把返回地址直接存储在寄存器中,这样足以使很多只有1级子程序调用的代码无须访问内存(堆栈内存),从而提高子程序调用的效率;如果多于1级,则需要把前一级的R14值压到堆栈里。在ARM上编程时,应尽量使用寄存器保存中间结果。

4.程序计数寄存器R15(PC)

R15是程序计数器,指向当前的程序地址。如果修改它的值,就能改变程序的执行流程(很多高级技巧隐藏其中)。在汇编代码中也可以使用名字“PC”来访问它。因为ARM Cortex-M0+内部使用了指令流水线,读PC时返回的值是当前指令的地址+4。ARM Cortex-M0+中的指令至少是半字对齐的,所以PC的第0位总是0。然而,在分支时,无论是直接写PC的值,还是使用分支指令,都必须保证加载到PC的数值是奇数(即第0位为1),用以表明这是在Thumb状态下执行的,倘若第0位为0,则视为企图转入ARM模式,ARM Cortex-M0+将产生异常。

5.特殊功能寄存器

Cortex-M0+内核包括了一组特殊功能寄存器,包括程序状态字寄存器组(xPSR)、中断屏蔽寄存器(PRIMASK)和控制寄存器(CONTROL)。

1)程序状态字寄存器(xPSR)

程序状态字寄存器在内部分为以下几个子寄存器:APSR、IPSR、EPSR,用户可以使用MRS和MSR指令访问寄存器。三个子寄存器既可以单独访问,也可以两个或三个组合到一起访问。使用三合一方式访问时,把该寄存器称为xPSR,见表2-1。表2-1 ARM Cortex-M0+程序状态寄存器(xPSR)(1)APSR寄存器:显示算术运算单元ALU状态位的一些信息。

负标志N:若结果最高位为1,相当于有符号运算中结果为负,则置1,否则清0。

零标志Z:若结果为0,则置1,否则清0。

进位标志C:若有最高位的进位(减法为借位),则置1,否则清0。

溢出标志V:若溢出,则置1,否则清0。

这些位在条件转移指令中被用到,复位之后这些位是随机的。(2)IPSR寄存器:每次异常完成之后,处理器会实时更新IPSR内的异常号。只能被MRS指令读写。进程模式下,值为0;Handler模[9]式下,存放当前异常的异常号。复位之后,寄存器被自动清0。复位异常号是一个暂时值,复位时,是不可见的。(3)EPSR寄存器:T标志位指示当前运行的是否Thumb指令,该位是不能被软件读取的。运行复位向量对应的代码时置1。如果该位为0,会发生硬件异常,进入硬件中断服务例程。

2)中断屏蔽寄存器(PRIMASK)

中断屏蔽寄存器的D31~D1位保留,只有D0位(记为PM)有意义。当该位被置位时,除不可屏蔽中断和硬件错误之外的所有中断都被屏蔽。使用特殊指令(如MSR、MRS)可以访问该寄存器,还有一条称为改变处理器状态的特殊指令CPS也能访问它。只有在实时任务时才会用到。执行汇编指令“CPSID i”,将D0位置1(关总中断);执行汇编指令“CPSIE i”,将D0位清0(开总中断),其中i代表IRQ中断,IRQ是非内核中断请求(Interrupt Request)的缩写。

3)控制寄存器(CONTROL)

内核中的控制寄存器(CONTROL)的D31~D2位保留,D1、D0位含义如下。

D1(SPSEL):堆栈指针选择位。SPSEL=0,使用主堆栈指针MSP为当前堆栈指针(复位后缺省值);SPSEL=1,在线程模式下,使用线程堆栈PSP指针为当前堆栈指针。在特权、线程模式下,软件可以更新SPSEL位;在Handler模式下,写该位无效。复位后,控制寄存器清0。可用MRS指令读该寄存器,MSR指令写该寄存器。非特权访问无效。

D0(nPRIV):如果权限扩展,在线程模式下定义执行特权。nPRIV=0,线程模式下可以特权访问;nPRIV=1,线程模式下无特权访问。在Handler模式下,总是特权访问。

2.2 ARM Cortex-M0+处理器的指令系统

CPU的功能是从外部设备获得数据,通过加工、处理,再把处理结果送到CPU的外部世界。设计一个CPU,首先需要设计一套可以执行特定功能的操作命令,这种操作命令称为指令。CPU所能执行的各种指令的集合,称为该CPU的指令系统。表2-2给出了ARM Cortex-M指令集概况。表2-2 ARMCortex-M指令集概况

ARM Cortex-M0+处理器将上一代Cortex-M0升级为真正的8位替代产品,同时保留了与所有其他Cortex-M级处理器之间的兼容性。其指令系统是ARM Cortex-M3/M4指令集的一部分,并且与ARM Cortex-M0完全兼容,这允许设计人员可重复利用其现有的编译器和调试工具。2.2.1 ARM Cortex-M0+指令简表与寻址方式

1.ARM Cortex-M0+指令简表

学习和记忆ARM Cortex-M0+基本指令对理解处理器特性十分有益的,这里给出的ARM Cortex-M0+指令简表可以方便读者记忆基本指令。

ARM Cortex-M0+共有57条基本指令,依据不同的寻址方式形成68条具体指令。为了方便学习,将这些指令分为数据传送类,数据操作类(算术运算、逻辑运算、位操作、反转字节、扩展字节和移位),跳转类和其他指令等四大类指令。本节分别介绍这些指令,并对每条具体指令进行统一编号。表2-3给出保留字的简明含义,供读者了解和记忆ARM Cortex-M0+指令。

2.ARM Cortex-M0+的寻址方式

指令是对数据的操作,通常把指令中所要操作的数据称为操作数,ARM Cortex-M0+处理器所需的操作数可能来自寄存器、指令代码、存储单元。而确定指令中所需操作数的各种方法称为寻址方式(Addressing Mode)。下面的指令格式中的“{}”表示其中可选项,如“LDRH Rt,[Rn {,#imm}]”,表示有“LDRH Rt,[Rn]”、“LDRH Rt,[Rn,#imm]”两种指令格式。指令中的“[]”表示其中内容为地址,“@”表示注释。(1)立即数寻址。在立即数寻址方式中,操作数直接通过指令给出,数据包含在指令编码中,随着指令一起被编译成机器码存储于程序空间中。用“#”作为立即数的前导标识符,ARM Cortex-M0+的立即数范围是0x00~0xff。例如:表2-3 ARM Cortex-M0+指令简表(2)寄存器寻址。在寄存器寻址中,操作数来自于寄存器。例如:(3)直接寻址。在直接寻址方式中,操作数来自于存储单元,指令中直接给出存储单元地址。在指令码中,显示给出数据的位数,有字(4字节)、半字(2字节)、单字节三种情况。例如:(4)偏移寻址及寄存器间接寻址。在偏移寻址中,操作数来自于存储单元,指令中通过寄存器及偏移量给出存储单元的地址。偏移量不超过4 KB(指令编码中偏移量为12位),偏移量为0的偏移寻址也称为寄存器间接寻址。例如:2.2.2 数据传送类指令

1.生成与指针PC相关地址指令

ADR指令(见表2-4)将指针PC值加上一个偏移量得到的地址写进目标寄存器中。由于该地址只与指针PC相关,即ADR生成的是与位置无关代码。若利用ADR指令生成的目标地址用于跳转指令BX、BLX,则必须确保该地址最后一位为1。Rd为目标寄存器,label为与指针PC相关的表达式。在该指令下,Rd必须为R0~R7,数值必须字对齐且在当前PC值的1020字节以内。此指令不影响N、Z、C、V状态标志。表2-4 ADR指令

2.取数指令

存储器中内容加载到寄存器中的指令见表2-5,其中LDR、LDRH、LDRB指令分别表示加载来自存储器单元的一个字、半字和单字节(不足部分以0填充)。LDRSH和LDRSB指令指加载存储单元的半字、字节有符号数扩展成32位到指定寄存器Rt。表2-5 取数指令

在“LDM Rn{!},reglist”指令中,Rn表示存储器单元起始地址的寄存器;reglist若包含一个或多个寄存器,若包含多个寄存器必须以“,”分隔,外面用“{}”标识;“!”是一个可选的回写后缀,reglist列表中包含了 Rn寄存器时不要回写后缀,否则须带回写后缀“!”。带后缀时,在数据传送完毕之后,将最后的地址将写回到Rn=Rn+4×(n-1),n为reglist中寄存器的个数。Rn不能为R15,reglist可以为R0~R15任意组合;Rn寄存器中的值必须字对齐。这些指令不影响N、Z、C、V状态标志。

3.存数指令

寄存器中内容存储至存储器中的指令见表2-6。STR、STRH和STRB指令存储Rt寄存器中的字、低半字或低字节至存储器单元,存储器单元地址由Rn 与Rm之和决定,Rt、Rn和Rm必须为R0~R7之一。

其中,“STM Rn!,reglist指令将reglist列表寄存器内容以字存储至Rn寄存器中的存储单元地址。以4字节访问存储器地址单元,访问地址从Rn寄存器指定的地址值到Rn+4×(n-1),n为reglist中寄存器的个数。按寄存器编号递增顺序访问,最低编号使用最低地址空间,最高编号使用最高地址空间。对于STM指令,若reglist列表中包含了Rn寄存器,则Rn寄存器必须位于列表首位。如果列表中不包含Rn,则将位于Rn+4×n地址回写到Rn寄存器中。这些指令不影响N、Z、C、V状态标志。表2-6 存数指令

4.寄存器间数据传送指令

MOV指令(见表2-7),Rd表示目标寄存器;imm为立即数,范围为0x00~0xff。当MOV指令中Rd为PC寄存器时,丢弃第0位;当出现跳转,传送值的第0位清0后的值作为跳转地址。虽然MOV指令可以用作分支跳转指令,但强烈推荐使用BX或BLX指令。这些指令影响N、Z状态标志,但不影响C、V状态标志。表2-7 寄存器间数据传送指令

5.堆栈操作指令

堆栈操作指令见表2-8。PUSH指令将寄存器值存于堆栈中,最低编号寄存器使用最低存储地址空间,最高编号寄存器使用最高存储地址空间;POP指令将值从堆栈中弹回寄存器,最低编号寄存器使用最低存储地址空间,最高编号寄存器使用最高存储地址空间。执行PUSH指令后,更新SP寄存器值SP=SP-4;执行POP指令后更新SP寄存器值SP=SP+4。若POP指令的reglist列表中包含了PC寄存器,在POP指令执行完成时跳转到该指针PC所指地址处。该值最低位通常用于更新xPSR的T位,此位必须置1确保程序正常运行。表2-8 堆栈操作指令

例如:2.2.3 数据操作类指令

1.算术运算类指令

算术类指令有加、减、乘、比较等,见表2-9。表2-9 算术类指令

加、减指令对操作数的限制条件见表2-10。表2-10 ADC、ADD、RSB、SBC和SUB操作数限制条件

2.逻辑运算类指令

逻辑运算类指令见表2-11。AND、EOR和ORR指令把寄存器Rn、Rm值逐位与、异或和或操作;BIC指令将寄存器Rn的值与Rm的值的反码按位作逻辑“与”操作,结果保存到Rd。这些指令更新N、Z状态标志,不影响C、Z状态标志。

Rd、Rn和Rm必须为R0~R7,其中Rd为目标寄存器,Rn为存放第一个操作数寄存器且必须和目标寄存器Rd一致(即Rd就是Rn),Rm为存放第二个操作数寄存器。表2-11 逻辑运算类指令

3.数据序转指令

数据序转指令见表2-12。表2-12 数据序转指令

该指令用于改变数据的字节顺序。Rn为源寄存器,Rd为目标寄存器,且必须为R0~R7之一。REV指令将32位大端数据转小端存放或将32位小端数据转大端存放;REV16指令将一个32位数据划分成两个16位大端数据,将这两个16位大端数据转小端存放或将一个32位数据划分成两个16位小端数据,将这两个16位小端数据转大端存放;REVSH指令将16位带符号大端数据转成32位带符号小端数据或将16位带符号小端数据转成32位带符号大端数据,如图2-4所示。这些指令不影响N、Z、C、V状态标志。图2-4 反序操作

4.扩展类指令

扩展类指令见表2-13。寄存器Rm存放待扩展操作数;寄存器Rd为目标寄存器;Rm、Rd必须为R0~R7。这些指令不影响N、Z、C、V状态标志。表2-13 扩展类指令

5.位测试指令

位操作类指令见表2-14。表2-14 位测试指令

6.移位类指令

移位类指令见表2-15。ASR、LSL、LSR和ROR指令,将寄存器Rm值由寄存器Rs或立即数imm决定移动位数,执行算术右移、逻辑左移、逻辑右移和循环右移。这些指令中,Rd、Rm、Rs必须为R0~R7。对于非立即数指令,Rd和Rm必须一致。Rd为目标寄存器,若省去Rd,表示其值与Rm寄存器一致;Rm为存放被移位数据寄存器;Rs为存放移位长度寄存器;imm为移位长度,ASR指令移位长度范围1~32,LSL指令移位长度范围0~31,LSR指令移位长度范围1~32。表2-15 移位指令

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载