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


发布时间:2020-07-04 12:52:32

点击下载

作者:王宜怀,邵长星,等

出版社:电子工业出版社

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

汽车电子S32K系列微控制器——基于ARM Cortex-M4F内核

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

前言

恩智浦(NXP)公司于2017年推出了面向汽车电子的S32K系列微控制器。该微控制器以ARM Cortex-M4F为内核,内核频率为112 MHz,运行温度为-40℃~125℃,具有良好的EMC特性,可应用于汽车电子中的车身中控、信息娱乐系统连接、停车辅助系统、空调控制、车窗/天窗/车门控制、防盗装置、通用传感器节点等。整个S32K系列的引脚兼容,还将与未来Kinetis Auto系列其他产品的引脚兼容,可最大限度地提高硬件与软件的重用性,减少投放市场的时间。相比于其他微控制器,S32K 系列微控制器具有更宽的运行温度范围及更高的可靠性,具有性能好、可靠性高、价格低等突出特点,必将成为汽车电子领域的重要成员,也能更好地应用于其他对可靠性要求较高的领域。

本书以构件化底层驱动为基础阐述 S32K 系列微控制器应用程序的设计方法,具有如下特点。(1)按照由浅入深的原则,在简明给出基本软件、硬件要素的基础上,尽快给出符合嵌入式软件工程规范的工程框架、第一个C语言样例、第一个汇编样例及启动过程解析,以便快速规范入门。一些较深的内容,随后给出。(2)对底层驱动进行构件化封装。书中的每个模块均根据嵌入式软件工程基本原则并按照构件化封装的要求,编写了面向芯片级的底层驱动程序,同时给出了较为详细、规范的注释及对外接口,为实际应用提供了底层驱动构件,方便移植与复用,可以为读者在实际项目开发时节省大量的时间。面向芯片级底层驱动程序为芯片的实际应用提供了共性技术基础,避免了面向板级驱动给不同用户带来的不便。(3)设计合理的测试用例。书中的所有源程序均通过测试,并保留了测试用例,避免了因例程的书写或固有错误给读者带来烦恼。这些测试用例也为读者的验证与理解带来方便。每个测试用例均为独立的工程,包含文档说明,可为读者提供便利。书中附录还提供了S32DS集成开发环境的简明使用方法。(4)本书配套的网上光盘提供了所有模块的完整底层驱动构件化封装程序与测试用例。针对需要使用PC程序测试用例的读者,本书还提供了PC的C#源程序。网上光盘的版本将会适时更新。(5)本书配套的网上光盘提供了最小硬件系统电路图,可供读者应用参考;同时还提供了含有S32K微控制器的金葫芦IoT-GEC开发套件等硬件评估系统,方便读者进行实践与应用。

本书由苏州大学的王宜怀负责编制提纲和统稿工作,并撰写了第2~6章;中国科学技术大学的邵长星撰写了第7~11章及附录;NXP公司的黄熙撰写了第1章、第12~14章;苏州大学的博士研究生蒋建武、朱仕浪,硕士研究生孙亚军、程宏玉、黄志贤、刘贤德等协助书稿整理及程序调试工作,他们卓有成效的工作,使本书更加实用;ARM 公司、NXP 公司为本书的撰写提供了技术条件;电子工业出版社的编辑为本书的出版做了大量细致的工作。在此一并表示诚挚的谢意。

鉴于作者水平有限,书中难免存在不足和错误之处,恳望读者提出宝贵的意见和建议,以便再版时改进。苏州大学 王宜怀2018年5月第1章概述本章导读:鉴于本书主要阐述面向汽车电子的微控制器,作为全书导引,本章首先简要阐述汽车电子技术的基本概念、我国汽车电子发展概况,以及恩智浦公司在汽车电子市场中的地位,随后给出恩智浦公司面向汽车电子的微控制器 S32K 系列的型号标识与基本特点。S32K 系列微控制器与一般工业级微控制器的主要区别是提高了运行温度等级和电磁兼容等级,当然也可用于一般工业控制领域。本章参考资料:1.4节中关于S32K系列微控制器的型号标识参考《S32K数据手册》的第3章;S32K系列MCU的基本特点及简明资源参考《S32K参考手册》的第2章;有关简称含义见本书附录F。1.1 汽车电子技术的基本概念

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

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

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

汽车产业的迅猛发展为汽车电子及相关半导体产业提供了广阔的市场前景。根据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亿美元。我国汽车电子市场及其增长走势如图1-1所示。图1-1 我国汽车电子市场规模及其增长率走势

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

恩智浦公司(收购飞思卡尔公司后)是汽车电子及嵌入式处理解决方案的主要供应商,其主要业务涉及汽车电子、消费电子、工业电子及网络设备等市场。其中,汽车电子类客户遍及全球各大顶尖零部件厂商和整车厂商。

几十年来,凭借突破性思维、工程技术专长、对高品质的追求,以及长久保持的市场领军地位等优势,恩智浦公司在汽车电子市场上发挥着举足轻重的作用。(1)北美汽车半导体供应商领域:第一(来源:Strategy Analytics,2014年4月)。(2)全球商用汽车微机电系统(Micro-Electro-Mechanical System,MEMS)传感器领域:第一(来源:IHS,2014年5月)。(3)全球商用汽车加速度传感器领域:第一(来源:IHS,2014年5月)。(4)全球汽车微控制器领域:第二(来源:IHS,2014年3月)。(5)全球车载信息娱乐微处理器领域:第二(来源:Strategy Analytics,2014年4月)。(6)恩智浦公司创造了全球第一款发动机控制芯片,并保持领先至今。(7)恩智浦公司是全球首家集成77 GHz雷达技术的汽车半导体供应商。(8)全球TOP10的汽车厂商有7家选择i.MX6应用微处理器来支持其信息娱乐系统的连接和解决方案。(9)全球6大顶尖豪华车品牌将在其图形化仪表盘中采用i.MX应用微处理器。(10)2016年,在总值274亿美元的汽车半导体市场中,恩智浦公司(NXP)已占有14.2%的市场份额。

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

恩智浦公司为汽车电子市场提供了产品长期供货保障,广泛应用的器件都包含在该计划中,可保证至少15年的供货期。恩智浦公司全面贯彻高品质企业文化,致力保证产品质量、交货时间和最高服务水平,并成为客户眼中最卓越的半导体公司。1.4 面向汽车电子的S32K系列微控制器简介

S32K系列MCU是恩智浦公司针对汽车市场最新开发的MCU,在汽车电子领域有着广泛的应用。例如,在信息娱乐系统连接模块、停车辅助系统、普通直流电机/无刷直流电机(Brushless Direct Current Motor,BLDC)控制、电子驻车制动、电池管理、泵/风扇控制器、智能无钥匙进入及启动系统、汽车照明、车身中控/空调、车窗/天窗/车门、座椅/后视镜/雨刮器、防盗装置、动力总成配套芯片、通用传感器节点等方面,都可以作为目标应用。1.4.1 S32K系列微控制器的型号标识

学习一个新的微控制器(MCU)可以从认识型号标识开始,型号标识也是芯片选型与购买的关键知识。

恩智浦公司S32K系列MCU的型号众多,但同一子系列的中央处理器(Central Processing Unit,CPU)是相同的,多种型号只是为了适用于不同的应用场合。为了方便选型或订购,恩智浦公司给出了[1]MCU型号标识。S32K系列型号标识格式为:“F S32 K I J N X Y F0 M LC R”,各字段说明如表1-1所示。表1-1 S32K系列芯片命令字段说明

本书使用的芯片型号为 FS32K144UAT0VLLA,从该芯片型号标识可以获得如下信息:该芯片为S32K系列、ARM Cortex-M4F内核、CPU最高频率为112 MHz、程序Flash大小为512 KB、包含控制器局域网(Controller Area Network,CAN)模块、运行温度范围是–40℃~105℃、100引脚LQFP封装。1.4.2 S32K系列微控制器的简明特性与结构框图

学习一个新的MCU,了解该MCU的简明特性与结构框图是十分必要的。

S32K系列MCU基于的ARM Cortex-M4F微控制器是目前市场上能效最高的32位微控制器,每微安的数据吞吐量在业内居领先水平。S32K系列MCU具有多种灵活的超低功耗模式,适合不同的应用情形,可最大限度地延长电池的使用时间;在不唤醒内核的情况下,智能外设在深度睡眠模式下仍然可以工作,可进行智能决策并处理数据。S32K系列MCU包含了一组功能强大的模拟、通信、定时和控制外设,提供各种闪存规格和引脚数。(1)供电电压、工作频率、温度范围:该系列MCU的工作电压范围为2.7~5.5V,内核运行频率最大为112 MHz,运行温度范围为-40℃~125℃。(2)系统工作时钟源及低功耗特性:内部含128 kHz低功耗振荡器,支持32.768 kHz晶体振荡器、4~40 MHz外接晶体振荡器或陶瓷谐振器;在低功耗特性方面,电源管理模块具有多个电源管理模式,以支持低功耗应用。(3)人机接口、模拟模块、定时器:最多可达156个通用输入/输出接口,大多支持外部中断;2个32通道的12位模/数转换器,可在停止模式下运行,提供硬件触发选项;提供4个独立的32位柔性定时器模块,提供多达32个标准通道;1个具有灵活唤醒控制功能的16位低功耗定时器;2个可编程延迟模块,带有灵活的触发系统;1个带4个通道的32位低功耗中断定时器;1个32位实时时钟。(4)通信接口:3个串行通信接口、2个串行外设接口、2个集成2电路互连(IC)总线接口,3个CAN总线接口,均支持直接存储器访问(Direct Memory Access,DMA)及低功耗模式。(5)可扩展解决方案:包括高达2 MB的闪存(Flash),并且可轻松扩展,以满足不同的汽车应用需求。

S32K系列MCU的结构框图如图1-2所示。图1-2 S32K系列MCU的结构框图1.4.3 S32K系列微控制器的共性资源列表

S32K系列MCU由两个子系列组成,分别是内核为ARM Cortex-M0+的S32K11x系列和内核为ARM Cortex -M4F的S32K14x系列,表1-2给出了S32K系列MCU的共性资源列表。所有 S32K 系列 MCU 均具有低功耗与丰富的混合信号控制外设,提供了不同的闪存容量和引脚数量,供实际应用选型。表1-2 S32K系列MCU的共性资源① FlexMem:可配置存储器,即FlexNVM+FlexRAM,可配置为数据Flash、仿真EEPROM和FlexRAM。S32K144的FlexMem大小为64 KB。[1]来自《S32K数据手册》第3章,该文档中给出的型号标识字段中含有程序存储器类型,实际出厂的芯片并未使用该字段,默认程序存储器为Flash。第2章ARM Cortex-M4F微控制器本章导读:本书介绍的 MCU的内核使用 ARM Cortex-M4F微控制器,需要学习 ARM Cortex-M4F汇编的读者可以阅读本章全部内容,其他读者简要了解2.1节即可。虽然本书使用C语言讲述MCU的嵌入式开发,但理解1到2个结构完整、组织清晰的汇编程序对嵌入式开发将有很大帮助。实际上,学习本章内容并不会耽误多少时间,但对理解机器码和一些细节有益,例如,初始化、操作系统调度、快速响应等特殊功能必须使用汇编语言来完成。本章内容包括:ARM Cortex-M4F的特点、内核结构、存储器映像及内部寄存器概述;指令简表、寻址方式及指令的分类介绍;指令集与机器码对应表,供机器码级别的调试分析使用;给出ARM Cortex-M4F汇编语言的基本语法。本章参考资料:本章2.1.1节及2.1.3节参考《ARMv7-M参考手册》;2.4节参考《GNU汇编语法》。2.1 ARM Cortex-M4F微控制器简介[1]

本书介绍的 MCU的内核使用32位ARM Cortex-M4F微控制器(简称CM4F),它是ARM大家族中重要一员。

2010年ARM公司发布Cortex-M4微控制器,浮点处理器(Floating Point Unit,FPU)作为内核的可选模块,如果Cortex-M4微控制器包含FPU,则称它为Cortex-M4F。Cortex-M4与ARM在2005年发布的Cortex-M3微控制器都是基于ARMv7-M架构的,从功能上来看可以认为Cortex-M4是在Cortex-M3加上数字信号处理(DSP)指令与可选的FPU构成的,所以它们有许多的共同点。(1)32位微控制器,内部寄存器、数据总线都为32位。[2](2)采用Thumb2技术,同时支持16位与32位指令。[3](3)采用哈佛总线架构,使用统一存储空间编址,32位寻址,最多支持4 GB的存储空间,采用三级流水线设计。(4)片上接口基于高级微控制器总线架构(Advanced Microcontroller Bus Architecture, AMBA)技术,能进行高吞吐量的流水线总线操作。(5)集成嵌套向量中断控制器(Nested Vectored Interrupt Controller,NVIC),根据不同的芯片设计,可支持8~256个中断优先级,最多240个中断请求。(6)可选的存储器保护单元,具有存储器保护特性,如访问权限控制;提供时钟嘀嗒(Clcok Tick)、主栈指针、线程栈指针等操作系统特性。(7)具有多种低功耗特性和睡眠模式。

Cortex-M3微控制器和 Cortex-M4微控制器都提供了数据操作指令、转移指令、存储器数据传送指令等基本指令,这些基本指令在2.2节会详细介绍;此外Cortex-M4微控制器还支持单指令多数据(Single Instruction Multiple Data,SIMD)、快速乘法累加(Multiply Accumulate,MAC)等数字信号处理(DSP)相关指令;Cortex-M4F微控制器还支持单精度的浮点指令。

相比其他架构的32位微控制器,Cortex-M4微控制器有较高的性能与较低的功耗,具有优秀的能耗效率,Cortex-M3微控制器和Cortex-M4微控制器性能可达到3 CoreMark/MHz、1.25 DMIPS/[4]MHz(基于Dhrystone2.1平台);Cortex-M3微控制器和Cortex-M4微控制器还进行了低功耗的优化。由于采用了 Thumb ISA(指令架构),在 Cortex-M3微控制器和Cortex-M4微控制器上编程可以获得较高的代码密度。

Cortex-M3微控制器和Cortex-M4微控制器易于使用,它们采用的架构针对C语言编译器进行了优化,可以使用标准C语言完成绝大多数的编程代码;此外,还提供了程序运行暂停、单步调试、捕捉程序流、数据变动等调试手段,使代码调试更加方便。

Cortex-M3微控制器和 Cortex-M4微控制器具有高性能与低功耗,可广泛应用于汽车、数据通信、工业控制、消费电子、片上系统、混合信号设计等方面。2.1.1 ARM Cortex-M4F微控制器内部结构概要

ARM Cortex-M4F微控制器的组件结构如图2-1所示,下面简要介绍各部分。

1.M4F内核

ARM Cortex-M4F是一种低功耗、高性能、高速度的微控制器,[5]基于ARMv7-M架构,支持Thumb指令集,同时采用Thumb2技术,且拥有符合IEEE 754标准的单精度FPU。在硬件方面,支持除法指令,并且有中断处理程序和线程两种模式。32位的ARM Cortex-M4F微控制器具有指令和调试两种状态。在处理中断方面,M4F内核具有自动保存微控制器状态和恢复低延迟中断。ARM Cortex-M4F 微控制器可提供更高性能,比如定点运算的速度是ARM Cortex-M3微控制器的2倍,而浮点运算速度比ARM Cortex-M3微控制器快10倍以上,同时功[6]耗只有一半。图2-1 ARM Cortex-M4F微控制器的组件结构

2.嵌套中断向量控制器

嵌套中断向量控制器(Nested Vectored Interrupt Controller,NVIC)是一个在Cortex-M4F微控制器中内建的中断控制器。NVIC可用于对优先级进行分组,这样在选择中断时可以设置抢占级和非抢占级别。对于Cortex-M4F微控制器而言,通过在NVIC中实现中断尾链和迟到功能,意味着两个相邻的中断不用再处理状态保存和恢复了。Cortex-M4F 微控制器会自动保存中断入口,并自动恢复,没有指令开销,在超低功耗睡眠模式下也可唤醒中断控制器。NVIC还采用了向量中断的机制,在中断发生时,它会自动取出对应的中断服务例程入口地址,并且直接调用,无须软件判定中断源,从而缩短中断延时。为优化低功耗设计,NVIC 还集成一个可选唤醒中断控制器(Wakeup Interrupt Control,WIC),在睡眠模式或深度睡眠模式下,芯片可快速进入超低功耗状态,且只能被WIC唤醒源唤醒。在Cortex-M4F微控制器中,还包含一个24位倒计时定时器Systick,即使系统在睡眠模式下也能工作,它是作为嵌套中断向量控制器(NVIC)的一部分实现的,若用于实时操作系统(Real Time Operation System,RTOS)的时钟,将给RTOS在同类内核芯片间的移植带来便利。

3.存储器保护单元

存储器保护单元(Memory Protection Unit,MPU)可以对一个选定的内存单元进行保护,它将存储器划分为8个子区域,每个子区域的优先级均是可自定义的。微控制器可以禁用和使能指定的区域。

4.调试解决方案

ARM Cortex-M4F微控制器可以对存储器和寄存器进行调试访问,具有串行线 SWD或JTAG调试访问接口,或者两种接口都包括;Flash修补和断点(Flash Patch and Breakpoint, FPB)单元用于实现硬件断点和代码修补;数据观察点及跟踪(Data Watchpoint and Trace, DWT)单元用于实现观察点、跟踪资源和系统分析;指令跟踪宏(Instrumentation Trace Macrocell,ITM)单元用于提供对 printf()类型调试的支持;跟踪端口接口单元(Trace Port Interface Unit,TPIU)用来连接跟踪端口分析仪,包括单线输出模式。

5.总线接口

ARM Cortex-M4F微控制器提供先进的高性能总线(AHB-Lite)接口,其中包括的5个接口分别为:ICode 存储器接口、DCode 存储器接口、系统接口,还有基于高性能外设总线(ASB)接口,以及外部专用外设总线(PPB)接口。位段的操作可以细化到原子位段的读写操作;对内存的访问是对齐的,并且在写数据时采用写缓冲区的方式。

6.浮点运算处理器

浮点运算处理器可以处理单精度32位指令数据,并结合了乘法和累积指令用来提高计算的精度。此外,硬件能够进行加减法、乘除法及平方根等运算操作,同时也支持所有的IEEE数据四舍五入模式。浮点运算处理器拥有32个专用32位单精度寄存器,也可作为16个双字寄存器寻址,并且通过采用解耦三级流水线来加快了处理器的运行速度。2.1.2 ARM Cortex-M4F微控制器存储器映像

Cortex-M4F微控制器直接寻址空间为4 GB,地址范围是0x0000_0000~0xFFFF_FFFF。这里所说的存储器映像,其含义是把这4 GB空间当成存储器来看待,将空间分成若干区间,然后在不同的区间安排实际的物理资源。ARM 定出的条条框框是“粗线条”的,允许芯片制造商灵活地分配存储器空间,以制造出各具特色的MCU产品。

图2-2给出了CM4F的存储器空间地址映像,CM4F的存储器系统[7]支持小端格式和大端格式,芯片在出厂时由厂商定义,例如S32K系[8]列微控制器采用小端格式。2.1.3 ARM Cortex-M4F微控制器的寄存器

学习一款微控制器时,理解其内部寄存器的用途是重要的一环。CM4F 的寄存器包含用于数据处理与控制的寄存器、特殊功能寄存器与浮点寄存器,如图2-3所示。数据处理与控制寄存器在Cortex-M系列处理器中的定义与使用基本相同,它包括R0~R15,其中R13作为堆栈指针(SP)。SP实质上有两个(MSP与PSP),但在同一时刻只能使用一个,这也就是所谓的“Banked”寄存器。特殊功能寄存器有预定义的功能,而且必须通过专用的指令来访问,在Cortex-M系列微控制器中,Cortex-M0与M0+的特殊功能寄存器数量与功能相同, Cortex-M3与M4比M0与M0+多了3个用于异常或中断屏蔽的寄存器,而且在某些寄存器上的预定义不尽相同。在Cortex-M系列微控制器中浮点寄存器只存在于CM4F中。图2-2 CM4F的存储器空间地址映像图2-3 CM4F的寄存器

1.数据处理与控制寄存器(1)通用寄存器R0~R12。R0~R12是最具通用目的的32位通用寄存器,通常用于数据操作。大部分能够访问通用寄存器的指令都可以访问R0~R12,低位寄存器(R0~R7)能够被所有访问通用寄存器的指令访问,高位寄存器(R8~R12)只能被所有32位通用寄存器指令访问,不能被16位指令访问。(2)堆栈指针R13。寄存器R13是作为堆栈指针(SP)使用的,堆栈指针用于访问堆栈,因为SP会忽略[1:0]位(即最低两位永远是0),因此堆栈是按照字对齐(4个字节对齐)的。主堆栈指针(MSP)是复位后默认使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断处理程序)。Handler模式总是使用主堆栈指针(MSP),但是也可以配置成Thread模式来使用MSP或者进程堆栈指针(PSP)[9]。(3)链接寄存器R14。寄存器R14是作为子程序链接寄存器(LR)使用的,当执行分支链接(BL)或分支链接执行交换(BLX)指令后,LR从程序计数器(PC)获取返回地址, LR也可用于异常返回。R14也可以作为通用寄存器来使用。(4)程序计数器。程序计数器(Program Counter,PC)是中央处理器(CPU)内最为突出的一个寄存器,它是程序执行控制寄存器。ARM Cortex-M系列的R15寄存器是程序计数器(PC),指向当前的程序地址。复位时将复位向量的值加载到PC,通过修改它的值,就能改变程序的执行顺序。若该寄存器的[0]位为0,则指令总是按照字对齐或者半字对齐的。PC可以使用特权或者非特权模式进行访问。

2.特殊功能寄存器(1)程序状态寄存器(PSR)。程序状态寄存器在内部可分为以下几个子寄存器:APSR、IPSR、EPSR,这三个子寄存器既可以单独访问,也可以两个或三个组合到一起访问。使用三合一方式访问时,把该寄存器称为xPSR。CM4F程序状态寄存器(xPSR)及其子寄存器如表2-1所示,其中xPSR、IPSR和EPSR寄存器只能在特权模式下被访问,而APSR寄存器能够在特权或者非特权模式下被访问,具体描述详见《CM4用户指南》。表2-1 CM4F程序状态寄存器(xPSR)及其子寄存器

① 应用程序状态寄存器(APSR):显示算术运算单元(ALU)状态位的一些信息。

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

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

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

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

以上各位在Cortex-M系列微控制器中M0、M0+、M3、M4定义是一样的,这些位在条件转移指令中会用到,复位之后这些位是随机的。[10]

饱和标志位Q:在实现DSP扩展的微控制器中,如果在运算中出现饱和,微控制器就会将该位置1,将该位置1称为饱和。该位只在Cortex-M3、Cortex-M4中存在。

大于或等标志位GE:仅用于DSP扩展,使用SIMD指令更新这些标志,GE用以指明结果来自操作的单个字节或半字,软件可以使用这些标志控制稍后的 SEL 指令,该位只在Cortex-M4中存在。更多信息请参考《ARMv7-M参考手册》。

② 中断程序状态寄存器(IPSR):每次异常完成之后,微控制器会实时更新 IPSR 内的异常号,IPSR只能被MRS指令读/写。在进程模式下(可以理解为处于无操作系统的主循环中,或者有操作系统情况下的某一任务程序中),IPSR值为0。在Handler模式(处理异常的模式,可简单地理解成中断状态)下,IPSR 存放当前异常的异常号。复位之后,IPSR 将被自动清0。复位异常号是一个暂时值,在复位时,复位异常号是不可见的。在Cortex-M系列微控制器中,M0和M0+当前异常的异常号占用0~5位、M3、M4则占用0~8位,这与微控制器所能支持的异常或中断数量有关。

③ 执行程序状态寄存器(EPSR):T 标志位指示当前运行的是否 Thumb 指令,该位是不能被软件读取的,运行复位向量对应的代码时该位置1;如果该位为0,会发生硬件异常,进入硬件中断处理程序。在Cortex-M系列处理器中这一位的定义是相同。

ICI/IT 标志位用于指示异常可继续指令状态或保存的 IT 状态,该位存在 Cortex-M3与Cortex-M4中,更多信息请参考《ARMv7-M参考手册》。(2)中断屏蔽寄存器(PRIMASK)。中断屏蔽寄存器的D31~D1位保留,只有D0位(记为PM)有意义。当D0位被置1时,除不可屏蔽中断和硬件错误之外的所有中断都将被屏蔽,使用特殊指令(如MSR、MRS)可以访问该寄存器。此外,还有条特殊指令也能访问它,即改变处理器状态指令CPS,但是该指令只有在实时任务时才会用到。执行汇编指令“CPSID i”,则将D0位置1(关总中断);执行汇编指令“CPSIE i”,则将D0位清0(开总中断),其中i代表IRQ中断,IRQ是非内核中断请求(Interrupt Request)的缩写。(3)错误屏蔽寄存器(FAULTMASK)。FAULTMASK 寄存器与 PRIMASK 寄存器的区别在于,它能够屏蔽掉优先级更高的硬件错误(Hard Fault)异常。错误屏蔽寄存器的D31~D1位保留,只有D0位有意义。当D0位被置1时,除不可屏蔽中断(NMI)之外的所有中断都会被屏蔽,也就是说硬件错误异常也会被屏蔽掉。该寄存器只能在特权模式下访问,使用特殊指令(如MSR、MRS)可以访问该寄存器。此外,还有条特殊指令也能访问它,即改变处理器状态指令CPS,但是该指令只有在实时任务时才会用到。执行汇编指令“CPSID F”,则将D0位置1(关总中断);执行汇编指令“CPSIE F”,则将D0位清0(开总中断),其中F代表FAULTMASK。在退出异常处理时FAULTMASK会被自动清除,但从不可屏蔽中断(NMI)中退出除外。复位时FAULTMASK寄存器将被清除。FAULTMASK寄存器存在Cortex-M3与Cortex-M4中。(4)基本优先级屏蔽寄存器(BASEPRI)。基本优先级屏蔽(BASEPRI)寄存器提供了一种更加灵活的中断屏蔽机制,通过设置该寄存器可以屏蔽特定优先级的中断,当该寄存器设置为一个非零值时,所有优先级值大于等于(中断的优先级值越大表示优先级越低)该值的中断都会被屏蔽,当该寄存器为0时不起作用。BASEPRI寄存器只能在特权模式下访问,复位时,BASEPRI寄存器将被清除。

BASEPRI寄存器的宽度与在芯片设计时实际实现的中断优先组长数量有关,通常BASEPRI寄存器的宽度为3~8位二进制,占用D0~D7位,当不足8位时高位有效。例如,当BASEPRI寄存器的宽度为3位时,D7、D6、D5有效,BASEPRI寄存器设置值有0xE0、0xC0、0xA0、0x80、0x60、0x40、0x20、0x00,共8个。BASEPRI寄存器存在Cortex-M3与Cortex-M4中。

BASEPRI寄存器还有另一种访问方式,即通过BASEPRI_MAX访问,它们在物理上是同一个寄存器,但访问方式有些不同,使用BASEPRI_MAX访问时,不能接收大于当前中断优先级的值,例如,下面指令中0x80不会被接收(假设BASEPRI_MAX原有的值为0x40)。MOV R0,#0x80         //R0←0x80MSR BASEPRI_MAX,R0     //本次写操作不起作用,因为0x80优先级低于0x40

要设置为更低的优先级可以使用BASEPRI寄存器。(5)控制寄存器(CONTROL)。Cortex-M0、M3和M4内核中的控制寄存器(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模式下,总是在特权模式下访问D0位的。

Cortex-M4F中除了以上D1、D0位,还定义了D2位,D2位(FPCA)会在执行浮点指令时自动置1,当FPCA=1且发生了异常时,处理器的异常处理机制就认为当前上下文使用了浮点指令,这时就需要保存浮点寄存器,浮点寄存器的保存方式分多种,这里不再详细叙述,请读者参考《CM3/4权威指南》《ARMv7-M参考手册》。处理器硬件会在异常入口处清除FPCA位。

3.浮点寄存器

浮点控制寄存器只在 Cortex-M4F 中存在,其中包含了用于浮点数据处理与控制的寄存器,在这里只进行简单的介绍,详细内容请参考《CM3/4权威指南》《ARMv7-M参考手册》。此外,浮点单元还有一些不在内核中、可通过存储器映射的寄存器,如协处理器访问控制寄存器(CPACR)。需要注意的是,为降低功耗,浮点单元默认是被禁用的,如需使用浮点运算就要通过设置CPACR来启用浮点单元。(1)S0~S31和D0~D15。S0~S31都是32位寄存器,每个寄存器都可用来存放单精度浮点数,它们两两组合可用来存放双精度浮点数,两两组合成双精度寄存器时可用D0~D15来访问,例如,D0是由S0和S1组合而成的。注意Cortex-M4F的浮点运算单元只能进行单精度浮点运算,不支持双精度浮点运算,但可以传输双精度浮点数。(2)浮点状态控制寄存器(FPSCR)。浮点状态控制寄存器提供了浮点系统的应用程序级控制,包括浮点运算结果的状态信息,以及定义一些浮点运算的动作。浮点状态控制寄存器在系统复位时状态是未知的,其各位含义如表2-2所示,包括负标志(N)、零标志(Z)、进位/借位标志(C)、溢出标志(V)、交替半精度控制位(AHP)、默认模式控制位(DN)、清0模式控制位(FZ)、舍入模式控制位(RMode)、输入非正常累积异常位(IDC)、不精确累积异常位(IXC)、下溢累积异常位(UFC)、溢出累积异常位(OFC)、被零除累积异常位(DZC)、非法操作累积异常位(IOC)。表2-2 浮点状态控制寄存器(FPSCR)的各位含义2.2 指令系统

CPU 的功能是从外部设备获得数据,经过加工、处理后再把处理结果发送到和 CPU 连接的外部设备。设计一个CPU,首先需要设计一套可以执行特定功能的操作命令,这种操作命令称为指令。CPU 所能执行的各种指令的集合,称为该 CPU 的指令系统。表2-3给出了ARM Cortex-M指令集概况。在ARM系统中,使用架构(Architecture)一词,即体系结构,主要是指使用的指令集。由同一架构,可以衍生出许多不同的处理器型号。对 ARM 而言,其他芯片厂商,可由 ARM 提供的一种处理器架构具体生产出许多不同的 MCU 或处理器型号。ARMv7-M 是一种架构,其中 v7是指版本号,而基于该架构处理器有 Cortex-M3、Cortex-M4、Cortex-M4F等。读者了解其基本脉络即可。表2-3 ARM Cortex-M指令集概况

本节在给出指令简表与寻址方式的基础上,简要阐述ARM Cortex-M系列共用的57条基本指令功能。2.2.1 指令简表与寻址方式

1.指令简表

ARM Cortex-M4F支持所有的Thumb和Thumb2指令,还支持浮点运算指令、DSP扩展指令等。常用的指令大体可分为数据操作类指令、跳转控制类指令、数据传送类指令,以及其他指令。Cortex-M4F有53条16位指令、92条32位指令和35条浮点指令,这其中包含了一些Cortex-M3中不支持的协议处理器指令和用于Cache的指令。表2-4为基本指令简表,供读者简要了解,需要记忆几个保留字以便理解基本的汇编程序,其他指令在需要时可查阅《ARMv7-M参考手册》。表2-4 基本指令简表

2.寻址方式

指令是对数据的操作,通常把指令中所要操作的数据称为操作数,ARM Cortex-M4F微控制器所需的操作数可能来自寄存器、指令代码、存储单元。确定指令中所需操作数的各种方法称为寻址方式(Addressing Mode)。下面指令格式中的“{}”表示其中是可选项,如“LDRH Rt, [Rn {, #imm}]”,表示有“LDRH Rt, [Rn ]”“LDRH Rt, [Rn , #imm]”两种指令格式。指令中的“[ ]”表示其中的内容为地址,“//”表示注释。(1)立即数寻址。在立即数寻址方式中,操作数直接通过指令给出,数据包含在指令编码中,随指令一起被编译成机器码后存储在程序空间中。“#”为立即数的前导标识符,ARM Cortex-M4立即数范围是0x00~0xff。例如:SUB R1,R0,#1       //R1←R0-1MOV R0,#0xff       //即数0xff装入R0寄存器(2)寄存器寻址。在寄存器寻址中,操作数来自寄存器。例如:MOV R1,R2       //←R2SUB R0,R1,R2      //0←R1-R2(3)直接寻址。在直接寻址方式中,操作数来自存储单元,在指令中直接给出的是存储单元地址。在指令码中,给出了数据的位数,有字(4字节)、半字(2字节)、单字节三种情况。例如:LDR   Rt,label      //在label处连续取4字节至寄存器中LDRH  Rt,label      //在label处读取半字到RtLDRB  Rt,label      //在label处读取字节到Rt(4)偏移寻址及寄存器间接寻址。在偏移寻址中,操作数来自存储单元,指令通过寄存器及偏移量给出存储单元的地址,偏移量不能超过4 KB(指令编码中偏移量为12位)。偏移量为0的偏移寻址也称为寄存器间接寻址。例如:LDR R3,[PC,#100]     //将(PC+100)的存储器单元的内容加载到寄存器R3中LDR R3,[R4]        //将R4的存储单元的内容加载到寄存器R3中2.2.2 数据传送类指令

数据传送类指令的功能有两种:一是将存储器地址空间中的数据传送到寄存器中;二是将寄存器中的数据传送到另一寄存器或存储器地址空间中。基本的数据传送类指令有16条。

1.取数指令

取数指令是将存储器中内容加载(Load)到寄存器中的指令,如表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状态标志。

2.存数指令

存数指令是将寄存器中内容存储(Store)到存储器单元中的指令,如表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寄存器必须位于列表首位;若reglist列表中不包含Rn,则将位于Rn+4×n地址回写到Rn寄存器中。这些指令不影响N、Z、C、V状态标志。表2-6 存数指令

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

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

4.堆栈操作指令

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

例如:PUSH{R0,R4-R7}    @将R0,R4~R7寄存器值入栈PUSH{R2,LR}     @将R2,LR寄存器值入栈POP{R0,R6,PC}    @出栈,将堆栈中的值保存R0、R6、PC中,同时跳转至PC所指向的地址

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

ADR指令(见表2-9)用于将指针PC值加上一个偏移量得到的地址写入目标寄存器中。若利用ADR指令生成的目标地址用于跳转指令BX、BLX,则必须确保该地址最后一位为1。Rd为目标寄存器,label为与指针PC相关的表达式。在该指令下,Rd必须为R0~R7,数值必须字对齐且在当前PC值的1020字节以内。此指令不影响N、Z、C、V状态标志。这条指令主要在编译阶段使用,一般可看成一条伪指令。表2-9 ADR指令2.2.3 数据操作类指令

数据操作主要包括算术运算、逻辑运算、移位等。

1.算术运算类指令

算术类指令有加、减、乘、比较等,如表2-10所示。表2-10 算术类指令

加、减指令对操作数的限制条件如表2-11所示表2-11 加、减法指令对操作数的限制条件

2.逻辑运算类指令

逻辑运算类指令如表2-12所示,其中 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-12 逻辑运算类指令

3.移位类指令

移位类指令如表2-13所示,其中,ASR、LSL、LSR和ROR指令根据寄存器Rs或立即数imm决定移动位数寄存器Rm的值进行算术右移、逻辑左移、逻辑右移和循环右移操作。在这些指令中,Rd、Rm、Rs必须为R0~R7;对于非立即数指令,Rd和Rm必须一致。Rd为目标寄存器,若省去Rd,表示其值与Rm寄存器一致;Rm为存放被移位数据寄存器;Rs为存放移位长度寄存器;imm为移位长度,ASR指令的移位长度范围为1~32,LSL指令的移位长度范围为0~31,LSR指令的移位长度范围为1~32。表2-13 移位指令(1)单向移位指令。算术右移指令ASR指令比较特别,它把要操作的字节当成有符号数,而符号位(b31)保持不变,其他位右移一位,即首先将b0位移入C中,其他位(b1~b31)右移一位,相当于操作数除以2。为了保证符号不变,ASR指令使符号位b31返回本身。逻辑右移指令LSR把32位操作数右移一位,首先将b0位移入C中,其他右移一位,0移入b31。根据结果,ASR、LSL、LSR指令对标志位N、Z有影响;最后移出位更新标志位C。(2)循环移位指令。在循环右移指令ROR中,将b0位移入b31中的同时也移入C中,其他位右移一位,从b31~b0内部看来循环右移了一位。根据结果,ROR指令对标志位N、Z有影响;最后移出位更新标志位C。

4.位测试指令

位测试指令见表2-14。表2-14 位测试指令

5.数据序转指令

数据序转指令如表2-15所示。该指令用于改变数据的字节顺序,其中,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 反序操作表2-15 数据序转指令

6.扩展类指令

扩展类指令如表2-16所示,其中,寄存器Rm存放待扩展操作数,寄存器Rd为目标寄存器,Rm、Rd必须为R0~R7。这些指令不会影响标志位N、Z、C、V。表2-16 扩展类指令2.2.4 跳转控制类指令

跳转控制类指令如表2-17所示,这些指令不会影响标志位N、Z、C、V。表2-17 跳转控制类指令

跳转控制类指令举例如下,特别要注意BL指令常用于调用子程序。BEQ label      @条件跳转,标志位Z=1时跳转到label对应的地址BL  funC      @调用子程序funC,把跳转前的下条指令地址保存到LRBX  LR       @返回到函数调用处

B指令所带条件众多,可以形成不同条件下的跳转,但只能在前256字节到后254字节地址范围内跳转。B指令所带的条件见表2-18。表2-18 B指令所带的条件2.2.5 其他指令

不属于数据传送类、数据操作类、跳转控制类的指令称为其他指令,如表2-19所示,其中,spec_reg 表示特殊寄存器,如 APSR、IPSR、EPSR、IEPSR、IAPSR、EAPSR、PSR、MSP、PSP、PRIMASK或CONTROL。

表2-19中的中断指令(禁止总中断指令“CPSIE i”,使能总中断指令“CPSID i”)为编程必用指令,在实际编程时,由宏函数给出。

下面对两条休眠指令WFE与WFI进行简要说明。这两条指令只用于低功耗模式,并不产生其他操作(这一点类似于 NOP 指令)。休眠指令 WFE 执行情况由事件寄存器决定,若事件寄存器为零,只有在发生如下事件才执行:(1)发生异常,且该异常未被异常屏蔽寄存器或当前优先级屏蔽。(2)在进入异常期间,系统控制寄存器的SEVONPEND置1。(3)若使能调试模式时,触发调试请求。(4)外围设备发出一个事件或在多重处理器系统中另一个处理器使用SVC指令。

若事件寄存器为1,WFE指令清该寄存器后立刻执行。休眠指令WFI执行条件为:发生异常或PRIMASK.PM被清0,产生的中断将会抢先,或发生触发调试请求(不论调试是否被使能)。表2-19 其他指令

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载