周立功单片机
目录
• 第一章 嵌入式系统概述
• 第二章 嵌入式系统工程设计
• 第三章 ARM7体系结构
• 第四章 ARM7TDMI(-S)指令系统
• 第五章 LPC2000系列ARM硬件结构
• 第六章 接口技术与硬件设计
• 第七章 移植μC/OS-II到ARM7
• 第八章 嵌入式系统开发平台
周立功单片机
第1章 嵌入式系统概述
周立功单片机
第1章 目录
�1. 嵌入式系统
�2. 嵌入式处理器
�3. 嵌入式操作系统
周立功单片机
第1章 目录
�1. 嵌入式系统
�2. 嵌入式处理器
�3. 嵌入式操作系统
周立功单片机
嵌入式系统
• 概述
经过几十年的发展,嵌入式系统已经在很大程度
改变了人们的生活、工作和娱乐方式,而且这些改变
还在加速。嵌入式系统具有无数的种类,每类都具有
自己独特的个性。例如,MP3、数码相机与打印机就
有很大的不同。汽车中更是具有多个嵌入式系统,使
汽车更轻快、更干净、更容易驾驶。
周立功单片机
• 现实中的嵌入式系统
即使不可见,嵌入式系统也无处不在。嵌入式系
统在很多产业中得到了广泛的应用并逐步改变着这些
产业,包括工业自动化、国防、运输和航天领域。例
如神州飞船和长征火箭中肯定有很多嵌入式系统,导
弹的制导系统也是嵌入式系统,高档汽车中也有多达
几十个嵌入式系统。
在日常生活中,人们使用各种嵌入式系统,但未
必知道它们。事实上,几乎所有带有一点“智能”的家
电(全自动洗衣机、电脑电饭煲…)都是嵌入式系统。
嵌入式系统广泛的适应能力和多样性,使得视听、工
作场所甚至健身设备中到处都有嵌入式系统。
周立功单片机
• 现实中的嵌入式系统
周立功单片机
• 嵌入式系统的概念
目前,对嵌入式系统的定义多种多样,但没有一
种定义是全面的。下面给出两种比较合理定义:
●从技术的角度定义:以应用为中心、以计算机技
术为基础、软件硬件可裁剪、适应应用系统对功能、
可靠性、成本、体积、功耗严格要求的专用计算机
系统。
●从系统的角度定义:嵌入式系统是设计完成复杂
功能的硬件和软件,并使其紧密耦合在一起的计算
机系统。术语嵌入式反映了这些系统通常是更大系
统中的一个完整的部分,称为嵌入的系统。嵌入的
系统中可以共存多个嵌入式系统。
周立功单片机
• 嵌入式系统示例 ——汽车控制系统
周立功单片机
马达
控制器
车灯
• 嵌入式系统示例 ——汽车控制系统
尾灯控制
系统
后车门控
制系统前车门控
制系统
座椅控制
系统
发动器控
制系统
所有的控
制系统都
是一个完
整的嵌入
式系统
周立功单片机
• 嵌入式系统的未来
早在1990年之前,嵌入式系统通常是很简单的且
具有很长的产品生命周期的自主设备。近些年来,嵌
入式工业经历了巨大的变革。
�产品市场窗口现在预计翻番的周期狂热到6~9个
月。
�全球重新定义市场的机会和膨胀的应用空间。
�互联现在是一个需求而不是辅助性的,包括用有
线和刚刚显露头角的无线技术。
�基于电子的产品更复杂化。
�互联嵌入式系统产生新的依赖网络基础设施的应
用。
�微处理器的处理能力按莫尔定律(Moore’s L aw)
预计的速度在增加。该定律认为集成电路和晶体管
个数每18个月翻一番。
周立功单片机
第1章 目录
�1. 嵌入式系统
�2. 嵌入式处理器
�3. 嵌入式操作系统
周立功单片机
• 嵌入式处理器
早期的嵌入式系统通常使用普通个人计算机(PC)
中的通用处理器。近年来,随着大量先进的微处理器
制造技术的发展,越来越多的嵌入式系统用嵌入式处
理器建造,而不是用通用目的的处理器。 这些嵌入式
处理器可以大致分为以下几类:
�注重嵌入式处理器的尺寸、能耗和价格。应用于
PDA等不注重计算的设备;
�注重嵌入式处理器的性能。应用于路由器等计算
密集型的设备;
�注重嵌入式处理器的性能、尺寸、能耗和价格。
应用于蜂窝电话等设备;
——概述
周立功单片机
嵌入式处理器
• 分类
嵌入式处理器可以分为以下几大类:
�嵌入式微处理器;
�嵌入式微控制器;
�嵌入式DSP处理器;
�嵌入式片上系统(SOC)。
周立功单片机
• 嵌入式处理器
嵌入式微处理器的基础是通用计算机中的CPU。在应用中,将
微处理器装配在专门设计的电路板上,只保留和嵌入式应用有关的
母板功能,这样可以大幅度减小系统体积和功耗。为了满足嵌入式
应用的特殊要求,嵌入式微处理器虽然在功能上和标准微处理器基
本是一样的,但在工作温度、抗电磁干扰、可靠性等方面一般都做
了各种增强。
和工业控制计算机相比,嵌入式微处理器具有体积小、重量轻、
成本低、可靠性高的优点,但是在电路板上必须包括ROM、RAM、
总线接口、各种外设等器件,从而降低了系统的可靠性,技术保密
性也较差。嵌入式微处理器及其存储器、总线、外设等安装在一块
电路板上,称为单板计算机。如STD-BUS、PC104等。
——嵌入式微处理器
CPU
ROM
RAM
外设1
外设2
单板计算机
周立功单片机
• 嵌入式处理器
嵌入式微控制器又称单片机单片机,它是将整个计算机系统集成到一
块芯片中。嵌入式微控制器一般以某一种微处理器内核为核心,芯
片内部集成ROM/EPROM、RAM、总线、总线逻辑、定时/计数器、
WatchDog、I/O、串行口、脉宽调制输出、A/D、D/A、Flash RAM、
EEPROM等各种必要功能和外设。为适应不同的应用需求,一般一
个系列的单片机具有多种衍生产品,每种衍生产品的处理器内核都
是一样的,不同的是存储器和外设的配置及封装。这样可以使单片
机最大限度地和应用需求相匹配,功能不多不少,从而减少功耗和
成本。
和嵌入式微处理器相比,微控制器的最大特点是单片化,体积
大大减小,从而使功耗和成本下降、可靠性提高。微控制器是目前
嵌入式系统工业的主流。微控制器的片上外设资源一般比较丰富,
适合于控制,因此称微控制器微控制器。
嵌入式微控制器目前的品种和数量最多,比较有代表性的通用
系列包括8051、P51XA、MCS-251、MCS-96/196/296、C166/167、
MC68HC05/11/12/16、68300、数目众多ARM芯片等。目前MCU
占嵌入式系统约70%的市场份额。
——嵌入式微控制器
复位
部件
看门狗
部件
晶振
部件
I/O
部件
中断
部件
ROM
部件
SRAM
部件
定时器
部件 CPU核
周立功单片机
• 嵌入式处理器
DSP处理器对系统结构和指令进行了特殊设计,使其适合于执
行DSP算法,编译效率较高,指令执行速度也较高。在数字滤波、
FFT、谱分析等方面DSP算法正在大量进入嵌入式领域,DSP应用正
从在通用单片机中以普通指令实现DSP功能,过渡到采用嵌入式
DSP处理器。
嵌入式DSP处理器比较有代表性的产品是Texas Instruments的
TMS320系列和Motorola的DSP56000 系列。TMS320系列处理器包括
用于控制的 C2000系列,移动通信的C5000系列,以及性能更高的
C6000和C8000系列。DSP56000目前已经发展成为DSP56000,
DSP56100,DSP56200和DSP56300等几个不同系列的处理器。另外
PHILIPS公司近年也推出了基于可重置嵌入式DSP结构低成本、低功
耗技术上制造的R. E. A. L DSP处理器,特点是具备双Harvard结构和
双乘/累加单元,应用目标是大批量消费类产品。
——嵌入式DSP处理器
周立功单片机
• 嵌入式处理器
随着EDA的推广和VLSI设计的普及化及半导体工艺的迅速发
展,在一个硅片上实现一个更为复杂的系统的时代已来临,这就是
System On Chip(SOC)。各种通用处理器内核将作为SOC设计公司的
标准库,和许多其它嵌入式系统外设一样,成为 VLSI设计中一种标
准的器件,用标准的 VHDL等语言描述,存储在器件库中。用户只
需定义出其整个应用系统,仿真通过后就可以将设计图交给半导体
工厂制作样品。这样除个别无法集成的器件以外,整个嵌入式系统
大部分均可集成到一块或几块芯片中去,应用系统电路板将变得很
简洁,对于减小体积和功耗、提高可靠性非常有利。
SoC可以分为通用和专用两类。通用系列包括Infineon的TriCore、
Motorola的M-Core、某些ARM系列器件、Echelon和Motorola联合研
制的Neuron芯片等。专用SoC一般专用于某个或某类系统中,不为
一般用户所知。一个有代表性的产品是Philips的Smart XA,它将XA
单片机内核和支持超过2048 位复杂RSA算法的CCU单元制作在一块
硅片上,形成一个可加载JAVA或C语言的专用的SOC,可用于公众
互联网如Internet安全方面。
——嵌入式片上系统(SOC)
周立功单片机
第1章 目录
�1. 嵌入式系统
�2. 嵌入式处理器
�3. 嵌入式操作系统
周立功单片机
嵌入式操作系统
• 概述
计算机系统由硬件和软件组成,在发展初期没有
操作系统这个概念,用户使用监控程序来使用计算机。
随着计算机技术的发展,计算机系统的硬件、软件资
源也愈来愈丰富,监控程序已不能适应计算机应用的
要求。于是在六十年代中期监控程序又进一步发展形
成了操作系统(Operating System)。发展到现在,广泛
使用的有三种操作系统即多道批处理操作系统、分时
操作系统以及实时操作系统。
周立功单片机
嵌入式操作系统
• 概述
监
控
程
序
操
作
系
统
实时操作系统
分时操作系统
多道批处理操作系统
时 间 先 后
适用于多个用户共享系
统资源
适用于计算中心等较大
的计算机系统
适用于嵌入式设备和有
实时性要求的系统中
周立功单片机
嵌入式操作系统
• 概述
监
控
程
序
操
作
系
统
实时操作系统
分时操作系统
多道批处理操作系统
时 间 先 后
适用于多个用户共享系
统资源
适用于计算中心等较大
的计算机系统
适用于嵌入式设备和有
实时性要求的系统中
实时操作系统是
我们介绍的重点
周立功单片机
嵌入式操作系统
• 实时操作系统的特点
IEEE 的实时UNIX分委会认为实时操作系统应具
备以下的几点:
�异步的事件响应
�切换时间和中断延迟时间确定
�优先级中断和调度
�抢占式调度
�内存锁定
�连续文件
�同步
周立功单片机
嵌入式操作系统
• 实时操作系统的特点
总的来说实时操作系统是事件驱动的,能对来自
外界的作用和信号在限定的时间范围内作出响应。它
强调的是实时性、可靠性和灵活性, 与实时应用软件相
结合成为有机的整体起着核心作用, 由它来管理和协调
各项工作,为应用软件提供良好的运行软件环境及开发
环境。
从实时系统的应用特点来看实时操作系统可以分
为两种:一般实时操作系统一般实时操作系统和嵌入式实时操作系统嵌入式实时操作系统。
周立功单片机
嵌入式操作系统
• 实时操作系统的特点
一般实时操作系统一般实时操作系统应用于实时处理系统的上位机
和实时查询系统等实时性较弱的实时系统,并且提供
了开发、调试、运用一致的环境。
嵌入式实时操作系统嵌入式实时操作系统应用于实时性要求高的实时
控制系统,而且应用程序的开发过程是通过交叉开发
来完成的,即开发环境与运行环境是不一致。嵌入式
实时操作系统具有规模小(一般在几K~几十K 内)、可
固化使用实时性强(在毫秒或微秒数量级上)的特点 。
周立功单片机
嵌入式操作系统
• 基本概念
对基于芯片的开发来说,应用程序一般是一个无
限的循环,可称为前后台系统或超循环系统。
很多基于微处理器的产品采用前后台系统设计,
例如微波炉、电话机、玩具等。在另外一些基于微处
理器应用中,从省电的角度出发,平时微处理器处在
停机状态,所有事都靠中断服务来完成。
——前后台系统
周立功单片机
• 基本概念
中断服务程
序处理异步事
件,这部分可以
看成前台行为,
前台也叫中断级。
时间相关性很强
的关键操作一定
是靠中断服务程
序来保证的。
循环中调用
相应的函数完成
相应的操作,这
部分可以看成后
台行为,后台也
可以叫做任务级。
这种系统在处理
的及时性上比实
际可以做到的要
差。
ISRISRISRISR
ISRISRISRISR
ISRISRISRISR
ISRISRISRISR
后台 前台
中断服务程序 时
间
——前后台系统
周立功单片机
嵌入式操作系统
• 基本概念
操作系统是计算机中最基本的程序。操作系统负
责计算机系统中全部软硬资源的分配与回收、控制与
协调等并发的活动;操作系统提供用户接口,使用户
获得良好的工作环境;操作系统为用户扩展新的系统
功能提供软件平台。
——操作系统
硬件
硬件驱动
操作系统
用户程序
周立功单片机
嵌入式操作系统
• 基本概念
实时操作系统是一段在嵌入式系统启动后首先执
行的背景程序,用户的应用程序是运行于RTOS之上的
各个任务,RTOS根据各个任务的要求,进行资源(包
括存储器、外设等)管理、消息管理、任务调度、异常
处理等工作。在RTOS支持的系统中, 每个任务均有
一个优先级,RTOS根据各个任务的优先级,动态地切
换各个任务,保证对实时性的要求。
——实时操作系统(RTOS)
周立功单片机
嵌入式操作系统
• 基本概念
代码的临界区也称为临界区,指处理时不可分割
的代码,运行这些代码不允许被打断。一旦这部分代
码开始执行,则不允许任何中断打入(这不是绝对
的,如果中断不调用任何包含临界区的代码,也不访
问任何临界区使用的共享资源,这个中断可能可以执
行)。为确保临界区代码的执行,在进入临界区之前
要关中断,而临界区代码执行完成以后要立即开中断。
——代码的临界区
周立功单片机
嵌入式操作系统
• 基本概念
程序运行时可使用的软、硬件环境统称为资源。
资源可以是输入输出设备,例如打印机、键盘、显示
器。资源也可以是一个变量、一个结构或一个数组等。
——资源
周立功单片机
任务A
共享资源任务B
任务C
信号量
嵌入式操作系统
• 基本概念
可以被一个以上任务使用的资源叫做共享资源。
为了防止数据被破坏,每个任务在与共享资源打交道
时,必须独占该资源,这叫做互斥。
——共享资源
访问共享资源之
前申请信号量
其它任务访问受阻
而不能使用共享资源
得到允许后,才
能使用共享资源
周立功单片机
嵌入式操作系统
• 基本概念
一个任务,也称作一个线程,是一个简单的程
序,该程序可以认为CPU完全属于该程序自己。实时
应用程序的设计过程,包括如何把问题分割成多个任
务,每个任务都是整个应用的某一部分,每个任务被
赋予一定的优先级,有它自己的一套CPU寄存器和自
己的栈空间。
——任务
周立功单片机
嵌入式操作系统
• 基本概念
当多任务内核决定运行另外的任务时,它保存正
在运行任务的当前状态,即CPU寄存器中的全部内容。
这些内容保存在任务的当前状态保存区,也就是任务
自已的栈区之中。入栈工作完成以后,就把下一个将
要运行的任务的当前状态从任务的栈中重新装入CPU
的寄予存器,并开始下一个任务的运行。这个过程就
称为任务切换。这个过程增加了应用程序的额外负荷。
CPU的内部寄存器越多,额外负荷就越重。做任务切
换所需要的时间取决于CPU有多少寄存器要入栈。
——任务切换
周立功单片机
嵌入式操作系统
• 基本概念
多任务系统中,内核负责管理各个任务,或者说
为每个任务分配CPU时间,并且负责任务之间的通信。
内核提供的基本服务是任务切换。使用实时内核可以
大大简化应用系统的设计,是因为实时内核允许将应
用分成若干个任务,由实时内核来管理它们。内核需
要消耗一定的系统资源,比如2%~5%的CPU运行时
间、RAM和ROM等。
内核提供必不可少的系统服务,如信号量、消息
队列、延时等。
——内核
周立功单片机
嵌入式操作系统
• 基本概念
调度是内核的主要职责之一。调度就是决定该轮
到哪个任务运行了。多数实时内核是基于优先级调度
法的。每个任务根据其重要程序的不同被赋予一定的
优先级。基于优先级的调度法指CPU总是让处在就绪
态的优先级最高的任务先运行。然而究竟何时让高优
先级任务掌握CPU的使用权,有两种不同的情况,这
要看用的是什么类型的内核,是非占先式的还是占先
式的内核。
——调度
周立功单片机
嵌入式操作系统
• 基本概念
非占先式内核要求每个任务自我放弃CPU 的所有
权。非占先式调度法也称作合作型多任务,各个任务
彼此合作共享一个CPU。异步事件还是由中断服务来
处理。中断服务可以使一个高优先级的任务由挂起状
态变为就绪状态。但中断服务以后控制权还是回到原
来被中断了的那个任务,直到该任务主动放弃CPU的
使用权时,那个高优先级的任务才能获得CPU的使用
权。
——非占先式内核
周立功单片机
嵌入式操作系统
• 基本概念
当系统响应时间很重要时,要使用占先式内核。
因此绝大多数商业上销售的实时内核都是占先式内核。
最高优先级的任务一旦就绪,总能得到CPU的控制权。
当一个运行着的任务使一个比它优先级高的任务进入
了就绪状态,当前任务的CPU使用权就被剥夺了,或
者说被挂起了,那个高优先级的任务立刻得到了CPU
的控制权。如果是中断服务子程序使一个高优先级的
任务进入就绪态,中断完成时,中断了的任务被挂
起,优先级高的那个任务开始运行。
——占先式内核
周立功单片机
嵌入式操作系统
• 基本概念
任务的优先级是表示任务被调度的优先程度。每
个任务都具有优先级。任务越重要,赋予的优先级应
越高,越容易被调度而进入运行态。
——任务优先级
周立功单片机
嵌入式操作系统
• 基本概念
中断是一种硬件机制,用于通知CPU有个异步事
件发生了。中断一旦被识别,CPU保存部分(或全部)
上下文即部分或全部寄存器的值,跳转到专门的子程
序,称为中断服务子程序(ISR)。中断服务子程序做
事件处理,处理完成后,程序回到:
1. 在前后台系统中,程序回到后台程序;
2. 对非占先式内核而言,程序回到被中断了的任
务;
3. 对占先式内核而言,让进入就绪态的优先级最高
的任务开始运行。
——中断
周立功单片机
前后台系统
嵌入式操作系统
• 基本概念
——中断
ISRISRISRISR 任务
ISRISRISRISR
非占先操作系统
任务
A
任务
B
任务
C
ISRISRISRISR
占先操作系统
任务
A
任务
B
任务
C
周立功单片机
嵌入式操作系统
• 基本概念
时钟节拍是特定的周期性中断。这个中断可以看
作是系统心脏的脉动。中断之间的时间间隔取决于不
同应用,一般在10ms到200ms之间。时钟的节拍式中
断使得内核可以将任务延时若干个整数时钟节拍,以
及当任务等待事件发生时,提供等待超时的依据。时
钟节拍率越快,系统的额外开销就越大。
——时钟节拍
周立功单片机
嵌入式操作系统
• 使用实时操作系统的必要性
嵌入式实时操作系统在目前的嵌入式应用中用得
越来越广泛,尤其在功能复杂、系统庞大的应用中显
得愈来愈重要。在嵌入式应用中,只有把CPU嵌入到
系统中,同时又把操作系统嵌入进去,才是真正的计
算机嵌入式应用。使用实时操作系统主要有以下几个
因素:
�嵌入式实时操作系统提高了系统的可靠性。
�提高了开发效率,缩短了开发周期。
�嵌入式实时操作系统充分发挥了32位CPU的多任务潜力。
周立功单片机
嵌入式操作系统
• 实时操作系统的优缺点
优点优点:在嵌入式实时操作系统环境下开发实时应用程
序使程序的设计和扩展变得容易,不需要大的改动就
可以增加新的功能。通过将应用程序分割成若干独立
的任务模块,使应用程序的设计过程大为简化;而且
对实时性要求苛刻的事件都得到了快速、可靠的处理。
通过有效的系统服务,嵌入式实时操作系统使得系统
资源得到更好的利用。
缺点缺点:但是,使用嵌入式实时操作系统还需要额外的
ROM/RAM开销,2~5%的CPU额外负荷,以及内核的
费用。
周立功单片机
uClinux是一个完全符合GNU/GPL公约的操作系
统,完全开放代码。uClinux从Linux
来,沿袭了主流Linux的绝大部分特性。它是专门针对
没有MMU的CPU,并且为嵌入式系统做了许多小型化
的工作。适用于没有虚拟内存或内存管理单元(MMU)
的处理器,例如ARM7TDMI。它通常用于具有很少内
存或Flash的嵌入式系统。它保留了Linux的大部分优点:
稳定、良好的移植性、优秀的网络功能、完备的对各稳定、良好的移植性、优秀的网络功能、完备的对各
种文件系统的支持、以及标准丰富的种文件系统的支持、以及标准丰富的APIAPI等等。
嵌入式操作系统
• 常见的嵌入式操作系统
——嵌入式Linux
周立功单片机
嵌入式操作系统
• 常见的嵌入式操作系统
Windows CEWindows CE是微软开发的一个开放的、可升级的
32位嵌入式操作系统,是基于掌上型电脑类的电子设
备操作,它是精简的Windows 95。Windows CE的图形
用户界面相当出色。Win CE具有模块化、结构化和基
于Win32应用程序接口以及与处理器无关等特点。Win
CE不仅继承了传统的Windows图形界面,并且在Win
CE平台上可以使用Windows 95/98上的编程工具(如
Visual Basic、Visual C++等)、使绝大多数的应用软使绝大多数的应用软
件只需简单的修改和移植就可以在件只需简单的修改和移植就可以在Windows CEWindows CE平台上平台上
继续使用。继续使用。
——Win CE
周立功单片机
嵌入式操作系统
• 常见的嵌入式操作系统
——VxWorks
VxWorks操作系统是美国 公司于
1983年设计开发的一种嵌入式实时操作系统
(RTOS),是嵌入式开发环境的关键组成部分。良好
的持续发展能力、高性能的内核以及友好的用户开发
环境,在嵌入式实时操作系统领域占据一席之地。它
以其良好的可靠性和卓越的实时性被广泛地应用在通
信、军事、航空、航天等高精尖技术及实时性要求极
高的领域中,如卫星通讯、军事演习、弹道制导、飞
机导航等,甚至在1997年4月登陆火星表面的火星探测
器上也使用到了VxWorks。
周立功单片机
嵌入式操作系统
• 常见的嵌入式操作系统
OSEOSE主要是由ENEA Data AB 下属的ENEA OSE
Systems AB负责开发和技术服务的,一直以来都充当
着实时操作系统以及分布式和容错性应用的先锋,并
保持良好的发展态势。
OSEOSE的客户深入到电信,数据,工控,航空等领
域,尤其在电信方面,该公司已经有了十余年的开发
经验,同诸如爱立信,诺基亚,西门子等知名公司确
定了良好的关系。
——OSE
周立功单片机
嵌入式操作系统
• 常见的嵌入式操作系统
Nucleus PLUSNucleus PLUS是为实时嵌入式应用而设计的一个
抢先式多任务操作系统内核,其95%的代码是用
ANSIC写成的,因此非常便于移植并能够支持大多数
类型的处理器。
Nucleus PLUSNucleus PLUS采用了软件组件的方法。每个组件
具有单一而明确的目的,通常由几个C及汇编语言模
块构成,提供清晰的外部接口,对组件的引用就是通
过这些接口完成的。由于采用了软件组件的方法,使
Nucleus PLUS 的各个组件非常易于替换和复用。
——Nucleus
周立功单片机
嵌入式操作系统
• 常见的嵌入式操作系统
eCoseCos是RedHat公司开发的源代码开放的嵌入式
RTOS产品,是一个可配置、可移植的嵌入式实时操作
系统,设计的运行环境为RedHat的GNUPro和GNU开
发环境。eCOS的所有部分都开放源代码,可以按照需
要自由修改和添加。eCOS的关键技术是操作系统可配
置性,允许用户组和自己的实时组件和函数以及实现
方式,特别允许eCOS的开发则定制自己的面向应用的
操作系统,使eCos能有更广泛的应用范围。
——eCos
周立功单片机
嵌入式操作系统
• 常见的嵌入式操作系统
μC/OS-II是一个源码公开、可移植、可固化、可
裁剪、占先式的实时多任务操作系统。其绝大部分源
码是用ANSI C写的,使其可以方便的移植并支持大多
数类型的处理器。μC/OS-II通过了联邦航空局(FAA)
商用航行器认证。自1992年问世以来,μC/OS-II已经
被应用到数以百计的产品中。μC/OS-II占用很少的系
统资源,并且在高校教学使用是不需要申请许可证。
——μC/OS-II
周立功单片机
嵌入式操作系统
• 常见的嵌入式操作系统
TRON是指“实时操作系统内核(The Real-time
Operating system Nucleux)”,它是在1984年由东京大学
的Sakamura博士提出的,目的是为了建立一个理想的
计算机体系结构。通过工业界和大学院校的合作,
TRON方案正被逐步用到全新概念的计算机体系结构
中。
uITRON是TRON的一个子方案,它具有标准的实
时内核,适用于任何小规模的嵌入式系统,日本国内
现有很多基于该内核的产品,其中消费电器较多。目
前已成为日本事实上的工业标准。
——uITRON
周立功单片机
嵌入式操作系统
• 常见的嵌入式操作系统
TRON明确的设计目标使其甚至比Linux更适合于
做嵌入式应用,内核小,启动速度快,即时性能好,
也很适合汉字系统的开发。另外,TRON的成功还来
源于如下两个重要的条件:
1.它是免费的
2.它已经建立了开放的标准,形成了较完善的软
硬件配套开发环境,较好地形成了产业化。
——uITRON
周立功单片机
周立功单片机
第2章 嵌入式系统工程设计
周立功单片机
第2章 目录
�1. 嵌入式系统项目开发生命周期
�2. 嵌入式系统工程设计方法简介
周立功单片机
第2章 目录
�1. 嵌入式系统项目开发生命周期
�2. 嵌入式系统工程设计方法简介
周立功单片机
嵌入式系统项目开发生命周
期
• 概述
可以把嵌入式系统的开发看作对一个项目的实施。
项目的生命周期一般分为识别需求识别需求、提出解决方案提出解决方案、
执行项目执行项目和结束项目结束项目4个阶段。嵌入式系统项目开发也
是如此。
结束
项目
执行项目
提出
解决
方案
识别
需求
投入人力
时间
周立功单片机
• 概述
.识别需求识别需求
识别需求是项目生命周期的最初阶段。当需求被客户确定时,项目
就产生了。这个阶段的主要任务是确认需求,分析投资收益比,研究项
目的可行性,分析厂商所应具备的条件。
.提出方案提出方案
主要由各厂商向客户提交标书、介绍解决方案。这个阶段是赢得项
目的关键,公司既要展示实力又要合理报价。如果竞标成功则签定合
同,厂商开始承担项目成败的责任。
33.执行项目执行项目
从公司角度来看这才是项目的开始。这个阶段项目经理和项目组将
代表公司完全承担合同规定的任务。一般需要细化目标,制定工作计
划,协调人力和其他资源;定期监控进展,分析项目偏差,采取必要措
施以实现目标。
.结束项目结束项目
主要包括移交工作成果,帮助客户实现商务目标;系统交接给维护
人员;结清各种款项。
周立功单片机
• 项目开发周期
识别需求对于嵌入式系统项目开发是很重要的。这是因为嵌
入式系统往往需要嵌入到其它产品中,不能独立工作,而这个产
品往往不是嵌入式开发承包商(部门)所熟悉的,不了解需求做
成的产品往往是失败的。
——识别需求识别需求
风险分析
制定系统规范
需求风险
时间风险
资金风险
项目管理风险
系统功能
系统限制
系统开发资源
识别需求
周立功单片机
• 项目开发周期
对于嵌入式系统项目来说,这个阶段的主要工作是系统规划
与设计。在设计规划阶段中,开发团队需要分析所有可行的解决
方案,并拟定进程,使项目在合理的进程范围中逐渐建构完成。
在系统的设计方面最重要的一件事就是确定系统的框架。
——提出方案提出方案
系统规划
系统设计
规划分析
预估项目进程
设计系统架构
寻找适当方案
提出方案
周立功单片机
• 项目开发周期
这个阶段的主要工作就是系统的实现系统的实现和系统的测试系统的测试。由于嵌
入式系统的特殊性,嵌入式系统项目既要实现系统的硬件,又要
在硬件上实现软件。所以在项目的开发过程中,软硬件实现和系
统测试是不断反复进行的。事实上,系统的实现、测试和调试贯
穿整个“执行项目”阶段。
——执行项目执行项目
系统实现
系统测试
从硬件做起
从驱动程序移植开始做起
从现成平台做起
功能测试
集成测试
系统测试
执行项目
环境测试
出货测试
系统测试
系统测试
环境测试
系统调试
周立功单片机
• 项目开发周期
产品开发完毕并移交给客户并不等于项目已经结束。客户在
使用产品的过程中还会发现一连串的问题,此时开发团队还需要
服务客户,这就是售后服务。售后服务是一种保障客户权利的措
施,相对的也是开发团队的义务。当售后服务也结束,项目结案
了,项目也没有结束,这时需要项目讨论来总结、学习一些东西。
项目讨论是一个项目的反馈机制,通过这一程序,项目团队的经
验才可以被记录下来,也就是说,这是一个撰写项目历史的过程。
——结束项目结束项目
售后服务
项目讨论
结束项目
周立功单片机
第2章 目录
�1. 嵌入式系统项目开发生命周期
�2. 嵌入式系统工程设计方法简介
周立功单片机
嵌入式系统工程设计方法简
介
• 由上而下与由下而上
由上而下是一个正统的设计方式,也就是说,所有的设计皆
是遵循系统工程的流程来进行。相对而言,由下而上表示一个系
统是由已经有的基础(或组件)为起点,开始往上延伸,最后将
系统完成。
确定需求
指定系统规格
设计
实现
测试
由
上
而
下
由
下
而
上
周立功单片机
嵌入式系统工程设计方法简
介
• UML系统建模
UML(Unified Modeling Language)是一种原本设
计用来描述对象导向程序语言开发的图形化语言。由
于它具有描述事物的多重性,所以理论上也可以被拉
到其他领域使用。
在实际使用上,根据不同的使用情况,UML提供
了不同的图形来描述系统。在UML中,包括了下面几
种图形:类图、状态图、对象图、用例图、顺序图、
协作图、活动图、组件图和部署图。
周立功单片机
嵌入式系统工程设计方法简
介
• 使用UML的好处
语言的用处在于沟通。UML也是一种语言,它利
用视觉化的方法来制定、构建以及记录对象导向系统。
因此,可以把UML当作一种软件工程用的语言。
使用UML的好处在于可以在短时间内了解别人要
传达的消息,而不是花时间在了解消息本身如何解读。
UML提供给用户基础的工具与基本的规范,在这个基
础上,用户可以利用这个语言去描述他所想要描述的
系统,用不同的界面去描绘出系统的不同方面。
周立功单片机
嵌入式系统工程设计方法简
介
• 面向对象OO的思想
随着系统的需求日益增加,系统的功能及复杂程
度不断增大,为了使系统开发变得容易,我们要逐步
改进我们对系统的思考方式以及我们开发系统的的方
式,这项新技术我们称之为面向对象的的开发。
传统的结构化方法是将系统分解为很多基本函数
的集合,数据被孤立分离,并且不考虑并发。而面向
对象方法的基本分解单位为对象。在面对较复杂的系
统设计时,我们可以将它作为一个对象来进行分析。
同样,这个对象也可以分解为多个对象,多个对象各
司其职,相互协作以完成目标。
周立功单片机
周立功单片机
第2章 嵌入式系统工程设计
周立功单片机
第2章 目录
�1. 嵌入式系统项目开发生命周期
�2. 嵌入式系统工程设计方法简介
周立功单片机
第2章 目录
�1. 嵌入式系统项目开发生命周期
�2. 嵌入式系统工程设计方法简介
周立功单片机
嵌入式系统项目开发生命周
期
• 概述
可以把嵌入式系统的开发看作对一个项目的实施。
项目的生命周期一般分为识别需求识别需求、提出解决方案提出解决方案、
执行项目执行项目和结束项目结束项目4个阶段。嵌入式系统项目开发也
是如此。
结束
项目
执行项目
提出
解决
方案
识别
需求
投入人力
时间
周立功单片机
• 概述
.识别需求识别需求
识别需求是项目生命周期的最初阶段。当需求被客户确定时,项目
就产生了。这个阶段的主要任务是确认需求,分析投资收益比,研究项
目的可行性,分析厂商所应具备的条件。
.提出方案提出方案
主要由各厂商向客户提交标书、介绍解决方案。这个阶段是赢得项
目的关键,公司既要展示实力又要合理报价。如果竞标成功则签定合
同,厂商开始承担项目成败的责任。
33.执行项目执行项目
从公司角度来看这才是项目的开始。这个阶段项目经理和项目组将
代表公司完全承担合同规定的任务。一般需要细化目标,制定工作计
划,协调人力和其他资源;定期监控进展,分析项目偏差,采取必要措
施以实现目标。
.结束项目结束项目
主要包括移交工作成果,帮助客户实现商务目标;系统交接给维护
人员;结清各种款项。
周立功单片机
• 项目开发周期
识别需求对于嵌入式系统项目开发是很重要的。这是因为嵌
入式系统往往需要嵌入到其它产品中,不能独立工作,而这个产
品往往不是嵌入式开发承包商(部门)所熟悉的,不了解需求做
成的产品往往是失败的。
——识别需求识别需求
风险分析
制定系统规范
需求风险
时间风险
资金风险
项目管理风险
系统功能
系统限制
系统开发资源
识别需求
周立功单片机
• 项目开发周期
对于嵌入式系统项目来说,这个阶段的主要工作是系统规划
与设计。在设计规划阶段中,开发团队需要分析所有可行的解决
方案,并拟定进程,使项目在合理的进程范围中逐渐建构完成。
在系统的设计方面最重要的一件事就是确定系统的框架。
——提出方案提出方案
系统规划
系统设计
规划分析
预估项目进程
设计系统架构
寻找适当方案
提出方案
周立功单片机
• 项目开发周期
这个阶段的主要工作就是系统的实现系统的实现和系统的测试系统的测试。由于嵌
入式系统的特殊性,嵌入式系统项目既要实现系统的硬件,又要
在硬件上实现软件。所以在项目的开发过程中,软硬件实现和系
统测试是不断反复进行的。事实上,系统的实现、测试和调试贯
穿整个“执行项目”阶段。
——执行项目执行项目
系统实现
系统测试
从硬件做起
从驱动程序移植开始做起
从现成平台做起
功能测试
集成测试
系统测试
执行项目
环境测试
出货测试
系统测试
系统测试
环境测试
系统调试
周立功单片机
• 项目开发周期
产品开发完毕并移交给客户并不等于项目已经结束。客户在
使用产品的过程中还会发现一连串的问题,此时开发团队还需要
服务客户,这就是售后服务。售后服务是一种保障客户权利的措
施,相对的也是开发团队的义务。当售后服务也结束,项目结案
了,项目也没有结束,这时需要项目讨论来总结、学习一些东西。
项目讨论是一个项目的反馈机制,通过这一程序,项目团队的经
验才可以被记录下来,也就是说,这是一个撰写项目历史的过程。
——结束项目结束项目
售后服务
项目讨论
结束项目
周立功单片机
第2章 目录
�1. 嵌入式系统项目开发生命周期
�2. 嵌入式系统工程设计方法简介
周立功单片机
嵌入式系统工程设计方法简
介
• 由上而下与由下而上
由上而下是一个正统的设计方式,也就是说,所有的设计皆
是遵循系统工程的流程来进行。相对而言,由下而上表示一个系
统是由已经有的基础(或组件)为起点,开始往上延伸,最后将
系统完成。
确定需求
指定系统规格
设计
实现
测试
由
上
而
下
由
下
而
上
周立功单片机
嵌入式系统工程设计方法简
介
• UML系统建模
UML(Unified Modeling Language)是一种原本设
计用来描述对象导向程序语言开发的图形化语言。由
于它具有描述事物的多重性,所以理论上也可以被拉
到其他领域使用。
在实际使用上,根据不同的使用情况,UML提供
了不同的图形来描述系统。在UML中,包括了下面几
种图形:类图、状态图、对象图、用例图、顺序图、
协作图、活动图、组件图和部署图。
周立功单片机
嵌入式系统工程设计方法简
介
• 使用UML的好处
语言的用处在于沟通。UML也是一种语言,它利
用视觉化的方法来制定、构建以及记录对象导向系统。
因此,可以把UML当作一种软件工程用的语言。
使用UML的好处在于可以在短时间内了解别人要
传达的消息,而不是花时间在了解消息本身如何解读。
UML提供给用户基础的工具与基本的规范,在这个基
础上,用户可以利用这个语言去描述他所想要描述的
系统,用不同的界面去描绘出系统的不同方面。
周立功单片机
嵌入式系统工程设计方法简
介
• 面向对象OO的思想
随着系统的需求日益增加,系统的功能及复杂程
度不断增大,为了使系统开发变得容易,我们要逐步
改进我们对系统的思考方式以及我们开发系统的的方
式,这项新技术我们称之为面向对象的的开发。
传统的结构化方法是将系统分解为很多基本函数
的集合,数据被孤立分离,并且不考虑并发。而面向
对象方法的基本分解单位为对象。在面对较复杂的系
统设计时,我们可以将它作为一个对象来进行分析。
同样,这个对象也可以分解为多个对象,多个对象各
司其职,相互协作以完成目标。
周立功单片机
周立功单片机
第2章 嵌入式系统工程设计
周立功单片机
第2章 目录
�1. 嵌入式系统项目开发生命周期
�2. 嵌入式系统工程设计方法简介
周立功单片机
第2章 目录
�1. 嵌入式系统项目开发生命周期
�2. 嵌入式系统工程设计方法简介
周立功单片机
嵌入式系统项目开发生命周
期
• 概述
可以把嵌入式系统的开发看作对一个项目的实施。
项目的生命周期一般分为识别需求识别需求、提出解决方案提出解决方案、
执行项目执行项目和结束项目结束项目4个阶段。嵌入式系统项目开发也
是如此。
结束
项目
执行项目
提出
解决
方案
识别
需求
投入人力
时间
周立功单片机
• 概述
.识别需求识别需求
识别需求是项目生命周期的最初阶段。当需求被客户确定时,项目
就产生了。这个阶段的主要任务是确认需求,分析投资收益比,研究项
目的可行性,分析厂商所应具备的条件。
.提出方案提出方案
主要由各厂商向客户提交标书、介绍解决方案。这个阶段是赢得项
目的关键,公司既要展示实力又要合理报价。如果竞标成功则签定合
同,厂商开始承担项目成败的责任。
33.执行项目执行项目
从公司角度来看这才是项目的开始。这个阶段项目经理和项目组将
代表公司完全承担合同规定的任务。一般需要细化目标,制定工作计
划,协调人力和其他资源;定期监控进展,分析项目偏差,采取必要措
施以实现目标。
.结束项目结束项目
主要包括移交工作成果,帮助客户实现商务目标;系统交接给维护
人员;结清各种款项。
周立功单片机
• 项目开发周期
识别需求对于嵌入式系统项目开发是很重要的。这是因为嵌
入式系统往往需要嵌入到其它产品中,不能独立工作,而这个产
品往往不是嵌入式开发承包商(部门)所熟悉的,不了解需求做
成的产品往往是失败的。
——识别需求识别需求
风险分析
制定系统规范
需求风险
时间风险
资金风险
项目管理风险
系统功能
系统限制
系统开发资源
识别需求
周立功单片机
• 项目开发周期
对于嵌入式系统项目来说,这个阶段的主要工作是系统规划
与设计。在设计规划阶段中,开发团队需要分析所有可行的解决
方案,并拟定进程,使项目在合理的进程范围中逐渐建构完成。
在系统的设计方面最重要的一件事就是确定系统的框架。
——提出方案提出方案
系统规划
系统设计
规划分析
预估项目进程
设计系统架构
寻找适当方案
提出方案
周立功单片机
• 项目开发周期
这个阶段的主要工作就是系统的实现系统的实现和系统的测试系统的测试。由于嵌
入式系统的特殊性,嵌入式系统项目既要实现系统的硬件,又要
在硬件上实现软件。所以在项目的开发过程中,软硬件实现和系
统测试是不断反复进行的。事实上,系统的实现、测试和调试贯
穿整个“执行项目”阶段。
——执行项目执行项目
系统实现
系统测试
从硬件做起
从驱动程序移植开始做起
从现成平台做起
功能测试
集成测试
系统测试
执行项目
环境测试
出货测试
系统测试
系统测试
环境测试
系统调试
周立功单片机
• 项目开发周期
产品开发完毕并移交给客户并不等于项目已经结束。客户在
使用产品的过程中还会发现一连串的问题,此时开发团队还需要
服务客户,这就是售后服务。售后服务是一种保障客户权利的措
施,相对的也是开发团队的义务。当售后服务也结束,项目结案
了,项目也没有结束,这时需要项目讨论来总结、学习一些东西。
项目讨论是一个项目的反馈机制,通过这一程序,项目团队的经
验才可以被记录下来,也就是说,这是一个撰写项目历史的过程。
——结束项目结束项目
售后服务
项目讨论
结束项目
周立功单片机
第2章 目录
�1. 嵌入式系统项目开发生命周期
�2. 嵌入式系统工程设计方法简介
周立功单片机
嵌入式系统工程设计方法简
介
• 由上而下与由下而上
由上而下是一个正统的设计方式,也就是说,所有的设计皆
是遵循系统工程的流程来进行。相对而言,由下而上表示一个系
统是由已经有的基础(或组件)为起点,开始往上延伸,最后将
系统完成。
确定需求
指定系统规格
设计
实现
测试
由
上
而
下
由
下
而
上
周立功单片机
嵌入式系统工程设计方法简
介
• UML系统建模
UML(Unified Modeling Language)是一种原本设
计用来描述对象导向程序语言开发的图形化语言。由
于它具有描述事物的多重性,所以理论上也可以被拉
到其他领域使用。
在实际使用上,根据不同的使用情况,UML提供
了不同的图形来描述系统。在UML中,包括了下面几
种图形:类图、状态图、对象图、用例图、顺序图、
协作图、活动图、组件图和部署图。
周立功单片机
嵌入式系统工程设计方法简
介
• 使用UML的好处
语言的用处在于沟通。UML也是一种语言,它利
用视觉化的方法来制定、构建以及记录对象导向系统。
因此,可以把UML当作一种软件工程用的语言。
使用UML的好处在于可以在短时间内了解别人要
传达的消息,而不是花时间在了解消息本身如何解读。
UML提供给用户基础的工具与基本的规范,在这个基
础上,用户可以利用这个语言去描述他所想要描述的
系统,用不同的界面去描绘出系统的不同方面。
周立功单片机
嵌入式系统工程设计方法简
介
• 面向对象OO的思想
随着系统的需求日益增加,系统的功能及复杂程
度不断增大,为了使系统开发变得容易,我们要逐步
改进我们对系统的思考方式以及我们开发系统的的方
式,这项新技术我们称之为面向对象的的开发。
传统的结构化方法是将系统分解为很多基本函数
的集合,数据被孤立分离,并且不考虑并发。而面向
对象方法的基本分解单位为对象。在面对较复杂的系
统设计时,我们可以将它作为一个对象来进行分析。
同样,这个对象也可以分解为多个对象,多个对象各
司其职,相互协作以完成目标。
周立功单片机
周立功单片机
第3章 ARM7体系结构
周立功单片机
第3章 目录
�1.简介
�
�的模块和
内部框图
�4.体系结构直接支持的
数据类型
�5.处理器状态
�6.处理器模式
�7.内部寄存器
�8. 程序状态寄存器
�9.异常
�10.中断延迟
�11.复位
�12.存储器及存储器映射
I/O
�13.寻址方式简介
�指令简介
�15.协处理器接口
�16.调试接口简介
�接口简介
周立功单片机
第3章 目录
�1.简介
�
�的模块和
内部框图
�4.体系结构直接支持的
数据类型
�5.处理器状态
�6.处理器模式
�7.内部寄存器
�8. 程序状态寄存器
�9.异常
�10.中断延迟
�11.复位
�12.存储器及存储器映射
I/O
�13.寻址方式简介
�指令简介
�15.协处理器接口
�16.调试接口简介
�接口简介
周立功单片机
ARM简介
• ARM公司简介
ARM是Advanced RISC Machines的缩写,它是
一家微处理器行业的知名企业,该企业设计了大量
高性能、廉价、耗能低的RISC (精简指令集)处
理器。
公司的特点是只设计芯片,而不生
产。它将技术授权给世界上许多著名的半导体、软
件和OEM厂商,并提供服务。
周立功单片机
ARM简介
• ARM公司简介
将技术授权给
其它芯片厂商
形成各具特色
的ARM芯片
. . .
周立功单片机
ARM简介
• ARM体系结构
ARM处理器为RISC芯片,其简单的结构使
ARM内核非常小,这使得器件的功耗也非常低。
它具有经典RISC的特点:
�大的、统一的寄存器文件;
�装载/保存结构,数据处理 操作只针对寄存器的
内容,而不直接对存储器进行操作;
�简单的寻址模式;
�统一和固定长度的指令域,简化了指令的译码。
周立功单片机
ARM简介
• ARM体系结构
ARM体系结构的特点:
�每条数据处理指令都对算术逻辑单元和移位器控
制,以实现ALU和移位器的最大利用;
�地址自动增加和减少寻址模式,优化程序循环;
�多寄存器装载和存储指令实现最大数据吞吐量;
�所有指令的条件执行实现最快速的代码执行。
周立功单片机
ARM简介
• 各ARM体系结构版本
ARM体系结构从最初开发到现在有了巨大的
改进,并仍在完善和发展。为了清楚的表达每个
ARM应用实例所使用的指令集,ARM公司定义了5
种主要的ARM指令集体系结构版本,以版本号
V1~V5表示。
周立功单片机
ARM简介
• 各ARM体系结构版本——V1
该版本的ARM体系结构,只有26位的寻址空
间,没有商业化,其特点为:
�基本的数据处理指令(不包括乘法);
�字节、字和半字加载/存储指令;
�具有分支指令,包括在子程序调用中使用的分
支和链接指令;
�在操作系统调用中使用的软件中断指令。
周立功单片机
ARM简介
• 各ARM体系结构版本——V2
同样为26位寻址空间,现在已经废弃不再使
用,它相对V1版本有以下改进:
�具有乘法和乘加指令;
�支持协处理器;
�快速中断模式中的两个以上的分组寄存器;
�具有原子性加载/存储指令SWP和SWPB。
周立功单片机
ARM简介
• 各ARM体系结构版本——V3
寻址范围扩展到32位(事实上也基本废弃),具
有独立的程序:
�具有乘法和乘加指令;
�支持协处理器;
�快速中断模式中具有的两个以上的分组寄存器;
�具有原子性加载/存储指令SWP和SWPB。
周立功单片机
ARM简介
• 各ARM体系结构版本——V4
不在为了与以前的版本兼容而支持26位体系结
构,并明确了哪些指令会引起未定义指令异常发
生,它相对V3版本作了以下的改进:
�半字加载/存储指令;
�字节和半字的加载和符号扩展指令;
�具有可以转换到Thumb状态的指令;
�用户模式寄存器的新的特权处理器模式。
周立功单片机
ARM简介
• 各ARM体系结构版本——V5
在V4版本的基础上,对现在指令的定义进行
了必要的修正,对V4版本的体系结构进行了扩展
并并增加了指令,具体如下:
�改进了ARM/Thumb状态之间的切换效率;
�允许非T变量和T变量一样,使用相同的代码
生成技术;
�增加计数前导零指令和软件断点指令;
�对乘法指令如何设置标志作了严格的定义。
周立功单片机
ARM简介
• ARM处理器核简介
ARM公司开发了很多系列的ARM处理器核,
目前最新的系列已经是ARM11了,而ARM6核以及
更早的系列已经很罕见了。目前应用比较广泛的系
列是:
ARM7 ARM9 ARM9E ARM10
SecurCore
Xscale
周立功单片机
ARM简介
• ARM处理器核简介——ARM7
该系列包括ARM7TDMI、ARM7TDMI-S、带
有高速缓存处理器宏单元的ARM720T和扩充了
Jazelle的ARM7EJ-S。该系列处理器提供Thumb 16
位压缩指令集和EmbededICE软件调试方式,适用
于更大规模的SoC设计中。
ARM7系列广泛应用于多媒体和嵌入式设备,
包括Internet设备、网络和调制解调器设备,以及
移动电话、PDA等无线设备。
周立功单片机
ARM简介
• ARM处理器核简介——ARM9
该系列包括ARM9TDMI、ARM920T和带有告
诉缓存处理器宏单元的ARM940T。除了兼容
ARM7系列,而且能够更加灵活的设计。
ARM9系列主要应用于引擎管理、仪器仪表、
安全系统和机顶盒等领域。
周立功单片机
ARM简介
• ARM处理器核简介——ARM10
该系列包括ARM1020E和ARM1020E处理器
核,其核心在于使用向量浮点(VFP)单元VFP10
提供高性能的浮点解决方案,从而极大提高了处理
器的整型和浮点运算性能。
可以用于视频游戏机和高性能打印机等场合。
周立功单片机
ARM简介
• ARM处理器核简介——SecurCore
该系列涵盖了SC100、SC110、SC200和SC210
处理核。该系列处理器主要针对新兴的安全市场,
以一种全新的安全处理器设计为智能卡和其它安全
IC开发提供独特的32位系统设计,并具有特定反伪
造方法,从而有助于防止对硬件和软件的盗版。
周立功单片机
ARM简介
• ARM处理器核简介——Xscale
Intel Xscale微控制器则提供全性能、高性价比、
低功耗的解决方案,支持16位Thumb指令并集成数
字信号处理(DSP)指令。
周立功单片机
第3章 目录
�1.简介
�
�的模块和
内部框图
�4.体系结构直接支持的
数据类型
�5.处理器状态
�6.处理器模式
�7.内部寄存器
�8. 程序状态寄存器
�9.异常
�10.中断延迟
�11.复位
�12.存储器及存储器映射
I/O
�13.寻址方式简介
�指令简介
�15.协处理器接口
�16.调试接口简介
�接口简介
周立功单片机
ARM7TDMI
• 简介
ARM7TDMI基于ARM体系结构V4版本,是目
前低端的ARM核。具有广泛的应用,其最显著的
应用为数字移动电话。
注意:“ARM核”并不是芯片,ARM核与其它部件
如RAM、ROM、片内外设组合在一起才能构成现
实的芯片。
周立功单片机
ARM7TDMI
• 简介
ARM7TDMI支持32位寻址范围,并弥补了
ARM6不能在低于5V电源电压下工作的不足。
ARM7TDMI的后缀意义为:
支持高密度16位的Thumb指令集;
支持片上调试;
支持64位乘法;
支持EmbededICE观察硬件;
ARM7TDMI 的可综合(synthesizable)版
本(软核),对应用工程师来说其编程模
型与ARM7TDMI 一致;
ARM7 T D M I - S
周立功单片机
ARM7TDMI
• 简介
ARM7TDMI处理器是ARM通用32位微处理器
家族的成员之一。它具有优异的性能,但功耗却很
低,使用门的数量也很少。它属于精简指令集计算
机(RISC),比复杂指令集计算机(CISC)要简单
得多。这样的简化实现了:
�高的指令吞吐量;
�出色的实时中断响应;
�小的、高性价比的处理器宏单元。
周立功单片机
ARM7TDMI
• 三级流水线
ARM7TDMI处理器使用流水线来增加处理器指
令流的速度。这样可使几个操作同时进行,并使处
理和存储器系统连续操作,能提供
指令执行速度。
ARM7TDMI的流水线分3级,分别为:
取指�译码�执行
周立功单片机
ARM7TDMI
• 三级流水线
正常操作过程中,在执行一条指令的同时对下
一条指令进行译码,并将第三条指令从存储器中取
出。这三条指令之间的位置关系如下表所示:
流水线上各指令的地址
从寄存器组中读出寄存器,执行移位
和ALU操作,寄存器被写回到寄存器
组中
执行PC-4PC-8
对指令使用的寄存器进行译码译码PC-2PC-4
指令从存储器中取出取指PCPC
描述流水线工位
Thumb指令集ARM指令集
周立功单片机
ARM7TDMI
• 存储器访问
ARM7TDMI处理器使用了冯·诺依曼(Von
Neumann)结构,指令和数据共用一条32位总线。
只有装载、存储和交换指令可以对存储器中的数据
进行访问。
数据可以是字节( 8位)、半字( 16位)或者
字(32位)。
周立功单片机
ARM7TDMI
• 存储器访问
计算机结构说明:
“冯·诺依曼” 结构:把代码作为一种特殊的数据来操
作,指令总线和数据总线及其存储区域是统一的;
“哈佛”结构:指令总线和数据总线及其存储区是分
开、独立的。
周立功单片机
ARM7TDMI
• 存储器访问
ARM7TDMI处理器的存储器接口可以使潜在的
性能得以实现,这样减少了存储器的使用。对速度
有严格要求的控制信号使用流水线,这样使系统控
制功能以标准的低功耗逻辑实现。ARM7TDMI处
理器的存储器周期有4个基本类型:
�内部周期;
�非连续的周期;
�连续 的周期;
�协处理器寄存器的传输周期。
周立功单片机
第3章 目录
�1.简介
�
�的模块和
内部框图
�4.体系结构直接支持的
数据类型
�5.处理器状态
�6.处理器模式
�7.内部寄存器
�8. 程序状态寄存器
�9.异常
�10.中断延迟
�11.复位
�12.存储器及存储器映射
I/O
�13.寻址方式简介
�指令简介
�15.协处理器接口
�16.调试接口简介
�接口简介
周立功单片机
• ARM7TDMI的模块和内核框图
Embedde dICE-RT
CPU
DBGRNG(0)
DBGRNG(1)
DBGEXT(0)
DBGEXT(1)
TAP
ARM7TDMI模块
周立功单片机
• ARM7TDMI的模块和内核框图
ARM7TDMI模块
地址寄存器
寄存器组
31*32位寄存器
(6个状态寄存器)
地址增加器
乘法器
桶形移位器
32位ALU
写数据寄存器 指令管线读数据寄存器
Thumb指令译码器
指令译码
和
控制逻辑
ADDR[31:0]
CLK
CLEN
CFGBIGEND
nIRQ
nFIQ
nRESET
ABORT
LOCK
WRITE
SIZE[1:0]
PROT[1:0]
TRANS[1:0]
DBG输出
DBG输入
CP控制
CP握手
WDATA[31:0] RDATA[31:0]
扫描调试
控制
周立功单片机
• ARM7TDMI的模块和内核框图
ARM7TDMI模块
CPB
CPA
CPnI
CPTBIT
CPSEQ
CPnMREQ
CPnOPC
CPnTRANS
TRANS[1:0]
PROT[1:0]
SIZE[1:0]
WRITE
ABORT
RDATA[31:0]
WDATA[31:0]
ADDR[31:0]
DBGTDO
DBGnTDOEN
DBGnTRST
DBGTDI
DBGTMS
DBGTCKEN
DBGCOMMTX
DBGCOMMRX
DBGRNG[0]
DBGRNG[1]
DBGEN
DBGEXT[0]
DBGEXT[1]
DBGnEXEC
DBGACK
DBGBREAK
DBGRQ
LOCK
CFGBIGEND
nRESET
nFIQ
nIRQ
CLKEN
CLK
DBGINSTRVALID
ARM7TDMI-SDMORE
同步的
EmbededICE-RT
扫描调试访问端口
存储器接口
存储器管理接口
协处理器接口
时钟
中断
总线控制
仲裁
调试
处理器
周立功单片机
第3章 目录
�1.简介
�
�的模块和
内部框图
�4.体系结构直接支持的
数据类型
�5.处理器状态
�6.处理器模式
�7.内部寄存器
�8. 程序状态寄存器
�9.异常
�10.中断延迟
�11.复位
�12.存储器及存储器映射
I/O
�13.寻址方式简介
�指令简介
�15.协处理器接口
�16.调试接口简介
�接口简介
周立功单片机
体系结构直接支持的数据类
型
• 体系结构直接支持的数据类型
ARM处理器支持下列数据类型:
�字节 8位
�半字 16位(必须分配为占用两个字节)
�字 32为(必须分配为占用4各字节)
1111
1111
1111 2222 3333 4444
2222
周立功单片机
• 体系结构直接支持的数据类型
注意:
�V4版本之后的ARM结构都支持这3种结构(包括
V4版本),而以前的版本只支持字节和字;
�当数据类型定义为无符号型时,N位数据值使用正
常的二进制格式表示范围为0~2N-1的非负整数;
�当数据类型定义为有符号型时,N位数据值使用2
的补码格式表示范围为-2N-1~+2N-1-1的整数;
体系结构直接支持的数据类
型
周立功单片机
• 体系结构直接支持的数据类型
注意:
�所有数据操作,例如ADD,都以字为单位;
�装载和保存指令可以对字节、半字和字进行操作,
当装载字节或半字时自动实现零扩展或符号扩展;
�ARM指令的长度刚好是1个字(分配为占用4个字
节),Thumb指令的长度刚好是半字(占用2个字
节)。
体系结构直接支持的数据类
型
周立功单片机
第3章 目录
�1.简介
�
�的模块和
内部框图
�4.体系结构直接支持的
数据类型
�5.处理器状态
�6.处理器模式
�7.内部寄存器
�8. 程序状态寄存器
�9.异常
�10.中断延迟
�11.复位
�12.存储器及存储器映射
I/O
�13.寻址方式简介
�指令简介
�15.协处理器接口
�16.调试接口简介
�接口简介
周立功单片机
处理器状态
• 处理器状态
ARM7TDMI处理器内核使用V4T版本的ARM结
构,该结构包含32位ARM指令集和16位Thumb指令
集。因此ARM7TDMI处理器有两种操作状态:
�ARM状态:32位,这种状态下执行的是字方式
的ARM指令;
�Thumb状态:16位,这种状态下执行半字方式
的Thumb指令。
注意:两个状态之间的切换并不影响处理器模式或
寄存器内容。
周立功单片机
处理器状态
• 处理器状态
使用BX指令将ARM7TDMI内核的操作状态在
ARM状态和Thumb状态之间进行切换(详见第4
章) ,程序如下所示。
;从Arm状态切换到Thumb状态
LDR R0,=Lable+1
BX R0
;从Thumb状态切换到ARM状态
LDR R0,=Lable
BX R0
地址最低位为
1,表示切换
到Thumb状态
地址最低位为
0,表示切换
到ARM状态
跳转地址标号
周立功单片机
第3章 目录
�1.简介
�
�的模块和
内部框图
�4.体系结构直接支持的
数据类型
�5.处理器状态
�6.处理器模式
�7.内部寄存器
�8. 程序状态寄存器
�9.异常
�10.中断延迟
�11.复位
�12.存储器及存储器映射
I/O
�13.寻址方式简介
�指令简介
�15.协处理器接口
�16.调试接口简介
�接口简介
周立功单片机
处理器模式
• 简介
ARM体系结构支持7种处理器模式,分别为:
用户模式、快中断模式、中断模式、管理模式、中
止模式、未定义模式和系统模式,如下表所示。这
样的好处是可以更好的支持操作系统并提高工作效
率。ARM7TDMI完全支持这七种模式。
周立功单片机
与用户模式类似,但具有可以
直接切换到其它模式等特权
用于支持操作系统的特
权任务等 系统 (sys)
未定义指令异常响应时进入此
模式
支持硬件协处理器的软
件仿真 未定义 (und)
在ARM7TDMI没有大用处用于支持虚拟内存和/或存储器保护 中止 (abt)
系统复位和软件中断响应时进
入此模式操作系统保护代码 管理 (svc)
IRQ异常响应时进入此模式用于通用中断处理 中断 (irq)
FIQ异常响应时进入此模式支持高速数据传输及通道处理 快中断 (fiq)
不能直接切换到其它模式正常程序工作模式 用户 (usr)
备注说明处理器模式
处理器模式
• 处理器模式
周立功单片机
处理器模式
• 特权模式
与用户模式类似,但具有可以
直接切换到其它模式等特权
用于支持操作系统的特
权任务等 系统 (sys)
未定义指令异常响应时进入此
模式
支持硬件协处理器的软
件仿真 未定义 (und)
在ARM7TDMI没有大用处用于支持虚拟内存和/或存储器保护 中止 (abt)
系统复位和软件中断响应时进
入此模式操作系统保护代码 管理 (svc)
IRQ异常响应时进入此模式用于通用中断处理 中断 (irq)
FIQ异常响应时进入此模式支持高速数据传输及通道处理 快中断 (fiq)
不能直接切换到其它模式正常程序工作模式 用户 (usr)
备注说明处理器模式
除用户模式外,其它模式均
为特权模式。ARM内部寄存器和
一些片内外设在硬件设计上只允许
(或者可选为只允许)特权模式下
访问。此外,特权模式可以自由的
切换处理器模式,而用户模式不能
直接切换到别的模式。
未定义 (und)
中止 (abt)
管理 (svc)
中断 (irq)
快中断 (fiq)
系统 (sys)
周立功单片机
处理器模式
• 异常模式
与用户模式类似,但具有可以
直接切换到其它模式等特权
用于支持操作系统的特
权任务等 系统 (sys)
未定义指令异常响应时进入此
模式
支持硬件协处理器的软
件仿真 未定义 (und)
在ARM7TDMI没有大用处用于支持虚拟内存和/或存储器保护 中止 (abt)
系统复位和软件中断响应时进
入此模式操作系统保护代码 管理 (svc)
IRQ异常响应时进入此模式用于通用中断处理 中断 (irq)
FIQ异常响应时进入此模式支持高速数据传输及通道处理 快中断 (fiq)
不能直接切换到其它模式正常程序工作模式 用户 (usr)
备注说明处理器模式
未定义 (und)
中止 (abt)
管理 (svc)
中断 (irq)
快中断 (fiq)
这五种模式称为异常模式。
它们除了可以通过程序切换进入
外,也可以由特定的异常进入。当
特定的异常出现时,处理器进入相
应的模式。每种异常模式都有一些
独立的寄存器,以避免异常退出时
用户模式的状态不可靠。
周立功单片机
处理器模式
• 用户和系统模式
与用户模式类似,但具有可以
直接切换到其它模式等特权
用于支持操作系统的特
权任务等 系统 (sys)
未定义指令异常响应时进入此
模式
支持硬件协处理器的软
件仿真 未定义 (und)
在ARM7TDMI没有大用处用于支持虚拟内存和/或存储器保护 中止 (abt)
系统复位和软件中断响应时进
入此模式操作系统保护代码 管理 (svc)
IRQ异常响应时进入此模式用于通用中断处理 中断 (irq)
FIQ异常响应时进入此模式支持高速数据传输及通道处理 快中断 (fiq)
不能直接切换到其它模式正常程序工作模式 用户 (usr)
备注说明处理器模式
这两种模式都不能由异常进
入,而且它们使用完全相同的寄存
器组。
系统模式是特权模式,不受用
户模式的限制。操作系统在该模式
下访问用户模式的寄存器就比较方
便,而且操作系统的一些特权任务
可以使用这个模式访问一些受控的
资源。
系统 (sys)
用户 (usr)
周立功单片机
第3章 目录
�1.简介
�
�的模块和
内部框图
�4.体系结构直接支持的
数据类型
�5.处理器状态
�6.处理器模式
�7.内部寄存器
�8. 程序状态寄存器
�9.异常
�10.中断延迟
�11.复位
�12.存储器及存储器映射
I/O
�13.寻址方式简介
�指令简介
�15.协处理器接口
�16.调试接口简介
�接口简介
周立功单片机
内部寄存器
• 简介
在ARM7TDMI处理器内部有37个用户可见的
寄存器。
在不同的工作模式和处理器状态下,程序员可
以访问的寄存器也不尽相同。
周立功单片机SPSR_fiqSPSR_irqSPSR_undSPSR_abtSPSR_abt无SPSR
CPSRCPSR状态寄
存器
R15R15(PC)
R14_fiqR14_irqR14_undR14_abtR14_svcR14R14(LR)
R13_fiqR13_irqR13_undR13_abtR13_svcR13R13(SP)
R12_fiqR12R12(IP)
R11_fiqR11R11(FP,v8)
R10_fiqR10R10(SL,v7)
R9_fiqR9R9(SB,v6)
R8_fiqR8R8(v5)
R7R7(v4)
R6R6(v3)
R5R5(v2)
R4R4(v1)
R3R3(a4)
R2R2(a3)
R1R1(a2)
R0R0(a1)
通用寄
存器和
程序计
数器
快中断中断未定义中止管理系统用户
各模式下实际访问的寄存器寄存器在汇编
中的名称
寄存器
类别
ARM状态各模式下的寄存器
周立功单片机SPSR_fiqSPSR_irqSPSR_undSPSR_abtSPSR_abt无SPSR
CPSRCPSR状态寄
存器
R15R15(PC)
R14_fiqR14_irqR14_undR14_abtR14_svcR14R14(LR)
R13_fiqR13_irqR13_undR13_abtR13_svcR13R13(SP)
R12_fiqR12R12(IP)
R11_fiqR11R11(FP,v8)
R10_fiqR10R10(SL,v7)
R9_fiqR9R9(SB,v6)
R8_fiqR8R8(v5)
R7R7(v4)
R6R6(v3)
R5R5(v2)
R4R4(v1)
R3R3(a4)
R2R2(a3)
R1R1(a2)
R0R0(a1)
通用寄
存器和
程序计
数器
快中断中断未定义中止管理系统用户
各模式下实际访问的寄存器寄存器在汇编
中的名称
寄存器
类别
ARM状态各模式下的寄存器
SPSR_fiqSPSR_irqSPSR_undSPSR_abtSPSR_abt
CPSR
R15
R14_fiqR14_irqR14_undR14_abtR14_svcR14
R13_fiqR13_irqR13_undR13_abtR13_svcR13
R12_fiqR12
R11_fiqR11
R10_fiqR10
R9_fiqR9
R8_fiqR8
R7
R6
R5
R4
R3
R2
R1
R0
所有的37个寄存器,分
成两大类:
�31个通用32位寄存器;
�6个状态寄存器。
周立功单片机SPSR_fiqSPSR_irqSPSR_undSPSR_abtSPSR_abt无SPSR
CPSRCPSR状态寄
存器
R15R15(PC)
R14_fiqR14_irqR14_undR14_abtR14_svcR14R14(LR)
R13_fiqR13_irqR13_undR13_abtR13_svcR13R13(SP)
R12_fiqR12R12(IP)
R11_fiqR11R11(FP,v8)
R10_fiqR10R10(SL,v7)
R9_fiqR9R9(SB,v6)
R8_fiqR8R8(v5)
R7R7(v4)
R6R6(v3)
R5R5(v2)
R4R4(v1)
R3R3(a4)
R2R2(a3)
R1R1(a2)
R0R0(a1)
通用寄
存器和
程序计
数器
快中断中断未定义中止管理系统用户
各模式下实际访问的寄存器寄存器在汇编
中的名称
寄存器
类别
无
CPSR
R15
R14
R13
R12
R11
R10
R9
R8
R7
R6
R5
R4
R3
R2
R1
R0
用户
无
CPSR
R15
R14
R13
R12
R11
R10
R9
R8
R7
R6
R5
R4
R3
R2
R1
R0
系统
SPSR_abt
CPSR
R15
R14_svc
R13_svc
R12
R11
R10
R9
R8
R7
R6
R5
R4
R3
R2
R1
R0
管理
SPSR_abt
CPSR
R15
R14_abt
R13_abt
R12
R11
R10
R9
R8
R7
R6
R5
R4
R3
R2
R1
R0
中止
SPSR_und
CPSR
R15
R14_und
R13_und
R12
R11
R10
R9
R8
R7
R6
R5
R4
R3
R2
R1
R0
未定义
SPSR_irq
CPSR
R15
R14_irq
R13_irq
R12
R11
R10
R9
R8
R7
R6
R5
R4
R3
R2
R1
R0
中断
SPSR_fiq
CPSR
R15
R14_fiq
R13_fiq
R12_fiq
R11_fiq
R10_fiq
R9_fiq
R8_fiq
R7
R6
R5
R4
R3
R2
R1
R0
快中断
ARM状态各模式下可以访问的寄存器
周立功单片机SPSR_fiqSPSR_irqSPSR_undSPSR_abtSPSR_abt无SPSR
CPSRCPSR状态寄
存器
R15R15(PC)
R14_fiqR14_irqR14_undR14_abtR14_svcR14R14(LR)
R13_fiqR13_irqR13_undR13_abtR13_svcR13R13(SP)
R12_fiqR12R12(IP)
R11_fiqR11R11(FP,v8)
R10_fiqR10R10(SL,v7)
R9_fiqR9R9(SB,v6)
R8_fiqR8R8(v5)
R7R7(v4)
R6R6(v3)
R5R5(v2)
R4R4(v1)
R3R3(a4)
R2R2(a3)
R1R1(a2)
R0R0(a1)
通用寄
存器和
程序计
数器
快中断中断未定义中止管理系统用户
各模式下实际访问的寄存器寄存器在汇编
中的名称
寄存器
类别
一般的通用寄存器
R13_fiqR13_irqR13_undR13_abtR13_svcR13
R12_fiqR12
R11_fiqR11
R10_fiqR10
R9_fiqR9
R8_fiqR8
R7
R6
R5
R4
R3
R2
R1
R0
在汇编语言中寄存
器R0~R13为保存数据
或地址值的通用寄存器。
它们是完全通用的寄存
器,不会被体系结构作
为特殊用途,并且可用
于任何使用通用寄存器
的指令。
周立功单片机SPSR_fiqSPSR_irqSPSR_undSPSR_abtSPSR_abt无SPSR
CPSRCPSR状态寄
存器
R15R15(PC)
R14_fiqR14_irqR14_undR14_abtR14_svcR14R14(LR)
R13_fiqR13_irqR13_undR13_abtR13_svcR13R13(SP)
R12_fiqR12R12(IP)
R11_fiqR11R11(FP,v8)
R10_fiqR10R10(SL,v7)
R9_fiqR9R9(SB,v6)
R8_fiqR8R8(v5)
R7R7(v4)
R6R6(v3)
R5R5(v2)
R4R4(v1)
R3R3(a4)
R2R2(a3)
R1R1(a2)
R0R0(a1)
通用寄
存器和
程序计
数器
快中断中断未定义中止管理系统用户
各模式下实际访问的寄存器寄存器在汇编
中的名称
寄存器
类别
一般的通用寄存器
R13_fiqR13_irqR13_undR13_abtR13_svcR13
R12_fiqR12
R11_fiqR11
R10_fiqR10
R9_fiqR9
R8_fiqR8
R7
R6
R5
R4
R3
R2
R1
R0
R7
R6
R5
R4
R3
R2
R1
R0
其中R0~R7为
未分组的寄存器,也
就是说对于任何处理
器模式,这些寄存器
都对应于相同的32位
物理寄存器。
周立功单片机SPSR_fiqSPSR_irqSPSR_undSPSR_abtSPSR_abt无SPSR
CPSRCPSR状态寄
存器
R15R15(PC)
R14_fiqR14_irqR14_undR14_abtR14_svcR14R14(LR)
R13_fiqR13_irqR13_undR13_abtR13_svcR13R13(SP)
R12_fiqR12R12(IP)
R11_fiqR11R11(FP,v8)
R10_fiqR10R10(SL,v7)
R9_fiqR9R9(SB,v6)
R8_fiqR8R8(v5)
R7R7(v4)
R6R6(v3)
R5R5(v2)
R4R4(v1)
R3R3(a4)
R2R2(a3)
R1R1(a2)
R0R0(a1)
通用寄
存器和
程序计
数器
快中断中断未定义中止管理系统用户
各模式下实际访问的寄存器寄存器在汇编
中的名称
寄存器
类别
一般的通用寄存器
R14_fiqR14_irqR14_undR14_abtR14_svcR14
R13_fiqR13_irqR13_undR13_abtR13_svcR13
R12_fiqR12
R11_fiqR11
R10_fiqR10
R9_fiqR9
R8_fiqR8
寄存器R8~R14为分组
寄存器。它们所对应的物理
寄存器取决于当前的处理器
模式,几乎所有允许使用通
用寄存器的指令都允许使用
分组寄存器
周立功单片机SPSR_fiqSPSR_irqSPSR_undSPSR_abtSPSR_abt无SPSR
CPSRCPSR状态寄
存器
R15R15(PC)
R14_fiqR14_irqR14_undR14_abtR14_svcR14R14(LR)
R13_fiqR13_irqR13_undR13_abtR13_svcR13R13(SP)
R12_fiqR12R12(IP)
R11_fiqR11R11(FP,v8)
R10_fiqR10R10(SL,v7)
R9_fiqR9R9(SB,v6)
R8_fiqR8R8(v5)
R7R7(v4)
R6R6(v3)
R5R5(v2)
R4R4(v1)
R3R3(a4)
R2R2(a3)
R1R1(a2)
R0R0(a1)
通用寄
存器和
程序计
数器
快中断中断未定义中止管理系统用户
各模式下实际访问的寄存器寄存器在汇编
中的名称
寄存器
类别
一般的通用寄存器
R12_fiqR12
R11_fiqR11
R10_fiqR10
R9_fiqR9
R8_fiqR8
寄存器R8~R12有两个分组的
物理寄存器。一个用于除FIQ模式
之外的所有寄存器模式,另一个用
于FIQ模式。这样在发生FIQ中断
后,可以加速FIQ的处理速度。
周立功单片机SPSR_fiqSPSR_irqSPSR_undSPSR_abtSPSR_abt无SPSR
CPSRCPSR状态寄
存器
R15R15(PC)
R14_fiqR14_irqR14_undR14_abtR14_svcR14R14(LR)
R13_fiqR13_irqR13_undR13_abtR13_svcR13R13(SP)
R12_fiqR12R12(IP)
R11_fiqR11R11(FP,v8)
R10_fiqR10R10(SL,v7)
R9_fiqR9R9(SB,v6)
R8_fiqR8R8(v5)
R7R7(v4)
R6R6(v3)
R5R5(v2)
R4R4(v1)
R3R3(a4)
R2R2(a3)
R1R1(a2)
R0R0(a1)
通用寄
存器和
程序计
数器
快中断中断未定义中止管理系统用户
各模式下实际访问的寄存器寄存器在汇编
中的名称
寄存器
类别
一般的通用寄存器
寄存器R13、R14分别有6个分
组的物理寄存器。一个用于用户和
系统模式,其余5个分别用于5种异
常模式。
R14_fiqR14_irqR14_undR14_abtR14_svcR14
R13_fiqR13_irqR13_undR13_abtR13_svcR13
周立功单片机SPSR_fiqSPSR_irqSPSR_undSPSR_abtSPSR_abt无SPSR
CPSRCPSR状态寄
存器
R15R15(PC)
R14_fiqR14_irqR14_undR14_abtR14_svcR14R14(LR)
R13_fiqR13_irqR13_undR13_abtR13_svcR13R13(SP)
R12_fiqR12R12(IP)
R11_fiqR11R11(FP,v8)
R10_fiqR10R10(SL,v7)
R9_fiqR9R9(SB,v6)
R8_fiqR8R8(v5)
R7R7(v4)
R6R6(v3)
R5R5(v2)
R4R4(v1)
R3R3(a4)
R2R2(a3)
R1R1(a2)
R0R0(a1)
通用寄
存器和
程序计
数器
快中断中断未定义中止管理系统用户
各模式下实际访问的寄存器寄存器在汇编
中的名称
寄存器
类别
堆栈指针寄存器R13(SP)
寄存器R13常作为堆栈指针
(SP)。在ARM指令集当中,没
有以特殊方式使用R13的指令或其
它功能,只是习惯上都这样使用。
但是在Thumb指令集中存在使用
R13的指令。
周立功单片机SPSR_fiqSPSR_irqSPSR_undSPSR_abtSPSR_abt无SPSR
CPSRCPSR状态寄
存器
R15R15(PC)
R14_fiqR14_irqR14_undR14_abtR14_svcR14R14(LR)
R13_fiqR13_irqR13_undR13_abtR13_svcR13R13(SP)
R12_fiqR12R12(IP)
R11_fiqR11R11(FP,v8)
R10_fiqR10R10(SL,v7)
R9_fiqR9R9(SB,v6)
R8_fiqR8R8(v5)
R7R7(v4)
R6R6(v3)
R5R5(v2)
R4R4(v1)
R3R3(a4)
R2R2(a3)
R1R1(a2)
R0R0(a1)
通用寄
存器和
程序计
数器
快中断中断未定义中止管理系统用户
各模式下实际访问的寄存器寄存器在汇编
中的名称
寄存器
类别
链接寄存器R14(LR)
R14为链接寄存器(LR),在结构上有
两个特殊功能:
�在每种模式下,模式自身的R14版本用于
保存子程序返回地址;
�当发生异常时,将R14对应的异常模式版
本设置为异常返回地址(有些异常有一个小
的固定偏移量)。
周立功单片机
Lable
程序A 程序B
R14
内部寄存器
• R14寄存器与子程序调用
BL Lable
地址A ???
MOV PC,LR
R14(地址A)
Lable ???
1.程序A执行过程中调
用程序B;
操作流程
2.程序跳转至标号
Lable,执行程序B。同
时硬件将“BL Lable”指
令的下一条指令所在地
址存入R14;
3.程序B执行最后,将R14寄存器的
内容放入PC,返回程序A;
周立功单片机
内部寄存器
• R14寄存器与异常发生
异常发生时,程序要跳转至异常服务程序,对
返回地址的处理与子程序调用类似,都是由硬件完
成的。区别在于有些异常有一个小常量的偏移。
周立功单片机
内部寄存器
• R14寄存器注意要点
当发生异常嵌套时,这些异常之间可能会发生
冲突。
例如:如果用户在用户模式下执行程序时发生了
IRQ中断,用户模式寄存器不会被破坏。但是如果
允许在IRQ模式下的中断处理程序重新使能IRQ中
断,并且发生了嵌套的IRQ中断时,外部中断处理
程序保存在R14_irq中的任何值都将被嵌套中断的返
回地址所覆盖。
周立功单片机
内部寄存器
• R14寄存器注意要点
R14 R14_irq
用户模式下的程序 IRQ模式下的程序A
a
return
B
...
X
A
地址A
地址A
1.执行用户模式
下的程序;
2.发生IRQ中
断,硬件将某
个地址存入IRQ
模式下的
R14_irq寄存
器,用户模式
下的R14没有被
破坏;
3. IRQ服务程
序A执行完毕,
将R14_irq寄存
器的内容减去
某个常量后存
入PC,返回之
前被中断的程
序;
未被破坏
周立功单片机
内部寄存器
• R14寄存器注意要点
R14 R14_irq
用户模式下的程序 IRQ模式下的程序A
a
B
...
X
A
地址A
地址A
1.执行用户模式
下的程序;
2.发生IRQ中
断,硬件将某
个地址存入IRQ
模式下的
R14_irq寄存
器,用户模式
下的R14没有被
破坏;
3. IRQ服务程
序A执行完毕,
将R14_irq寄存
器的内容减去
某个常量后存
入PC,返回之
前被中断的程
序;
未被破坏
IRQ模式下的程序B
a
return
B
...
X
A
地址B
地址B
4. 如果在IRQ
处理程序中打
开IRQ中断,并
且再次发生IRQ
中断,或者调
用子程序;
5. 硬件将返回
地址保存在
R14_irq寄存器
中,原来保存
的返回地址将
被覆盖,造成
错误;
被破坏
6. 在程序B返回
到程序A,然后
在返回到用户
模式下被中断
的程序时,发
生错误,将不
能正确返回; returnreturn
解决办法是确保R14
的对应版本在发生中断嵌
套时不再保存任何有意义
的值(将R14入栈),或
者切换到其它处理器模式
下。
周立功单片机SPSR_fiqSPSR_irqSPSR_undSPSR_abtSPSR_abt无SPSR
CPSRCPSR状态寄
存器
R15R15(PC)
R14_fiqR14_irqR14_undR14_abtR14_svcR14R14(LR)
R13_fiqR13_irqR13_undR13_abtR13_svcR13R13(SP)
R12_fiqR12R12(IP)
R11_fiqR11R11(FP,v8)
R10_fiqR10R10(SL,v7)
R9_fiqR9R9(SB,v6)
R8_fiqR8R8(v5)
R7R7(v4)
R6R6(v3)
R5R5(v2)
R4R4(v1)
R3R3(a4)
R2R2(a3)
R1R1(a2)
R0R0(a1)
通用寄
存器和
程序计
数器
快中断中断未定义中止管理系统用户
各模式下实际访问的寄存器寄存器在汇编
中的名称
寄存器
类别
程序计数器R15(PC)
寄存器R15为程序计数器(PC),它指
向正在取指的地址。可以认为它是一个通用
寄存器,但是对于它的使用有许多与指令相
关的限制或特殊情况。如果R15使用的方式
超出了这些限制,那么结果将是不可预测的。
周立功单片机
内部寄存器
• 读R15的限制
正常操作时,从R15读取的值是处理器正在取
指的地址,即当前正在执行指令的地址加上8个字
节(两条ARM指令的长度)。由于ARM指令总是
以字为单位,所以R15寄存器的最低两位总是为0。
LDR R0,PC
???
???PC
PC-4
PC-8 正在执行
正在译码
正在取指
流水线状态地址 程序代码
周立功单片机
内部寄存器
• 读R15的限制
当使用STR或STM指令保存R15时,会有一个例
外。这些指令可能将当前指令地址加8字节或加12
字节保存(将来可能还有其它数字)。偏移量是8
还是12取决于具体的ARM芯片,但是对于一个确定
的芯片,这个值是一个常量。
所以最好避免使用STR和STM指令来保存R15,
如果很难做到,那么应当在程序中计算出该芯片的
偏移量。
周立功单片机
内部寄存器
• 读R15的限制
计算偏移量程序代码:
SUB R1,PC,#4 ;R1=下面STR指令的地址
STR PC,[R0] ;保存STR指令地址+偏移量
LDR R0,[R0] ;然后重装
SUB R0,R0,R1 ;计算偏移量
周立功单片机
内部寄存器
• 写R15的限制
正常操作时,写入R15 的值被当作一个指令地
址,程序从这个地址处继续执行(相当于执行一次
无条件跳转)。
周立功单片机
内部寄存器
• 写R15的限制
由于ARM指令以字节为边界,因此写入R15的
值最低两位通常为0b00。具体的规则取决于内核结
构的版本:
�在ARM结构V3版及以下版本中,写入R15的值
的最低两位被忽略,因此跳转地址由指令的实
际目标地址(写入R15的值)和0xFFFFFFFC相
与得到;
�在ARM结构V4版及以上版本中,写入R15的值
的最低两位为0,如果不是,结果将不可预测。
周立功单片机SPSR_fiqSPSR_irqSPSR_undSPSR_abtSPSR_abt无SPSR
CPSRCPSR状态寄
存器
R15R15(PC)
R14_fiqR14_irqR14_undR14_abtR14_svcR14R14(LR)
R13_fiqR13_irqR13_undR13_abtR13_svcR13R13(SP)
R12_fiqR12R12(IP)
R11_fiqR11R11(FP,v8)
R10_fiqR10R10(SL,v7)
R9_fiqR9R9(SB,v6)
R8_fiqR8R8(v5)
R7R7(v4)
R6R6(v3)
R5R5(v2)
R4R4(v1)
R3R3(a4)
R2R2(a3)
R1R1(a2)
R0R0(a1)
通用寄
存器和
程序计
数器
快中断中断未定义中止管理系统用户
各模式下实际访问的寄存器寄存器在汇编
中的名称
寄存器
类别
程序状态寄存器CPSR
寄存器CPSR为程序状态寄存器,在异常
模式中,另外一个寄存器“程序状态保存寄
存器(SPSR)”可以被访问。每种异常都有
自己的SPSR,在因为异常事件而进入异常
时它保存CPSR的当前值,异常退出时可通
过它恢复CPSR。详细描述参看小节。
周立功单片机
内部寄存器
• Thumb状态寄存器
Thumb状态寄存器集是ARM状态集的子集,程
序员可以直接访问的寄存器为:
�8个通用寄存器R0~R7;
�程序计数器(PC);
�堆栈指针(SP);
�链接寄存器(LR);
�有条件访问程序状态寄存器( CPSR)。
周立功单片机
Thumb状态各模式下的寄存器
CPSRCPSR
状态寄
存器
R15PC
R14_fiqR14_irqR14_undR14_abtR14_svcR14LR
R13_fiqR13_irqR13_undR13_abtR13_svcR13SP
R7R7(v4,wr)
R6R6(v3)
R5R5(v2)
R4R4(v1)
R3R3(a4)
R2R2(a3)
R1R1(a2)
R0R0(a1)
通用寄
存器和
程序计
数器
快中断中断未定义中止管理系统用户
各模式下实际访问的寄存器寄存器在汇编
中的名称
寄存器
类别
注意:括号内为ATPCS中寄存器的命名,可以使用RN汇编伪指令将寄存器
定义多个名字。其中的汇编程序直接支持这些名称,但注意a1~a4,
v1~v4必须用小写。
周立功单片机
Thumb状态下的通用寄存器
CPSRCPSR
状态寄
存器
R15PC
R14_fiqR14_irqR14_undR14_abtR14_svcR14LR
R13_fiqR13_irqR13_undR13_abtR13_svcR13SP
R7R7(v4,wr)
R6R6(v3)
R5R5(v2)
R4R4(v1)
R3R3(a4)
R2R2(a3)
R1R1(a2)
R0R0(a1)
通用寄
存器和
程序计
数器
快中断中断未定义中止管理系统用户
各模式下实际访问的寄存器寄存器在汇编
中的名称
寄存器
类别
R7
R6
R5
R4
R3
R2
R1
R0
在汇编语言中寄存器R0~R7为保存
数据或地址值的通用寄存器。对于任何处
理器模式,它们中的每一个都对应于相同
的32为物理寄存器。它们是完全通用的寄
存器,不会被体系结构作为特殊的用途,
并且可用于任何使用通用寄存器的指令。
周立功单片机
Thumb状态下的堆栈指针寄存器(SP)
CPSRCPSR
状态寄
存器
R15PC
R14_fiqR14_irqR14_undR14_abtR14_svcR14LR
R13_fiqR13_irqR13_undR13_abtR13_svcR13SP
R7R7(v4,wr)
R6R6(v3)
R5R5(v2)
R4R4(v1)
R3R3(a4)
R2R2(a3)
R1R1(a2)
R0R0(a1)
通用寄
存器和
程序计
数器
快中断中断未定义中止管理系统用户
各模式下实际访问的寄存器寄存器在汇编
中的名称
寄存器
类别
堆栈指针SP对应ARM状态的寄存器
R13。每个异常模式都有其自身的SP分组
版本,SP通常指向各异常模式所专用的堆
栈。
注意:在发生异常时,处理器自动进
入ARM状态。
R13_fiqR13_irqR13_undR13_abtR13_svcR13
周立功单片机
Thumb状态下的链接寄存器R14(LR)
CPSRCPSR
状态寄
存器
R15PC
R14_fiqR14_irqR14_undR14_abtR14_svcR14LR
R13_fiqR13_irqR13_undR13_abtR13_svcR13SP
R7R7(v4,wr)
R6R6(v3)
R5R5(v2)
R4R4(v1)
R3R3(a4)
R2R2(a3)
R1R1(a2)
R0R0(a1)
通用寄
存器和
程序计
数器
快中断中断未定义中止管理系统用户
各模式下实际访问的寄存器寄存器在汇编
中的名称
寄存器
类别
链接寄存器LR对应ARM状态寄存器
R14,在结构上有两个特殊功能,详见
“ARM状态下的链接寄存器LR”。
注意:在发生异常时,处理器自动进
入ARM状态。
R14_fiqR14_irqR14_undR14_abtR14_svcR14
周立功单片机
内部寄存器
• ARM状态和Thumb状态之间寄存器的关系
Thumb状态寄存器与ARM状态寄存器有如下
的关系:
�Thumb状态R0~R7与ARM状态R0~R7相同;
�Thumb状态CPSR和SPSR与ARM状态CPSR和
SPSR相同;
�Thumb状态SP映射到ARM状态R13;
�Thumb状态LR映射到ARM状态R14;
�Thumb状态PC映射到ARM状态PC(R15)。
周立功单片机
R1
R2
R3
R4
R5
T humb
R6
R7
( C P SR )
( SP SR )
R1
R2
R3
R4
R5
A R M
R6
R7
R8
( C P SR )
( SP SR )
R9
R10
R11
R12
R0 R0
状态 状态
堆栈指针(SP)
连接寄存器(LR)
程序计数器(PC)
当前程序状态寄存器
被保存程序状态寄存器
堆栈指针(R13)
连接寄存器(R14)
程序计数器(R15)
当前程序状态寄存器
被保存程序状态寄存器
Thumb状态寄存器在Arm状态寄存器上的映射
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
R12
R0
堆栈指针 (R13)
连接寄存器 (R14)
程序计数器 (R15)
低寄存器
高寄存器
周立功单片机
内部寄存器
• 在Thumb状态中访问高寄存器
在Thumb状态中,高寄存器(R8~R15)不是
标准寄存器集的一部分。汇编语言程序员对它们的
访问受到限制,但可以将它们用于快速暂存。
可以使用MOV、CMP和ADD指令对高寄存器
操作,详见第4章。
周立功单片机
第3章 目录
�1.简介
�
�的模块和
内部框图
�4.体系结构直接支持的
数据类型
�5.处理器状态
�6.处理器模式
�7.内部寄存器
�8. 程序状态寄存器
�9.异常
�10.中断延迟
�11.复位
�12.存储器及存储器映射
I/O
�13.寻址方式简介
�指令简介
�15.协处理器接口
�16.调试接口简介
�接口简介
周立功单片机
程序状态寄存器
• 简介
ARM7TDMI内核包含1个CPSR和5个供异常处
理程序使用的SPSR。CPSR反映了当前处理器的状
态,其包含:
�4个条件代码标志(负(N)、零(Z)、进位(C)和
溢出(V) );
�2个中断禁止位,分别控制一种类型的中断;
� 5个对当前处理器模式进行编码的位;
�1个用于指示当前执行指令(ARM还是Thumb)
的位。
周立功单片机
N Z C V — — I M0M1M2M3M4TF—. . .
31 30 29 28 27 26 8 7 6 5 4 3 2 1 0
程序状态寄存器
• 简介
条件代码标志 保留 控制位
溢出标志
进位或借位扩展
零
负或小于
IRQ禁止
FIQ禁止
状态位
模式位
N Z C V I M0M1M2M3M4TF
CPSR寄存器的格式
周立功单片机
程序状态寄存器
• 简介
每个异常模式还带有一个程序状态保存寄存器
(SPSR),它用于保存在异常事件发生之前的CPSR。
CPSR和SPSR通过特殊指令进行访问。详细信息请参
阅第4章 。
注意:如果通过程序修改CPSR寄存器中的模式位进
入异常模式,那么硬件将不会把CPSR保存至SPSR中。
周立功单片机
程序状态寄存器
• 条件代码标志
大多数“数值处理指令”可以选择是否影响条件
代码标志位。通常如果指令带S后缀,则该指令的
执行会影响条件代码标志;但有一些指令的执行总
是会影响条件代码标志。
N、 Z、 C和V位都是条件代码标志。通过算术
操作、逻辑操作、MSR或者LDM指令可以对这些位
进行设置。所有ARM指令都可按条件来执行,而
Thumb指令中只有分支指令可按条件执行。
周立功单片机
程序状态寄存器
• 条件代码标志
各标志位的含义如下:
�N 运算结果的最高位反映在该标志位。对于有符
号二进制补码,结果为负数时N=1,结果为正数或
零时N=0;
�Z 指令结果为0时Z=1(通常表示比较结果“相
等”),否则Z=0;
周立功单片机
程序状态寄存器
• 条件代码标志
各标志位的含义如下:
�C 当进行加法运算(包括CMN指令),并且最高位
产生进位时C=1,否则C=0。当进行减法运算(包括
CMP 指令),并且最高位产生借位时C=0,否则
C=1。对于结合移位操作的非加法/减法指令,C为
从最高位最后移出的值,其它指令C通常不变;
�V当进行加法/减法运算,并且发生有符号溢出时
V=1,否则V=0,其它指令V通常不变。
周立功单片机
程序状态寄存器
• 控制位
CPSR的最低8位为控制位,当发生异常时,这
些位被硬件改变。当处理器处于一个特权模式时,
可用软件操作这些位。
它们分别是:
�中断禁止位;
�T位;
�模式位。
周立功单片机
程序状态寄存器
• 控制位
�中断禁止位包括I和F位:
�当I位置位时,IRQ中断被禁止;
�当F位置位时,FIQ中断被禁止。
�T位反映了正在操作的状态:
�当T位置位时,处理器正在Thumb状态下运
行;
�当T位清零时,处理器正在ARM状态下运行。
周立功单片机
程序状态寄存器
• 控制位
�模式位包括M4、M3、M2、M1和M0,这些位决
定处理器的操作模式。
注意:不是所有模式位的组合都定义了有效的处理
器模式,如果使用了错误的设置,将引起一个无法
恢复的错误。
周立功单片机
R0~R14,PC, CPSR R0~R7,SP,LR,PC,CPSR 系统11111
R0~R12,R13_und,R14_und,
PC,CPSR,SPSR_und
R0~
R7,SP_und,LR_und,PC,CPSR,
SPSR_und
未定义11011
R0~
R12,R13_abt,R14_abt,PC,
CPSR, SPSR_abt
R0~
R7,SP_abt,LR_abt,PC,CPSR,
SPSR_abt
中止10111
R0~R12,R13_svc,R14_svc,
PC,CPSR, SPSR_svc
R0~
R7,SP_svc,LR_svc,PC,CPSR,
SPSR_svc
管理10011
R0~
R12,R13_irq,R14_irq,PC,
CPSR, SPSR_irq
R0~
R7,SP_irq,LR_irq,PC,CPSR,
SPSR_fiq
中断10010
R0~R7,R8_fiq~R14_fiq,PC,
CPSR, SPSR_fiq
R0~
R7,SP_fiq,LR_fiq,PC,CPSR,
SPSR_fiq
快中断10001
R0~R14,PC, CPSR R0~R7,SP,LR,PC,CPSR用户10000
可见的ARM状态寄存器可见的Thumb状态寄存器模式M[4:0]
CPSR模式位设置表
周立功单片机
程序状态寄存器
• 保留位
CPSR中的保留位被保留将来使用。为了提高程
序的可移植性,当改变CPSR标志和控制位时,请不
要改变这些保留位。另外,请确保您程序的运行不
受保留位的值影响,因为将来的处理器可能会将这
些位设置为1或者0。
周立功单片机
周立功单片机
第3章 目录
�1.简介
�
�的模块和
内部框图
�4.体系结构直接支持的
数据类型
�5.处理器状态
�6.处理器模式
�7.内部寄存器
�8. 程序状态寄存器
�9.异常
�10.中断延迟
�11.复位
�12.存储器及存储器映射
I/O
�13.寻址方式简介
�指令简介
�15.协处理器接口
�16.调试接口简介
�接口简介
周立功单片机
异常
• 简介
只要正常的程序流被暂时中止,处理器就进入
异常模式。例如响应一个来自外设的中断。在处理
异常之前,ARM7TDMI内核保存当前的处理器状
态,这样当处理程序结束时可以恢复执行原来的程
序。
如果同时发生两个或更多异常,那么将按照固
定的顺序来处理异常,详见“异常优先级”部分。
周立功单片机
异常入口/出口汇总
此处PC为产生
数据中止的装
载或保存指令
的地址。
PC+8PC+8
SUBS
PC,R14_abt,#8数据中止
复位时保存在
R14_svc中的值
不可预知。
——无复位
PC+4PC+4
SUBS
PC,R14_irq,#4中断
此处PC为由于
FIQ或IRQ占先
而没有被执行
的指令的地址
PC+4PC+4
SUBS
PC,R14_fiq,#4快中断
PC+4PC+4
SUBS
PC,R14_abt,#4预取指中止
PC+2PC+4MOVS PC,R14_und未定义的指令
PC+2PC+4MOVS PC,R14_svcSWI
此处PC为
BL,SWI,为
定义的指令取
指或预取指中
止指令的地址
PC+2PC+4MOV PC,R14BL
Thumb
R14_x
ARM R14_x
备注
之前的状态
返回指令异常或入口
注意:“MOVS PC,R14_svc”是指在管理模式执行MOVS PC,R14指令。“MOVS
PC,R14_und”、“SUBS PC,R14_abt,#4”等指令也是类似的。
周立功单片机
异常
• 异常的入口和出口处理
如果异常处理程序已经把返回地址拷贝到堆栈,
那么可以使用一条多寄存器传送指令来恢复用户寄
存器并实现返回。
SUB LR,LR,#4 ;计算返回地址
STMFD SP!,{R0-R3,LR} ;保存使用到的寄存器
. . .
LDMFD SP!,{R0-R3,PC}^ ;中断返回
中断处理代码的开始部分和退出部分
周立功单片机
如果异常处理程序已经把返回地址拷贝到堆栈,
那么可以使用一条多寄存器传送指令来恢复用户寄
存器并实现返回。
中断处理代码的开始部分和退出部分
异常
• 异常的入口和出口处理
SUB LR,LR,#4 ;计算返回地址
STMFD SP!,{R0-R3,LR} ;保存使用到的寄存器
. . .
LDMFD SP!,{R0-R3,PC}^ ;中断返回
注意:中断返回指令的寄存器列表(其中必须包括
PC)后的“^”符号表示这是一条特殊形式的指令。
这条指令在从存储器中装载PC的同时(PC是最后
恢复的),CPSR也得到恢复。这里使用的堆栈指针
SP(R13)是属于异常模式的寄存器,每个异常模
式有自己的堆栈指针。这个堆栈指针应必须在系统
启动时初始化。
周立功单片机
异常
• 进入异常
在异常发生后,ARM7TDMI内核会作以下工作:
1.在适当的LR中保存下一条指令的地址,当异常入
口来自:
�ARM状态,那么ARM7TDMI将当前指令地址
加4或加8复制(取决于异常的类型)到LR中;
�为Thumb状态,那么ARM7TDMI将当前指令
地址加4或加8 (取决于异常的类型)复制到LR
中;异常处理器程序不必确定状态。
周立功单片机
异常
• 进入异常
在异常发生后,ARM7TDMI内核会作以下工作:
2.将CPSR复制到适当的SPSR中;
3. 将CPSR模式位强制设置为与异常类型相对应的
值;
4.强制PC从相关的异常向量处取指。
周立功单片机
ARM7TDMI内核在中断异常时置位中断禁止标
志,这样可以防止不受控制的异常嵌套。
注:异常总是在ARM状态中进行处理。当处理器处
于Thumb状态时发生了异常,在异常向量地址装入
PC时,会自动切换到ARM状态。
异常
• 进入异常
周立功单片机
当异常结束时,异常处理程序必须:
1.将LR中的值减去偏移量后存入PC,偏移量根据异
常的类型而有所不同;
2.将SPSR的值复制回CPSR;
3.清零在入口置位的中断禁止标志。
注:恢复CPSR的动作会将T、F和I位自动恢复为异
常发生前的值。
异常
• 退出异常
周立功单片机
程序A IRQ服务程序
系统模式 IRQ模式
程序
寄存器组
图示进入异常过程
1. 程序在系统模式下运行
用户程序,假定当前处理
器状态为Thumb状态、允
许IRQ中断;
2. 用户程序运行时发生
IRQ中断,硬件完成以下
动作:
LR_sys
SPSR_irq
LR_irqLR
PC
CPSR
SPSR
SYSSYSSYSSYS1111?0000. . .? ? ? ?
MODTFI. . .N Z C V
�置位I位(禁止IRQ中断)
�清零T位(进入ARM状态)
�设置MOD位,切换处理器
模式至IRQ模式
�将下一条指令的地址存入
IRQ模式的LR寄存器
�将CPSR寄存器内容存入
IRQ模式的SPSR寄存器
�将跳转地址存入PC,实
现跳转
IRQIRQIRQIRQ0000?1111. . .? ? ? ?
BackAddr
JumpAddr
J
u
m
p
SYS1?0. . .????
“?”表示对该位不关心
周立功单片机
在异常处理结束后,异常
处理程序完成以下动作: 程序A IRQ服务程序
系统模式 IRQ模式
程序
寄存器组
图示退出异常过程
LR_sys
SPSR_irq
LR_irqLR
PC
CPSR
SPSR
SYSSYSSYSSYS1111?0000. . .? ? ? ?
MODTFI. . .N Z C V
�将SPSR寄存器的值复制回
CPSR寄存器;
�将LR寄存的值减去一个常
量后复制到PC寄存器,跳
转到被中断的用户程序。
IRQIRQIRQIRQ0000?1111. . .? ? ? ?
BackAddr
JumpAddr
return
SYS1?0. . .????
SYSSYSSYSSYS1111?0000. . .? ? ? ?
BackAddr-4
J
u
m
p
“?”表示对该位不关心
周立功单片机
快速中断请求(FIQ)适用于对一个突发事件的快速
响应,这得益于在ARM状态中,快中断模式有8个专用
的寄存器可用来满足寄存器保护的需要(这可以加速
上下文切换的速度)。
不管异常入口是来自ARM状态还是Thumb状态,
FIQ处理程序都会通过执行下面的指令从中断返回:
SUBS PC,R14_fiq,#4SUBS PC,R14_fiq,#4SUBS PC,R14_fiq,#4SUBS PC,R14_fiq,#4
在一个特权模式中,可以通过置位CPSR中的F位
来禁止FIQ异常。
异常
• 快速中断请求
周立功单片机
中断请求(IRQ)异常是一个由nIRQ输入端的低
电平所产生的正常中断(在具体的芯片中,nIRQ由片
内外设拉低,nIRQ是内核的一个信号,对用户不可
见)。IRQ的优先级低于FIQ。对于FIQ序列它是被屏
蔽的。任何时候在一个特权模式下,都可通过置位
CPSR中的I 位来禁止IRQ。
不管异常入口是来自ARM状态还是Thumb状态,
FIQ处理程序都会通过执行下面的指令从中断返回:
SUBS PC,R14_fiq,#4SUBS PC,R14_fiq,#4SUBS PC,R14_fiq,#4SUBS PC,R14_fiq,#4
异常
• 中断请求
周立功单片机
中止发生在对存储器的访问不能完成时,中止
包含两种类型:
�预取中止 发生在指令预取过程中
�数据中止 发生在对数据访问时
异常
• 中止
周立功单片机
当发生预取中止时,ARM7TDMI内核将预取的
指令标记为无效,但在指令到达流水线的执行阶段
时才进入异常。如果指令在流水线中因为发生分支
而没有被执行,中止将不会发生。
在处理中止的原因之后,不管处于哪种处理器
操作状态,处理程序都会执行下面的指令恢复PC和
CPSR并重试被中止的指令:
SUBS PC,R14_abt,#4SUBS PC,R14_abt,#4SUBS PC,R14_abt,#4SUBS PC,R14_abt,#4
异常
• 中止——预取指中止
周立功单片机
当发生数据中止后,根据产生数据中止的指令
类型作出不同的处理:
异常
• 中止——数据中止
�数据转移指令(LDR、STR)回写到被修改的基址
寄存器。中止处理程序必须注意这一点;
�交换指令(SWP)中止好像没有被执行过一样
(中止必须发生在SWP指令进行读访问时) ;
周立功单片机
�块数据转移指令(LDM,STM)完成。 当回写被设
置时,基址寄存器被更新。在指示出现中止后,
ARM7TDMI内核防止所有寄存器被覆盖。这意味
着ARM7TDMI内核总是会保护被中止的LDM指令
中的R15(总是最后一个被转移的寄存器)。
异常
• 中止——数据中止
当发生数据中止后,根据产生数据中止的指令
类型作出不同的处理:
周立功单片机
在修复产生中止的原因后,不管处于哪种处理
器操作状态,处理程序都必须执行下面的返回指令 :
SUBS PC,R14_abt,#8SUBS PC,R14_abt,#8SUBS PC,R14_abt,#8SUBS PC,R14_abt,#8
异常
• 中止——数据中止
周立功单片机
使用软件中断(SWI)指令可以进入管理模式,
通常用于请求一个特定的管理函数。SWI处理程序
通过执行下面的指令返回:
MOVS PC,R14_svcMOVS PC,R14_svcMOVS PC,R14_svcMOVS PC,R14_svc
这个动作恢复了PC和CPSR并返回到SWI之后的
指令。SWI处理程序读取操作码以提取SWI函数编
号。
异常
• 软件中断指令
周立功单片机
当ARM7TDMI处理器遇到一条自己和系统内
任何协处理器都无法处理的指令时,ARM7TDMI
内核执行未定义指令陷阱。软件可使用这一机制通
过模拟未定义的协处理器指令来扩展ARM指令集。
注:ARM7TDMI处理器完全遵循ARM结构v4T,可
以捕获所有分类未被定义的指令位格式。
异常
• 未定义的指令
周立功单片机
在模拟处理了失败的指令后,陷阱程序执行下面
的指令:
MOVS PC,R14_svcMOVS PC,R14_svcMOVS PC,R14_svcMOVS PC,R14_svc
这个动作恢复了PC和CPSR并返回到未定义指
令之后的指令。
异常
• 未定义的指令
周立功单片机
异常向量
禁止禁止快中断FIQ0x0000 001C
F禁止中断IRQ0x0000 0018
——保留保留0x0000 0014
FI中止中止(数据)0x0000 0010
FI中止中止(预取)0x0000 000C
F禁止管理软件中断0x0000 0008
FI未定义未定义指令0x0000 0004
禁止禁止管理复位0x0000 0000
进入时F的状
态进入时I的状态进入时的模式异常类型地址
注:表中的I和F表示不对该位有影响,保留原来的指。
周立功单片机
当多个异常同时发生时,一个固定的优先级
系统决定它们被处理的顺序:
异常
• 异常优先级
7(最低优先级)
6
5
4
3
2
1(最高优先级)
优先级异常类型
SWI
未定义指令
预取中止
IRQ
FIQ
数据中止
复位
优先级降低
周立功单片机
注意:
�未定义的指令和SWI异常互斥。因为同一条指令不
能既是未定义的,又能产生有效的软件中断;
�当FIQ使能,并且FIQ和数据中止异常同时发生
时,ARM7TDMI内核首先进入数据中止处理程
序,然后立即跳转到FIQ向量。在FIQ处理结束后返
回到数据中止处理程序。数据中止的优先级必须高
于FIQ以确保数据转移错误不会被漏过。
异常
• 异常优先级
周立功单片机
第3章 目录
�1.简介
�
�的模块和
内部框图
�4.体系结构直接支持的
数据类型
�5.处理器状态
�6.处理器模式
�7.内部寄存器
�8. 程序状态寄存器
�9.异常
�10.中断延迟
�11.复位
�12.存储器及存储器映射
I/O
�13.寻址方式简介
�指令简介
�15.协处理器接口
�16.调试接口简介
�接口简介
周立功单片机
中断延迟
• 最大中断延迟
�Tsyncmax,请求通过同步器的最长时间。为2
个处理器周期(由内核决定);
当FIQ使能时,最坏情况是正在执行一条装载
所有寄存器的指令“LDM”(它耗时最长),同时发
生了FIQ和数据中止异常,在响应FIQ中断之前要先
把正在执行的指令完成,然后先进入数据中止异
常,再马上跳转到FIQ异常入口,所以延迟时间包
含:
周立功单片机
中断延迟
• 最大中断延迟
�Tldm,最长的指令执行需要的时间。Tldm在
零等待状态系统中的执行时间为20个周期。注
意,是在零等待状态系统中。一般的基于ARM7
核的芯片的存储器系统比内核速度慢,造成其
不是零等待的;
�Texc,数据中止入口的时间。Texc为3个周期
(由内核决定);
�Tfiq,FIQ入口的时间。Tfiq为2个周期(由内
核决定)。
周立功单片机
中断延迟
• 最大中断延迟
FIQ总的延迟时间=
Tsyncmax +Tldm +Texc +Tfiq=27个周期
在40MHz处理器时钟时,最大延迟时间略少于。
在此时间结束后,ARM7TDMI执行位于0x1C处的指令。
最大的IRQ延迟时间与之相似,但必须考虑到这样一
种情况,当更高优先级的FIQ和IRQ同时申请时,IRQ要延
迟到FIQ处理程序允许IRQ中断时才处理(可能需要对中断
控制器进行相应的操作)。IRQ延迟时间也要相应增加。
周立功单片机
中断延迟
• 最小中断延迟
FIQ或IRQ的最小中断延迟是请求通过同步器的
时间Tsyncmin加上Tfiq(共4个处理器周期)。
周立功单片机
第3章 目录
�1.简介
�
�的模块和
内部框图
�4.体系结构直接支持的
数据类型
�5.处理器状态
�6.处理器模式
�7.内部寄存器
�8. 程序状态寄存器
�9.异常
�10.中断延迟
�11.复位
�12.存储器及存储器映射
I/O
�13.寻址方式简介
�指令简介
�15.协处理器接口
�16.调试接口简介
�接口简介
周立功单片机
复位
• 复位
当nRESET信号被拉低时(一般外部复位引脚电
平的变化和芯片的其它复位源会改变这个内核信
号),ARM7TDMI处理器放弃正在执行的指令。
在复位后,除PC和CPSR之外的所有寄存器的
值都不确定。
周立功单片机
复位
• 复位
当nRESET信号再次变为高电平时,ARM处理
器执行下列操作:
1.强制M[4:0]变为b10011(管理模式);
2.置位CPSR中的I和F位;
3.清零CPSR中的T位;
4.强制PC从地址0x00开始对下一条指令进行取指;
5.返回到ARM状态并恢复执行 。
周立功单片机
第3章 目录
�1.简介
�
�的模块和
内部框图
�4.体系结构直接支持的
数据类型
�5.处理器状态
�6.处理器模式
�7.内部寄存器
�8. 程序状态寄存器
�9.异常
�10.中断延迟
�11.复位
�12.存储器及存储器映射
I/O
�13.寻址方式简介
�指令简介
�15.协处理器接口
�16.调试接口简介
�接口简介
周立功单片机
存储器及存储器映射I/O
• 简介
ARM7TDMI 处 理 器 采 用 冯 · 诺 依 曼 ( Von
Neumann)结构,指令和数据共用一条32位数据
总线。只有装载、保存和交换指令可访问存储器中
的数据。
周立功单片机
存储器及存储器映射I/O
• 简介
ARM7的规范仅定义了处理器核与存储系统之
间的信号及时序(局部总线),而现实的芯片一般
在外部总线与处理器核的局部总线之间有一个存储
器管理部件将局部总线的信号和时序转换为现实的
外部总线信号和时序。因此,外部总线的信号和时
序与具体的芯片相关,不是ARM7的标准。具体到
某个芯片的外部存储系统的设计需要参考其芯片的
数据手册或使用手册等资料。
周立功单片机
CPB
CPA
CPnI
CPTBIT
CPSEQ
CPnMREQ
CPnOPC
CPnTRANS
TRANS[1:0]
PROT[1:0]
SIZE[1:0]
WRITE
ABORT
RDATA[31:0]
WDATA[31:0]
ADDR[31:0]
DBGTDO
DBGnTDOEN
DBGnTRST
DBGTDI
DBGTMS
DBGTCKEN
DBGCOMMTX
DBGCOMMRX
DBGRNG[0]
DBGRNG[1]
DBGEN
DBGEXT[0]
DBGEXT[1]
DBGnEXEC
DBGACK
DBGBREAK
DBGRQ
LOCK
CFGBIGEND
nRESET
nFIQ
nIRQ
CLKEN
CLK
DBGINSTRVALID
ARM7TDMI-SDMORE
同步的
EmbededICE-RT
扫描调试访问端口
存储器接口
存储器管理接口
协处理器接口
时钟
中断
总线控制
仲裁
调试
处理器
ARM7
内核
存储器
控制器 存储器
存储器及存储器映射I/O
• 简介
ARM7定义了局部
总线的接口时序
各芯片厂商制定了自
己的接口时序
ARM7局部总线
一般在两者之间加入存储器控制器
周立功单片机
存储器及存储器映射I/O
• 简介
ARM7TDMI处理器将存储器看作是一个从0开
始的线性递增的字节集合:
�字节0到3保存第1个存储的字
�字节4到7保存第2个存储的字
�字节8到11保存第3个存储的字
�依此类推
周立功单片机
存储器及存储器映射I/O
• 简介
ARM7TDMI处理器可以将存储器中的字以下列
格式存储(详细说明见“存储器格式”小节):
�大端格式(Big-endian)
�小端格式(Little-endian)
周立功单片机
存储器及存储器映射I/O
• 地址空间
ARM结构使用单个平面的232个8位字节地址空
间。字节地址按照无符号数排列,从0到232-1。地
址空间可以看作是包含230个32位字 ,或231个16
位半字。如果地址向上或向下溢出地址空间,通常
会发生翻转。
注意:如果在取指操作时地址发生溢出,只要没有
执行预取的无效指令,就不会导致异常。
周立功单片机
存储器及存储器映射I/O
• 地址空间
�跳转目标的计算方法:
(当前指令的地址) + 8 + 偏移量
�下一条指令位置的计算方法:
(当前指令的地址) + 4
周立功单片机
存储器及存储器映射I/O
• 存储器格式
地址空间的规则:
�位于地址A的字包含的字节位于地址A,A+1,A+2和
A+3;
�位于地址A的半字包含的字节位于地址A和A+1;
�位于地址A+2的半字包含的字节位于地址A+2和
A+3;
�位于地址A的字包含的半字位于地址A和A+2;
字节 字节 字节 字节
地址A A+1 A+2 A+3
半字 半字
字
周立功单片机
存储器系统有两种映射机制:
�小端存储器系统:
在小端格式中,高位数字存放在高位字节中。
因此存储器系统字节0连接到数据线7~0。
�大端存储器系统:
在大端格式中,高位数字存放在低位字节中。
因此存储器系统字节0连接到数据线31~24。
0x12345678字数据的大小端存储方式
存储器及存储器映射I/O
• 存储器格式
0x12
高位地址低位地址
0x34 0x56 0x78
大端模式
0x78
高位地址低位地址
0x56 0x34 0x12
小端模式
周立功单片机
一个基于ARM内核的芯片可以只支持大端模式
或小端模式,也可以两者都支持。
在ARM指令集中不包含任何直接选择大小端的
指令,但是一个同时支持大小端模式的ARM芯片可
以通过硬件配置(一般使用芯片的引脚来配置)来
匹配存储器系统所使用的规则。
存储器及存储器映射I/O
• 存储器格式
注意:如果实际的存储器格式与芯片的存储器格式
不符时,只有以字为单位的数据存取才正确,否则
将出现不可预期的结果。
周立功单片机
ARM结构通常希望所有的存储器访问都合理的对
齐。具体来说就是字访问的地址通常是字对齐的,而
半字访问使用的地址是半字对齐的。不按这种方式对
齐的存储器访问称为非对齐的存储器访问。
�将 一 个 非 字 ( 半 字 ) 对 齐 的 地 址 写 入 ARM
(Thumb)状态的R15寄存器,将引起非对齐的指
令取指。
�在一个非字(半字)对齐的地址读写一个字(半
字),将引起非对齐的数据访问:
存储器及存储器映射I/O
• 未对齐的存储器访问
周立功单片机
许多ARM实现在前一条指令的执行尚未完成时
将指令从存储器中取出。这个动作称为指令的预取。
指令的预取并不是实际执行指令。芯片的生产厂商
可以自由选择预取指令的数目。被预取的指令可能
得不到运行,可能的原因是:
�发生异常;
�发生跳转;
存储器及存储器映射I/O
• 指令的预取和自修改代码
周立功单片机
当读取PC时,得到的指令地址比正在执行指令
的地址落后两条指令:
�对于ARM指令,得到的地址是它自身地址+8;
�对于Thumb 指令,得到的地址是它自身地址
+4;
虽然生产厂商可以选择预取指令的数目,但是
仍然可以保证读取PC所得到地址比它自身地址落后
两条指令。
存储器及存储器映射I/O
• 指令的预取和自修改代码
周立功单片机
在预取之前要进行转移预测,例如在执行一条
分支指令,此时要判断是预取分支指令之后的指令
还是转移目标地址的指令。
存储器及存储器映射I/O
• 指令的预取和自修改代码
周立功单片机
???
???
???
内核流水性
执行
译码
预取
LDR R0,AddInstr
STR R0,NextInstr
NextInstr
SUB R1,R1,#1
. . .
AddInstr
ADD R1,R1,#1
(1)(1)(1)(1)
(2)(2)(2)(2)
(4)(4)(4)(4)
(3)(3)(3)(3)
在存储器中的指令可能在它被预取之后,被执行
之前发生改变。如果发生这种情况,对存储器中的指
令进行修改一般不能阻止已取指的指令的执行。
存储器及存储器映射I/O
• 预取可能存在的问题
LDR R0,AddInstrSTR R0,NextInstr
LDR R0,AddInstrSTR R0,NextInstr
LDR R0,AddInstr
SUB R1,R1,#1
1.从地址(1)预取指; 2.从地址(2)预取指,“LDR”指令进入
译码阶段;
3.从地址(3)预取指,“STR”指令进入
译码阶段,同时“LDR”指令进入执行阶
段,结果是将地址(4)的指令装入R0;
4.继续预取指,同时“STR”指令进入执行
阶段,结果是将“ADD ”指令存入地址
(3),“SUB”指令被覆盖;
5.虽然“SUB”指令在存储器中被覆盖,但
是它仍存在于流水线上,并进入执行阶
段;
ADD R1,R1,#1 (3)(3)(3)(3)
SUB R1,R1,#1
STR R0,NextInstr
???
???
SUB R1,R1,#1
???
周立功单片机
LDR R0,AddInstr
STR R0,NextInstr
NextInstr
SUB R1,R1,#1
. . .
AddInstr
ADD R1,R1,#1
(1)(1)(1)(1)
(2)(2)(2)(2)
(4)(4)(4)(4)
(3)(3)(3)(3)
�如果在“SUB”指令预取之
后 , 执 行 之 前 , 发 生 中
断 ,那么该指令将被丢
弃,而不会执行。
�如果ARM处理器或存储
器系统允许保持预取指令
的备份并使用这些备份而
不是重新预取,那么以后
执行这段代码,仍将执行
“SUB”指令。
存储器及存储器映射I/O
• 预取可能存在的问题
提示:因为自修改代码有
许多特需要考虑,建议尽
量避免使用。
周立功单片机
在许多系统中,几乎不可能完全避免自修改代
码的使用。例如,任何一个允许将程序装入存储器
然后执行的系统都使用自修改代码。
因此每个ARM芯片都定义了一系列的操作,使
自修改代码序列可以可靠地执行。这一串代码称为
指令存储器屏障(IMB),它通常同时取决于具体的
ARM芯片的和具体存储器芯片。
存储器及存储器映射I/O
• 指令存储器屏障(IMB)
周立功单片机
基于ARM内核的芯片具有许多的外设,这些外
设访问的标准方法是使用存储器映射的I/O,为外设
的每个寄存器都分配一个地址。通常,从这些地址
装载数据用于读入,向这些地址保存数据用于输出。
有些地址的装载和保存用于外设的控制功能,而不
是输入或输出功能。
存储器及存储器映射I/O
• 存储器映射的I/O
注意:存储器映射的I/O位置的操作不同于正常的存
储器位置的操作。通常,存储器映射的I/O位置没有
高速缓存和无缓冲区。
周立功单片机
第3章 目录
�1.简介
�
�的模块和
内部框图
�4.体系结构直接支持的
数据类型
�5.处理器状态
�6.处理器模式
�7.内部寄存器
�8. 程序状态寄存器
�9.异常
�10.中断延迟
�11.复位
�12.存储器及存储器映射
I/O
�13.寻址方式简介
�指令简介
�15.协处理器接口
�16.调试接口简介
�接口简介
周立功单片机
寻址方式是处理器执行指令时寻找真实操作数
地址的方式。ARM处理器支持9种基本寻址方式
(详见第4章):
寻址方式简介
• 寻址方式分类
�寄存器寻址;
�立即寻址 ;
�寄存器移位寻址;
�寄存器间接寻址;
�基址寻址 ;
�多寄存器寻址;
�堆栈寻址 ;
�块拷贝寻址 ;
�相对寻址 ;
周立功单片机
第3章 目录
�1.简介
�
�的模块和
内部框图
�4.体系结构直接支持的
数据类型
�5.处理器状态
�6.处理器模式
�7.内部寄存器
�8. 程序状态寄存器
�9.异常
�10.中断延迟
�11.复位
�12.存储器及存储器映射
I/O
�13.寻址方式简介
�指令简介
�15.协处理器接口
�16.调试接口简介
�接口简介
周立功单片机
ARM7TDMI处理器有两个指令集,每种指令集
都有自己的优缺点:
�32位ARM指令集 :对ARM核的特性提供最大的
支持,具有高效、快速的特点;
�16位Thumb指令集:它是ARM指令的子集,具
有更高的代码密度,非常适合存储器带宽和空间
都受限制的嵌入式应用场合。
AMR7指令集简介
• 简介
周立功单片机
ARM指令集可分为5大类指令,所有指令都可以
条件执行,其中一些指令还可以根据执行结果更新
CPSR寄存器的相关标志位:
�分支指令;
�数据处理指令;
�加载和存储指令;
�协处理器指令;
�杂项指令。
AMR7指令集简介
• ARM指令集
周立功单片机
Thumb指令集可分为4大类指令:
�分支指令;
�数据处理指令;
�寄存器加载和存储指令;
�异常产生指令。
AMR7指令集简介
• Thumb指令集
周立功单片机
第3章 目录
�1.简介
�
�的模块和
内部框图
�4.体系结构直接支持的
数据类型
�5.处理器状态
�6.处理器模式
�7.内部寄存器
�8. 程序状态寄存器
�9.异常
�10.中断延迟
�11.复位
�12.存储器及存储器映射
I/O
�13.寻址方式简介
�指令简介
�15.协处理器接口
�16.调试接口简介
�接口简介
周立功单片机
ARM7TDMI处理器指令集使您可以通过协处理
器 来 实 现 特 殊 的 附 加 指 令 。 这 些 协 处 理 器 是 与
ARM7TDMI内核相结合的单独的处理单元。一个典
型的协处理器包括:
�指令流水线;
�指令译码逻辑;
�寄存器分组;
�带独立数据通路的特殊处理逻辑。
协处理器接口
• 简介
周立功单片机
ARM内核与协处理器的关系
协处理器接口
• 简介
ARM内核 协处理器A 协处理器B
握手信号
数据地址总线
周立功单片机
一个系统最多可连接16个协处理器,每个协处
理器都通过唯一的ID号识别。ARM7TDMI处理器包
含两个协处理器,它们不能再用在外部协处理器:
�CP14 通信通道协处理器;
�CP15 为cache和MMU功能提供的系统控制协处
理器。
协处理器接口
• 可用的协处理器
周立功单片机
第3章 目录
�1.简介
�
�的模块和
内部框图
�4.体系结构直接支持的
数据类型
�5.处理器状态
�6.处理器模式
�7.内部寄存器
�8. 程序状态寄存器
�9.异常
�10.中断延迟
�11.复位
�12.存储器及存储器映射
I/O
�13.寻址方式简介
�指令简介
�15.协处理器接口
�16.调试接口简介
�接口简介
周立功单片机
ARM7TDMI处理器的高级调试特性使应用程序、
操作系统和硬件的开发变得更加容易。
调试接口简介
• 典型调试系统
调试主机:
一台运行调试
软件的计算机。
协议转换器:
将调试主机发出
的高级命令转换
到处理器JTAG接
口的低级命令。
调试目标:
具体的硬件目标
板。
周立功单片机
CLK
ARM7TDMI-S
内核
EmbeddedICE-RT
DBGRNG[1:0]
DBGACK
DBGBREAK
DBGCOMMTX
DBGCOMMRX
DBGRQ
DBGEXT[1:0]
DBGEN
TAP
DBGTCKEN
DBGTMS
DBGTDI
DBGTDO
DBGnTRST
宏单元
EmbeddedICE-RT模块
周立功单片机
第3章 目录
�1.简介
�
�的模块和
内部框图
�4.体系结构直接支持的
数据类型
�5.处理器状态
�6.处理器模式
�7.内部寄存器
�8. 程序状态寄存器
�9.异常
�10.中断延迟
�11.复位
�12.存储器及存储器映射
I/O
�13.寻址方式简介
�指令简介
�15.协处理器接口
�16.调试接口简介
�接口简介
周立功单片机
外 部 嵌 入 式 跟 踪 宏 单 元 ( ETM ) 连 接 到
ARM7TDMI处理器,这样就能够实现对正在执行的
处理器进行代码的实时跟踪。
ETM直接连接到ARM内核而不是主AMBA系统
总线。它将跟踪信息压缩并通过一个窄带跟踪端口
输出。
ETM接口简介
• 简介
周立功单片机
周立功单片机
第4章 ARM7TDMI(-S)指令系统
周立功单片机
第4章 目录
�处理器寻址方式
�2.指令集介绍
� ARM指令集
� Thumb指令集
周立功单片机
第4章 目录
�处理器寻址方式
�2.指令集介绍
� ARM指令集
� Thumb指令集
周立功单片机
第4章 ARM7TDMI(-S)指令系统
• 简介
ARM处理器是基于精简指令集计算机(RISC)原
理 设 计 的 , 指 令 集 和 相 关 译 码 机 制 较 为 简 单 。
ARM7TDMI(-S)具有32位ARM指令集和16位Thumb
指令集,ARM指令集效率高,但是代码密度低;而
Thumb指令集具有较高的代码密度,却仍然保持
ARM的大多数性能上的优势,它是ARM指令集的
子集。所有的ARM指令都是可以有条件执行的,而
Thumb指令仅有一条指令具备条件执行功能。ARM
程序和Thumb程序可相互调用,相互之间的状态切
换开销几乎为零。
周立功单片机
第4章 ARM7TDMI(-S)指令系统
• ARM指令集与Thumb指令集的关系
Thumb指令集
具有灵活、小
巧的特点
ARM指令集支持
ARM核所有的特
性,具有高效、
快速的特点
周立功单片机
ARM处理器寻址方式
• 寻址方式分类
寻址方式是根据指令中给出的地址码字段来实
现寻找真实操作数地址的方式。ARM处理器具有9
种基本寻址方式。
1.寄存器寻址; 2.立即寻址;
3.寄存器移位寻址; 4.寄存器间接寻址;
5.基址寻址; 6.多寄存器寻址;
7.堆栈寻址; 8.块拷贝寻址;
9.相对寻址。
周立功单片机
操作数的值在寄存器中,指令中的地址码字段
指出的是寄存器编号,指令执行时直接取出寄存器
值来操作。寄存器寻址指令举例如下:
MOV R1,R2MOV R1,R2MOV R1,R2MOV R1,R2 ;将R2的值存入R1
SUB R0,R1,R2SUB R0,R1,R2SUB R0,R1,R2SUB R0,R1,R2 ;将R1的值减去R2的值,结果保存到R0 0xAA
0x55
R2
R1
ARM处理器寻址方式
• 寻址方式分类——寄存器寻址
MOV R1,R2MOV R1,R2MOV R1,R2MOV R1,R2
0xAA
周立功单片机
立即寻址指令中的操作码字段后面的地址码部
分即是操作数本身,也就是说,数据就包含在指令
当中,取出指令也就取出了可以立即使用的操作数
(这样的数称为立即数)。立即寻址指令举例如下:
SUBSSUBSSUBSSUBS R0,R0,#1R0,R0,#1R0,R0,#1R0,R0,#1 ;R0减1,结果放入R0,并且影响标志位
MOVMOVMOVMOV R0,#0xFF000R0,#0xFF000R0,#0xFF000R0,#0xFF000 ;将立即数0xFF000装入R0寄存器 0x55R0
MOV R0,#0xFF00
程序存储
ARM处理器寻址方式
• 寻址方式分类——立即寻址
MOV R0,#0xFF00MOV R0,#0xFF00MOV R0,#0xFF00MOV R0,#0xFF00
0xFF00
从代码中获得数据
周立功单片机
寄存器移位寻址是ARM指令集特有的寻址方式。
当第2个操作数是寄存器移位方式时,第2个寄存器
操作数在与第1个操作数结合之前,选择进行移位操
作。寄存器移位寻址指令举例如下:
MOVMOVMOVMOV R0,R2,LSL #3R0,R2,LSL #3R0,R2,LSL #3R0,R2,LSL #3 ;R2的值左移3位,结果放入R0,
;即是R0=R2×8
ANDSANDSANDSANDS R1,R1,R2,LSL R3R1,R1,R2,LSL R3R1,R1,R2,LSL R3R1,R1,R2,LSL R3 ;R2的值左移R3位,然后和R1相
;“与”操作,结果放入R1
0x55R0
R2 0x01
ARM处理器寻址方式
• 寻址方式分类——寄存器移位寻址
MOV R0,R2,LSL #3MOV R0,R2,LSL #3MOV R0,R2,LSL #3MOV R0,R2,LSL #3
0x08
0x08
逻辑左移3位
周立功单片机
寄存器间接寻址指令中的地址码给出的是一个
通用寄存器的编号,所需的操作数保存在寄存器指
定地址的存储单元中,即寄存器为操作数的地址指
针。寄存器间接寻址指令举例如下:
LDRLDRLDRLDR R1,[R2]R1,[R2]R1,[R2]R1,[R2] ;将R2指向的存储单元的数据读出
;保存在R1中
SWPSWPSWPSWP R1,R1,[R2]R1,R1,[R2]R1,R1,[R2]R1,R1,[R2] ;将寄存器R1的值和R2指定的存储
;单元的内容交换
0x55R0
R2 0x40000000
0xAA0x40000000
ARM处理器寻址方式
• 寻址方式分类——寄存器间接寻址
LDR R0,[R2]LDR R0,[R2]LDR R0,[R2]LDR R0,[R2]
0xAA
周立功单片机
基址寻址就是将基址寄存器的内容与指令中给
出的偏移量相加,形成操作数的有效地址。基址寻
址用于访问基址附近的存储单元,常用于查表、数
组操作、功能部件寄存器访问等。基址寻址指令举
例如下:
LDRLDRLDRLDR R2,[R3,#0x0C]R2,[R3,#0x0C]R2,[R3,#0x0C]R2,[R3,#0x0C] ;读取R3+0x0C地址上的存储单元
;的内容,放入R2
STRSTRSTRSTR R1,[R0,#-4]!R1,[R0,#-4]!R1,[R0,#-4]!R1,[R0,#-4]! ;先R0=R0-4,然后把R1的值寄存
;到保存到R0指定的存储单元
ARM处理器寻址方式
• 寻址方式分类——基址寻址
0x55R2
R3 0x40000000
0xAA0x4000000C
LDR R2,[R3,#0x0C]LDR R2,[R3,#0x0C]LDR R2,[R3,#0x0C]LDR R2,[R3,#0x0C]
0xAA
将R3+0x0C作
为地址装载数
据
周立功单片机
多寄存器寻址一次可传送几个寄存器值,允许
一条指令传送16个寄存器的任何子集或所有寄存器。
多寄存器寻址指令举例如下:
LDMIALDMIALDMIALDMIA R1!,{R2-R7,R12} R1!,{R2-R7,R12} R1!,{R2-R7,R12} R1!,{R2-R7,R12} ;将R1指向的单元中的数据读出到
;R2~R7、R12中(R1自动加1)
STMIASTMIASTMIASTMIA R0!,{R2-R7,R12} R0!,{R2-R7,R12} R0!,{R2-R7,R12} R0!,{R2-R7,R12} ;将寄存器R2~R7、R12的值保
;存到R0指向的存储; 单元中
;(R0自动加1)
0x40000000R1
R2 0x?? 0x01 0x40000000
0x??R3
R4 0x??
R6 0x??
0x02
0x03
0x04
0x40000004
0x40000008
0x4000000C
存储器
ARM处理器寻址方式
• 寻址方式分类——多寄存器寻址
LDMIA R1!,{R2-R4,R6} LDMIA R1!,{R2-R4,R6} LDMIA R1!,{R2-R4,R6} LDMIA R1!,{R2-R4,R6}
0x01
0x02
0x03
0x04
0x40000010
周立功单片机
堆栈是一个按特定顺序进行存取的存储区,操
作顺序为“后进先出” 。堆栈寻址是隐含的,它使用
一个专门的寄存器(堆栈指针)指向一块存储区域(堆
栈),指针所指向的存储单元即是堆栈的栈顶。存储
器堆栈可分为两种:
�向上生长:向高地址方向生长,称为递增堆栈
�向下生长:向低地址方向生长,称为递减堆栈
ARM处理器寻址方式
• 寻址方式分类——堆栈寻址
周立功单片机
ARM处理器寻址方式
• 寻址方式分类——堆栈寻址
栈底
栈顶
栈区
SPSPSPSP�
堆栈存
储区
栈顶
栈底
栈区
�SPSPSPSP
向下
增长
向上
增长
0x12345678
0x12345678堆栈压栈
堆栈压栈
周立功单片机
栈顶SPSPSPSP�
栈顶SPSPSPSP�
栈底
空堆栈
栈底
满堆栈
堆栈指针指向最后压入的堆栈的有效数据项,
称为满堆栈;堆栈指针指向下一个待压入数据的空
位置,称为空堆栈。
ARM处理器寻址方式
• 寻址方式分类——堆栈寻址
0x12345678
0x12345678栈顶SPSPSPSP� 0x12345678
栈顶SPSPSPSP�
压栈 压栈
周立功单片机
所以可以组合出四种类型的堆栈方式:
�满递增:堆栈向上增长,堆栈指针指向内含有效
数据项的最高地址。指令如LDMFA、STMFA等;
�空递增:堆栈向上增长,堆栈指针指向堆栈上的
第一个空位置。指令如LDMEA、STMEA等;
�满递减:堆栈向下增长,堆栈指针指向内含有效
数据项的最低地址。指令如LDMFD、STMFD等;
�空递减:堆栈向下增长,堆栈指针向堆栈下的第
一个空位置。指令如LDMED、STMED等。
ARM处理器寻址方式
• 寻址方式分类——堆栈寻址
周立功单片机
多寄存器传送指令用于将一块数据从存储器的
某一位置拷贝到另一位置。 如:
STMIASTMIASTMIASTMIA R0!,{R1-R7}R0!,{R1-R7}R0!,{R1-R7}R0!,{R1-R7} ;将R1~R7的数据保存到存储器中。
;存储指针在保存第一个值之后增加,
;增长方向为向上增长。
STMIBSTMIBSTMIBSTMIB R0!,{R1-R7}R0!,{R1-R7}R0!,{R1-R7}R0!,{R1-R7} ;将R1~R7的数据保存到存储器中。
;存储指针在保存第一个值之前增加,
;增长方向为向上增长。
ARM处理器寻址方式
• 寻址方式分类——块拷贝寻址
周立功单片机
相对寻址是基址寻址的一种变通。由程序计数
器PC提供基准地址,指令中的地址码字段作为偏移
量,两者相加后得到的地址即为操作数的有效地址。
相对寻址指令举例如下:
BL SUBR1 ;调用到SUBR1子程序
BEQ LOOP ;条件跳转到LOOP标号处
...
LOOP MOV R6,#1
...
SUBR1 ...
ARM处理器寻址方式
• 寻址方式分类——相对寻址
周立功单片机
第4章 目录
�处理器寻址方式
�2.指令集介绍
� ARM指令集
� Thumb指令集
周立功单片机
• 简单的ARM程序
;文件名:
;功能:实现两个寄存器相加
;说明:使用ARMulate软件仿真调试
AREA Example1,CODE,READONLY ;声明代码段Example1
ENTRY ;标识程序入口
CODE32 ;声明32位ARM指令
START MOV R0,#0 ;设置参数
MOV R1,#10
LOOP BL ADD_SUB ;调用子程序ADD_SUB
B LOOP ;跳转到LOOP
ADD_SUB
ADDS R0,R0,R1 ;R0 = R0 + R1
MOV PC,LR ;子程序返回
END ;文件结束
使用“;”进行注释
标号顶格写
实际代码段
声明文件结束
周立功单片机
• 简单的ARM程序
;文件名:
;功能:实现两个寄存器相加
;说明:使用ARMulate软件仿真调试
AREA Example1,CODE,READONLY ;声明代码段Example1
ENTRY ;标识程序入口
CODE32 ;声明32位ARM指令
START MOV R0,#0 ;设置参数
MOV R1,#10
LOOP BL ADD_SUB ;调用子程序ADD_SUB
B LOOP ;跳转到LOOP
ADD_SUB
ADDS R0,R0,R1 ;R0 = R0 + R1
MOV PC,LR ;子程序返回
END ;文件结束
周立功单片机
第4章 目录
�处理器寻址方式
�2.指令集介绍
� ARM指令集
� Thumb指令集
周立功单片机
ARM指令小节目录
1.指令格式
2.条件码
3.存储器访问指令
4.数据处理指令
5.乘法指令
分支指令
7.协处理器指令
8.杂项指令
9.伪指令
周立功单片机
ARM指令小节目录
1.指令格式
2.条件码
3.存储器访问指令
4.数据处理指令
5.乘法指令
分支指令
7.协处理器指令
8.杂项指令
9.伪指令
周立功单片机
ARM指令的基本格式如下:
指令集介绍
• ARM指令集——指令格式
<<<<opcodeopcodeopcodeopcode> {<> {<> {<> {<condcondcondcond>} {S} <Rd> ,<>} {S} <Rd> ,<>} {S} <Rd> ,<>} {S} <Rd> ,<RnRnRnRn>{,<operand2>}>{,<operand2>}>{,<operand2>}>{,<operand2>}
其中<>号内的项是必须的,{}号内的项是可选的。
各项的说明如下:
opcodeopcodeopcodeopcode:指令助记符; condcondcondcond:执行条件;
SSSS:是否影响CPSR寄存器的值;
RdRdRdRd:目标寄存器; RnRnRnRn:第1个操作数的寄存器;
operand2operand2operand2operand2:第2个操作数;
周立功单片机
ARM指令的基本格式如下:
指令集介绍
• ARM指令集——第2个操作数
<<<<opcodeopcodeopcodeopcode> {<> {<> {<> {<condcondcondcond>} {S} <Rd> ,<>} {S} <Rd> ,<>} {S} <Rd> ,<>} {S} <Rd> ,<RnRnRnRn>{,<>{,<>{,<>{,<operand2operand2operand2operand2>}>}>}>}
灵活的使用第2个操作数“operand2operand2operand2operand2”能够提高代码
效率。它有如下的形式:
�#immed_8r——常数表达式;
�Rm——寄存器方式;
�Rm,shift——寄存器移位方式;
周立功单片机
指令集介绍
• ARM指令集——第2个操作数
�#immed_8r——常数表达式
该常数必须对应8位位图,即一个8位的常数通过
循环右移偶数位得到。
循环右移10位
0x12
0 0 0 1 0 0 1 0
0x00
0 0 0 0 0 0 0 0
0x00
0 0 0 0 0 0 0 0
0x00
0 0 0 0 0 0 0 0
0x00
0 0 0 0 0 0 0 0
0x00
0 0 0 0 0 0 0 0
0x80
1 0 0 0 0 0 0 0
0x04
0 0 0 0 0 1 0 0
8位常数
周立功单片机
指令集介绍
• ARM指令集——第2个操作数
�#immed_8r——常数表达式
该常数必须对应8位位图,即一个8位的常数通过
循环右移偶数位得到。
例如:
MOVMOVMOVMOV R0,R0,R0,R0,#1#1#1#1
ANDANDANDAND R1,R2,R1,R2,R1,R2,R1,R2,#0x0F#0x0F#0x0F#0x0F
周立功单片机
指令集介绍
• ARM指令集——第2个操作数
�Rm——寄存器方式
在寄存器方式下,操作数即为寄存器的数值。
例如:
SUBSUBSUBSUB R1,R1,R1,R1,R1,R1,R1,R1,R2R2R2R2
MOVMOVMOVMOV PC,PC,PC,PC,R0R0R0R0
周立功单片机
指令集介绍
• ARM指令集——第2个操作数
�Rm,shift——寄存器移位方式
将寄存器的移位结果作为操作数,但Rm值保持不
变,移位方法如下:
Type为移位的一种类型,Rs
为偏移量寄存器,低8位有效。Type Rs逻辑右移n位LSR #n
带扩展的循环右移1位RRX逻辑左移n位LSL #n
循环右移n位ROR #n算术右移n位ASR #n
说明操作码说明操作码
周立功单片机
指令集介绍
• ARM指令集——第2个操作数
LSL移位操作: 0
LSR移位操作: 0
ASR移位操作:
ROR移位操作:
RRX移位操作: C
周立功单片机
指令集介绍
• ARM指令集——第2个操作数
�Rm,shift——寄存器移位方式
例如:
ADDADDADDADD R1,R1,R1,R1,R1,R1,R1,R1,R1,R1,R1,R1,LSL #3LSL #3LSL #3LSL #3 ;R1=R1+R1*8=9R1
SUBSUBSUBSUB R1,R1,R2,R1,R1,R2,R1,R1,R2,R1,R1,R2,LSR R3LSR R3LSR R3LSR R3 ;R1=R1-(R2/2R3)
周立功单片机
ARM指令小节目录
1.指令格式
2.条件码
3.存储器访问指令
4.数据处理指令
5.乘法指令
分支指令
7.协处理器指令
8.杂项指令
9.伪指令
周立功单片机
ARM指令的基本格式如下:
指令集介绍
• ARM指令集——条件码
<<<<opcodeopcodeopcodeopcode> {<> {<> {<> {<condcondcondcond>} {S} <Rd> ,<>} {S} <Rd> ,<>} {S} <Rd> ,<>} {S} <Rd> ,<RnRnRnRn>{,<>{,<>{,<>{,<operand2operand2operand2operand2>}>}>}>}
使用条件码“condcondcondcond”可以实现高效的逻辑操作,提高
代码效率。
所有的ARM指令都可以条件执行,而Thumb指令
只有B(跳转)指令具有条件执行 功能。如果指令不标
明条件代码,将默认为无条件(AL)执行。
周立功单片机
从不执行(不要使用) 任何NV1111
无条件执行 (指令默认条件) 任何AL1110
有符号数小于或等于 Z=1,N!=VLE1101
有符号数大于 Z=0,N=VGT1100
有符号数小于 N!=VLT1011
有符号数大于或等于 N=VGE1010
无符号数小于或等于C=0,Z=1LS1001
无符号数大于C=1,Z=0HI1000
没有溢出V=0VC0111
溢出V=1VS0110
正数或零N=0PL0101
负数N=1MI0100
无符号数小于C=0CC/LO0011
无符号数大于或等于C=1CS/HS0010
不相等Z=0NE0001
相等Z=1EQ0000
含义标志条件助记符操作码
• 指令条件码表
周立功单片机
指令集介绍
• ARM指令集——条件码
C代码:
If(a > b)
a++;
Else
b++;
对应的汇编代码:
CMP R0,R1 ;R0与R1比较
ADDHI R0,R0,#1 ;若R0>R1,则R0=R0+1
ADDLS R1,R1,#1 ;若R0≤1,则R1=R1+1
示例:
周立功单片机
ARM指令小节目录
1.指令格式
2.条件码
3.存储器访问指令
4.数据处理指令
5.乘法指令
分支指令
7.协处理器指令
8.杂项指令
9.伪指令
周立功单片机
指令集介绍
• ARM指令集——存储器访问指令
ARM处理器是典型的RISC处理器,对存储器的
访问只能使用加载和存储指令实现。ARM处理器是
冯•诺依曼存储结构,程序空间、RAM空间及I/O映
射空间统一编址,除对RAM操作以外,对外围IO、
程序数据的访问均要通过加载/存储指令进行。
存储器访问指令分为单寄存器操作指令和多寄
存器操作指令。
周立功单片机
LDR{cond}SBRd←[addressing],addressing索引加载有符号字节数据LDRSB Rd, addressing
LDR{cond}SH
Rd←[addressing],
addressing索引 加载有符号半字数据 LDRSH Rd, addressing
LDR{cond}HRd←[addressing],addressing索引加载无符号半字数据LDRH Rd, addressing
LDR{cond}BTRd←[addressing],addressing索引
以用户模式加载无符
号字节数据LDRBT Rd, addressing
LDR{cond}TRd←[addressing],addressing索引
以用户模式加载字数
据LDRT Rd,addressing
LDR{cond}BRd←[addressing],addressing索引加载无符号字节数据LDRB Rd,addressing
LDR{cond}Rd←[addressing],addressing索引加载字数据LDR Rd,addressing
条件码位置操作说明助记符
• ARM存储器访问指令——单寄存器加载
周立功单片机
STR{cond}H[addressing] ←Rd,
addressing索引
存储半字数据STRH Rd,addressing
STR{cond}BT[addressing]←Rd,
addressing索引
以用户模式存储字节
数据
STRBT Rd,addressing
STR{cond}T[addressing]←Rd,
addressing索引
以用户模式存储字数
据
STRT Rd,addressing
STR{cond}B[addressing]←Rd,
addressing索引
存储字节数据STRB Rd,addressing
STR{cond}[addressing]←Rd,
addressing索引
存储字数据STR Rd, addressing
条件码位置操作说明助记符
• ARM存储器访问指令——单寄存器存储
LDR/STR指令用于对内存变量的访问、内存缓冲区数据的访问、查表、
外围部件的控制操作等。若使用LDR指令加载数据到PC寄存器,则实现程
序跳转功能,这样也就实现了程序散转。
所有单寄存器加载/存储指令可分为“字和无符号字节加载存储指令”和
“半字和有符号字节加载存储指令。
周立功单片机
•LDR和STR——字和无符号字节加载/存储指令
LDR指令用于从内存中读取单一字或字节数据
存入寄存器中,STR指令用于将寄存器中的单一字
或字节数据保存到内存。指令格式如下:
• ARM存储器访问指令——单寄存器存储
LDR{cond}{T} Rd,<地址> ;将指定地址上的字数据读入Rd
STR{cond}{T} Rd,<地址> ;将Rd中的字数据存入指定地址
LDR{cond}B{T} Rd,<地址> ;将指定地址上的字节数据读入Rd
STR{cond}B{T} Rd,<地址> ;将Rd中的字节数据存入指定地址
其中,T为可选后缀。若指令有T,那么即使处
理器是在特权模式下,存储系统也将访问看成是在
用户模式下进行的。T在用户模式下无效,不能与
前索引偏移一起使用T。
周立功单片机
• ARM存储器访问指令——单寄存器存储
•LDR和STR——字和无符号字节加载/存储指令编码
指令执行的条件码
I为0 时,偏移量为
12 位 立 即 数 , 为 1
时,偏移量为寄存
器移位
P表示前/后变址
U表示加/减
B 为 1 表 示 字 节 访
问,为0表示字访问
W表示回写
为指令的寻址方式
Rd为源/目标寄存器
Rn为基址寄存器
L用于区别加载(L为1)
或存储(L为0)
周立功单片机
• ARM存储器访问指令——单寄存器存储
•LDR和STR——字和无符号字节加载/存储指令
LDR/STR指令寻址非常灵活,它由两部分组成,其中一
部分为一个基址寄存器,可以为任一个通用寄存器;另一部
分为一个地址偏移量。地址偏移量有以下3种格式:
�立即数。立即数可以是一个无符号的数值。这个数据可以加
到基址寄存器,也可以从基址寄存器中减去这个数值。
如:LDR R1,[R0,#0x12]
�寄存器。寄存器中的数值可以加到基址寄存器,也可以从基
址寄存器中减去这个数值。
如:LDR R1,[R0,R2]
�寄存器及移位常数。寄存器移位后的值可以加到基址寄存
器,也可以从基址寄存器中减去这个数值。
如:LDR R1,[R0,R2,LSL #2]
周立功单片机
• ARM存储器访问指令——单寄存器存储
从寻址方式的地址计算方法分,加载/存储指令有以下4
种格式:
�零偏移。 如:LDR Rd,[Rn]
�前索引偏移。 如:LDR Rd,[Rn,#0x04]!
�程序相对偏移。 如:LDR Rd,labe1
�后索引偏移。 如:LDR Rd,[Rn],#0x04
注意:大多数情况下,必须保证字数据操作的地址是32位对
齐的。
•LDR和STR——字和无符号字节加载/存储指令
周立功单片机
•LDR和STR——半字和有符号字节加载/存储指令
这类LDR/STR指令可加载有符号半字或字节,可加载/存
储无符号半字。偏移量格式、寻址方式与加载/存储字和无符
号字节指令相同。
• ARM存储器访问指令——单寄存器存储
LDR{cond}SB Rd,<地址> ;将指定地址上的有符号字节读入Rd
LDR{cond}SH Rd,<地址> ;将指定地址上的有符号半字读入Rd
LDR{cond}H Rd,<地址> ;将指定地址上的半字数据读入Rd
STR{cond}H Rd,<地址> ;将Rd中的半字数据存入指定地址
注意:
1.有符号位半字/字节加载是指用符号位加载扩展到32位,无
符号半字加载是指用零扩展到32位;
2.半字读写的指定地址必须为偶数,否则将产生不可靠的结
果;
周立功单片机
• ARM存储器访问指令——单寄存器存储
•LDR和STR——半字和有符号字节加载/存储指令编码
指令执行的条件码
I为0 时,偏移量为
12 位 立 即 数 , 为 1
时,偏移量为寄存
器移位
P表示前/后变址
U表示加/减
W表示回写
为指令的寻址方式
Rd为源/目标寄存器
Rn为基址寄存器
L用于区别加载(L为1)
或存储(L为0)
S为1表示有符号访问,
为0表示无符号访问
H为1表示半字访问,为
0表示字节访问
周立功单片机
•LDR和STR指令应用示例:
1.加载/存储字和无符号字节指令
LDR R2,[R5] ;将R5指向地址的字数据存入R2
STR R1,[R0,#0x04] ;将R1的数据存储到R0+0x04地址
LDRB R3,[R2],#1 ;将R2指向地址的字节数据存入R3,R2=R2+1
STRB R6,[R7] ;将R7指向地址的字节数据存入R6
2.加载/存储半字和有符号字节指令
LDRSB R1,[R0,R3] ;将R0+R3地址上的字节数据存入R1,
;高24位用符号扩展
LDRH R6,[R2],#2 ;将R2指向地址的半字数据存入R6,高16位用0扩展
;读出后,R2=R2+2
STRH R1,[R0,#2]! ;将R1的半字数据保存到R0+2地址,
;只修改低2字节数据,R0=R0+2
• ARM存储器访问指令——单寄存器存储
周立功单片机
STM{cond}
{mode}
[Rn...] ← reglist,Rn
回写等
多寄存器存储STM{mode} Rn{!},reglist
LDM{cond}
{mode}
reglist←[Rn...],Rn
回写等
多寄存器加载LDM{mode} Rn{!},reglist
条件码位置操作说明助记符
• ARM存储器访问指令——多寄存器存取
多寄存器加载/存储指令可以实现在一组寄存器和一块连续的内存单元
之间传输数据。LDM为加载多个寄存器;STM为存储多个寄存器。允许一
条指令传送16个寄存器的任何子集或所有寄存器。它们主要用于现场保护、
数据复制、常数传递等。
周立功单片机
• ARM存储器访问指令——多寄存器存取
多寄存器加载/存储指令格式如下:
LDM{cond}<模式> Rn{!},reglist{^}
STM{cond}<模式> Rn{!},reglist{^}
�cond:指令执行的条件;
�模式:控制地址的增长方式,一共有8种模式;
�!:表示在操作结束后,将最后的地址写回Rn中;
�reglist :表示寄存器列表,可以包含多个寄存器,它们使用“,”隔开,如
{R1,R2,R6-R9},寄存器由小到大排列;
�^:加入该后缀后,进行数据传送且寄存器列表不包含PC时,加载/存储
的寄存器是用户模式下的,而不是当前模式的寄存器。若在LDM指令且寄
存器列表中包含有PC时使用,那么除了正常的多寄存器传送外,还将SPSR
也拷贝到CPSR中,这可用于异常处理返回。注意:该后缀不允许在用户模
式或系统模式下使用。
周立功单片机
• ARM存储器访问指令——多寄存器存取
•LDM和STM——多寄存器加载/存储指令编码
指令执行的条件码
S 对 应 于 指 令 中
的”^”符号
P表示前/后变址
U表示加/减
W表示回写
寄存器列表
Rn为基址寄存器
L用于区别加载(L为1)
或存储(L为0)
周立功单片机
• ARM存储器访问指令——多寄存器存取
多寄存器加载/存储指令的8种模式如下表所示,右边四种为堆栈
操作、左边四种为数据传送操作。
空递增堆栈EA每次传送前地址减4DB
堆栈操作数据块传送操作
满递增堆栈FA每次传送后地址减4DA
空递减堆栈ED每次传送前地址加4IB
满递减堆栈FD每次传送后地址加4IA
说明模式说明模式
进行数据复制时,先设置好源数据指针和目标指针,然后使用块
拷贝寻址指令 LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、
LDMDB/STMDB进行读取和存储 。
进行堆栈操作操作时,要先设置堆栈指针(SP),然后使用堆栈
寻 址 指 令 STMFD/LDMFD 、 STMED/LDMED 、 STMFA/LDMFA 和
STMEA/LDMEA实现堆栈操作。
周立功单片机
• ARM存储器访问指令——多寄存器存取
数据块传送指令操作
过程如右图所示,其
中R1为指令执行前的
基址寄存器,R1’则为
指令执行后的基址寄
存器。
R5
R6
R7
R1 �
R1’ �
指令STMIA R1!,{R5-R7}
4008H
4004H
4000H
4014H
4010H
400CH
R5
R6
R7R1 �
R1’ �
指令STMDA R1!,{R5-R7}
4008H
4004H
4000H
4014H
4010H
400CH
R5
R6
R7
R1 �
R1’ �
指令STMIB R1!,{R5-R7}
4008H
4004H
4000H
4014H
4010H
400CH
R5
R6
R7
R1’ �
R1 �
指令STMDB R1!,{R5-R7}
4008H
4004H
4000H
4014H
4010H
400CH
周立功单片机
• ARM存储器访问指令——多寄存器存取
满递增
满递减
空递增
空递减
说明
LDMIB
LDMDB
LDMIA
LDMDA
数据块传送
加载
空递减LDMEASTMFDSTMDB
空递增LDMEDSTMFASTMIB
满递增LDMFDSTMEASTMIA
满递减LDMFASTMEDSTMDA
说明
堆栈操作
出栈
堆栈操作
压栈
数据块传送
存储
;使用数据块传送指令进行堆栈操作
STMDA R0!,{R5-R6}
. . .
LDMIB R0!,{R5-R6}
;使用堆栈指令进行堆栈操作
STMED R0!,{R5-R6}
. . .
LDMED R0!,{R5-R6}
两段代码的执行结果是一样的,但是使用堆栈指令的压栈和出栈
操作编程很简单(只要前后一致即可),而使用数据块指令进行压栈
和出栈操作则需要考虑空与满、加与减对应的问题。
堆栈操作(详见“ 寻址方式堆栈寻址”)和数据块传送指令类
似,也有4种模式,它们之间的关系如下表所示:
周立功单片机
SWP{cond}BRd ← [Rn], [Rn] ← Rm
(Rn≠Rd或Rm)
寄存器和存储器字节
数据交换
SWPB Rd,Rm,Rn
SWP{cond}Rd ← [Rn], [Rn] ← Rm
(Rn≠Rd或Rm)
寄存器和存储器字数
据交换
SWP Rd,Rm,Rn
条件码位置操作说明助记符
• ARM存储器访问指令——寄存器和存储器交换指令
SWP指令用于将一个内存单元(该单元地址放在寄存器Rn中)的内容读
取到一个寄存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元
中。使用SWP可实现信号量操作。
指令格式如下:
SWP{cond}{B} Rd,Rm,[Rn]
其中,B为可选后缀,若有B,则交换字节,否则交换32位字;Rd用于
保存从存储器中读入的数据;Rm的数据用于存储到存储器中,若Rm与Rn
相同,则为寄存器与存储器内容进行交换;Rn为要进行数据交换的存储器
地址,Rn不能与Rd和Rm相同。
周立功单片机
• ARM存储器访问指令——寄存器和存储器交换指令
•SWP和SWPB——寄存器和存储器交换指令编码
指令执行的条件码
B用于区别无符号字
节(B为1)或字(B
为0)
Rm源寄存器
Rd目标寄存器
Rn为基址寄存器
•SWP指令应用示例:
SWP R1,R1,[R0] ;将R1的内容与R0指向的存储单元的内容进行交换
SWPB R1,R2,[R0] ;将R0指向的存储单元内的容读取一字节数据到R1中
;(高24位清零),并将R2的内容写入到该内存单元中
;(最低字节有效)
周立功单片机
ARM指令小节目录
1.指令格式
2.条件码
3.存储器访问指令
4.数据处理指令
5.乘法指令
分支指令
7.协处理器指令
8.杂项指令
9.伪指令
周立功单片机
指令集介绍
• ARM指令集——ARM数据处理指令
数据处理指令大致可分为3类:
�数据传送指令;
�算术逻辑运算指令;
�比较指令。
数据处理指令只能对寄存器的内容进行操作,
而不能对内存中的数据进行操作。所有ARM数据处
理指令均可选择使用S后缀,并影响状态标志。
周立功单片机
• ARM数据处理指令——指令编码
指令执行的条件码
I用于区别立即数(I
为1)和寄存器移位
(I为0)
opcode数据处理指
令操作码
第二操作数
Rd目标寄存器
Rn第一操作数寄存器
S设置条件码,与指令
中的S位对应
带进位加法ADC0101
带进位减法指令SBC0110
带进位逆向减法指令RSC0111
位测试指令TST1000
相等测试指令TEQ1001
比较指令CMP1010
负数比较指令CMN1011
逻辑或操作指令ORR1100
数据传送MOV1101
位清除指令BIC1110
数据非传送MVN1111
加法运算指令ADD0100
逆向减法指令RSB0011
减法运算指令SUB0010
逻辑异或操作指令EOR0001
逻辑与操作指令AND0000
说明指令助记符操作码
opcode操作码功能表
周立功单片机
MVN{cond}{S}Rd←(~operand2)数据非传送MVN Rd,operand2
MOV{cond}{S}Rd←operand2 数据传送MOV Rd,operand2
条件码位置操作说明助记符
• ARM数据处理指令——数据传送
周立功单片机
MVN{cond}{S}Rd←(~operand2)数据非传送MVN Rd,operand2
MOV{cond}{S}Rd←operand2 数据传送MOV Rd,operand2
条件码位置操作说明助记符
• ARM数据处理指令——数据传送
MOV指令将8位图立即数(参看“第2操作数:#immed_8r——常数表
达式 ”)或寄存器传送到目标寄存器(Rd),可用于移位运算等操作。
指令格式如下:
MOV{cond}{S} Rd,operand2
MOV指令举例如下:
MOV R1,#0x10 ;R1=0x10
MOV R0,R1 ;R0=R1
MOVS R3,R1,LSL #2 ;R3=R1<<2,并影响标志位
MOV PC,LR ;PC=LR,子程序返回
周立功单片机
指令集介绍
�#immed_8r ——常数表达式
该常数必须对应 8位位图,即一个8位的常数通过
循环右移偶数位得到。
循环右移10 位
0x12
0 0 0 1 0 0 1 0
0x00
0 0 0 0 0 0 0 0
0 x00
0 0 0 0 0 0 0 0
0 x00
0 0 0 0 0 0 0 0
0x00
0 0 0 0 0 0 0 0
0x00
0 0 0 0 0 0 0 0
0 x80
1 0 0 0 0 0 0 0
0 x04
0 0 0 0 0 1 0 0
8位常数
•ARM指令集——第2个操作数
周立功单片机
MVN{cond}{S}Rd←(~operand2)数据非传送MVN Rd,operand2
MOV{cond}{S}Rd←operand2 数据传送MOV Rd,operand2
条件码位置操作说明助记符
• ARM数据处理指令——数据传送
MVN指令将8位图立即数(参看“第2操作数:#immed_8r——常数表
达 式 ” ) 或 寄 存 器 ( operand2 ) 按 位 取 反 后 传 送 到 目 标 寄 存 器
(Rd),因为其具有取反功能,所以可以装载范围更广的立即数。指令格
式如下:
MVN{cond}{S} Rd,operand2
MVN指令举例如下:
MVN R1,#0xFF ;R1=0xFFFFFF00
MVN R1,R2 ;将R2取反,结果存到R1
周立功单片机
指令集介绍
ARM指令集——第2个操作数
�#immed_8r ——常数表达式
该常数必须对应8位位图,即一个8位的常数通过
循环右移偶数位得到。
循环右移10 位
0x12
0 0 0 1 0 0 1 0
0 x00
0 0 0 0 0 0 0 0
0x00
0 0 0 0 0 0 0 0
0 x00
0 0 0 0 0 0 0 0
0x00
0 0 0 0 0 0 0 0
0 x00
0 0 0 0 0 0 0 0
0x80
1 0 0 0 0 0 0 0
0 x04
0 0 0 0 0 1 0 0
8 位常数
周立功单片机
RSC{cond}{S}Rd←operand2-Rn-(NOT)Carry
带进位逆向减法
指令RSC Rd, Rn, operand2
SBC{cond}{S}Rd←Rn-operand2-(NOT)Carry带进位减法指令SBC Rd, Rn, operand2
ADC{cond}{S}Rd←Rn+operand2+Carry带进位加法ADC Rd, Rn, operand2
RSB{cond}{S}Rd←operand2-Rn逆向减法指令RSB Rd, Rn, operand2
SUB{cond}{S}Rd←Rn-operand2减法运算指令SUB Rd, Rn, operand2
ADD{cond}{S}Rd←Rn+operand2加法运算指令ADD Rd, Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——算术运算
周立功单片机
RSC{cond}{S}Rd←operand2-Rn-(NOT)Carry
带进位逆向减法
指令RSC Rd, Rn, operand2
SBC{cond}{S}Rd←Rn-operand2-(NOT)Carry带进位减法指令SBC Rd, Rn, operand2
ADC{cond}{S}Rd←Rn+operand2+Carry带进位加法ADC Rd, Rn, operand2
RSB{cond}{S}Rd←operand2-Rn逆向减法指令RSB Rd, Rn, operand2
SUB{cond}{S}Rd←Rn-operand2减法运算指令SUB Rd, Rn, operand2
ADD{cond}{S}Rd←Rn+operand2加法运算指令ADD Rd, Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——算术运算
加法运算指令——ADD指令将operand2的值与Rn的值相加,结果保存
到Rd寄存器。指令格式如下:
ADD{cond}{S} Rd,Rn,operand2
应用示例:
ADDS R1,R1,#1 ;R1=R1+1,并影响标志位
ADD R1,R1,R2 ;R1=R1+R2
周立功单片机
RSC{cond}{S}Rd←operand2-Rn-(NOT)Carry
带进位逆向减法
指令RSC Rd, Rn, operand2
SBC{cond}{S}Rd←Rn-operand2-(NOT)Carry带进位减法指令SBC Rd, Rn, operand2
ADC{cond}{S}Rd←Rn+operand2+Carry带进位加法ADC Rd, Rn, operand2
RSB{cond}{S}Rd←operand2-Rn逆向减法指令RSB Rd, Rn, operand2
SUB{cond}{S}Rd←Rn-operand2减法运算指令SUB Rd, Rn, operand2
ADD{cond}{S}Rd←Rn+operand2加法运算指令ADD Rd, Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——算术运算
减法运算指令——SUB指令用寄存器Rn减去operand2,结果保存到Rd
中。指令格式如下:
SUB{cond}{S} Rd,Rn,operand2
应用示例:
SUBS R0,R0,#1 ;R0=R0-1 ,并影响标志位
SUBS R2,R1,R2 ;R2=R1-R2 ,并影响标志位
周立功单片机
RSC{cond}{S}Rd←operand2-Rn-(NOT)Carry
带进位逆向减法
指令RSC Rd, Rn, operand2
SBC{cond}{S}Rd←Rn-operand2-(NOT)Carry带进位减法指令SBC Rd, Rn, operand2
ADC{cond}{S}Rd←Rn+operand2+Carry带进位加法ADC Rd, Rn, operand2
RSB{cond}{S}Rd←operand2-Rn逆向减法指令RSB Rd, Rn, operand2
SUB{cond}{S}Rd←Rn-operand2减法运算指令SUB Rd, Rn, operand2
ADD{cond}{S}Rd←Rn+operand2加法运算指令ADD Rd, Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——算术运算
逆向减法运算指令——RSB指令将operand2的值减去Rn,结果保存到
Rd中。指令格式如下:
RSB{cond}{S} Rd,Rn,operand2
应用示例:
RSB R3,R1,#0xFF00 ;R3=0xFF00-R1
RSBS R1,R2,R2,LSL #2 ;R1=(R2<<2)-R2=R2×3
周立功单片机
RSC{cond}{S}Rd←operand2-Rn-(NOT)Carry
带进位逆向减法
指令RSC Rd, Rn, operand2
SBC{cond}{S}Rd←Rn-operand2-(NOT)Carry带进位减法指令SBC Rd, Rn, operand2
ADC{cond}{S}Rd←Rn+operand2+Carry带进位加法ADC Rd, Rn, operand2
RSB{cond}{S}Rd←operand2-Rn逆向减法指令RSB Rd, Rn, operand2
SUB{cond}{S}Rd←Rn-operand2减法运算指令SUB Rd, Rn, operand2
ADD{cond}{S}Rd←Rn+operand2加法运算指令ADD Rd, Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——算术运算
带进位加法指令——ADC将operand2的值与Rn的值相加,再加上
CPSR中的C条件标志位,结果保存到Rd寄存器。指令格式如下:
ADC{cond}{S} Rd,Rn,operand2
应用示例(使用ADC实现64位加法,结果存于R1、R0中):
ADDS R0,R0,R2 ;R0等于低32位相加,并影响标志位
ADC R1,R1,R3 ;R1等于高32位相加,并加上低位进位
周立功单片机
RSC{cond}{S}Rd←operand2-Rn-(NOT)Carry
带进位逆向减法
指令RSC Rd, Rn, operand2
SBC{cond}{S}Rd←Rn-operand2-(NOT)Carry带进位减法指令SBC Rd, Rn, operand2
ADC{cond}{S}Rd←Rn+operand2+Carry带进位加法ADC Rd, Rn, operand2
RSB{cond}{S}Rd←operand2-Rn逆向减法指令RSB Rd, Rn, operand2
SUB{cond}{S}Rd←Rn-operand2减法运算指令SUB Rd, Rn, operand2
ADD{cond}{S}Rd←Rn+operand2加法运算指令ADD Rd, Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——算术运算
带进位减法指令——SBC用寄存器Rn减去operand2,再减去CPSR中的
C条件标志位的非(即若C标志清零,则结果减去1),结果保存到Rd中。指
令格式如下:
SBC{cond}{S} Rd,Rn,operand2
应用示例(使用SBC实现64位减法,结果存于R1、R0中):
SUBS R0,R0,R2 ; 低32位相减,并影响标志位
SBC R1,R1,R3 ;高32位相减,并减去低位借位
周立功单片机
RSC{cond}{S}Rd←operand2-Rn-(NOT)Carry
带进位逆向减法
指令RSC Rd, Rn, operand2
SBC{cond}{S}Rd←Rn-operand2-(NOT)Carry带进位减法指令SBC Rd, Rn, operand2
ADC{cond}{S}Rd←Rn+operand2+Carry带进位加法ADC Rd, Rn, operand2
RSB{cond}{S}Rd←operand2-Rn逆向减法指令RSB Rd, Rn, operand2
SUB{cond}{S}Rd←Rn-operand2减法运算指令SUB Rd, Rn, operand2
ADD{cond}{S}Rd←Rn+operand2加法运算指令ADD Rd, Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——算术运算
带进位逆向减法指令——RSC指令用寄存器operand2减去Rn,再减去
CPSR中的C条件标志位,结果保存到Rd中。指令格式如下:
RSC{cond}{S} Rd,Rn,operand2
应用示例(使用RSC指令实现求64位数值的负数 ):
RSBS R2,R0,#0
RSC R3,R1,#0
周立功单片机
BIC{cond}{S}Rd←Rn & (~operand2)位清除指令BIC Rd, Rn, operand2
EOR{cond}{S}Rd←Rn ^ operand2逻辑异或操作指令EOR Rd, Rn, operand2
AND{cond}{S}Rd←Rn & operand2逻辑与操作指令AND Rd, Rn, operand2
ORR{cond}{S}Rd←Rn | operand2逻辑或操作指令ORR Rd, Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——逻辑运算指令
周立功单片机
BIC{cond}{S}Rd←Rn & (~operand2)位清除指令BIC Rd, Rn, operand2
EOR{cond}{S}Rd←Rn ^ operand2逻辑异或操作指令EOR Rd, Rn, operand2
AND{cond}{S}Rd←Rn & operand2逻辑与操作指令AND Rd, Rn, operand2
ORR{cond}{S}Rd←Rn | operand2逻辑或操作指令ORR Rd, Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——逻辑运算指令
逻辑与操作指令——AND指令将operand2的值与寄存器Rn的值按位
作逻辑“与”操作,结果保存到Rd中。指令格式如下:
AND{cond}{S} Rd,Rn,operand2
应用示例:
ANDS R0,R0,#0x01 ;R0=R0&0x01,取出最低位数据
AND R2,R1,R3 ;R2=R1&R3
周立功单片机
BIC{cond}{S}Rd←Rn & (~operand2)位清除指令BIC Rd, Rn, operand2
EOR{cond}{S}Rd←Rn ^ operand2逻辑异或操作指令EOR Rd, Rn, operand2
AND{cond}{S}Rd←Rn & operand2逻辑与操作指令AND Rd, Rn, operand2
ORR{cond}{S}Rd←Rn | operand2逻辑或操作指令ORR Rd, Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——逻辑运算指令
逻辑或操作指令——ORR指令将operand2的值与寄存器Rn的值按位作
逻辑“或”操作,结果保存到Rd中。指令格式如下:
ORR{cond}{S} Rd,Rn, operand2
应用示例:
ORR R0,R0,#0x0F ;将R0的低4位置1
MOV R1,R2,LSR #24 ;使用ORR指令将R2的高8位
ORR R3,R1,R3,LSL #8 ;数据移入到R3低8位中
周立功单片机
BIC{cond}{S}Rd←Rn & (~operand2)位清除指令BIC Rd, Rn, operand2
EOR{cond}{S}Rd←Rn ^ operand2逻辑异或操作指令EOR Rd, Rn, operand2
AND{cond}{S}Rd←Rn & operand2逻辑与操作指令AND Rd, Rn, operand2
ORR{cond}{S}Rd←Rn | operand2逻辑或操作指令ORR Rd, Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——逻辑运算指令
逻辑异或操作指令——EOR指令将operand2的值与寄存器Rn的值按位
作逻辑“异或”操作,结果保存到Rd中。指令格式如下:
EOR{cond}{S} Rd,Rn, operand2
应用示例:
EOR R1,R1,#0x0F ;将R1的低4位取反
EOR R2,R1,R0 ;R2=R1^R0
EORS R0,R5,#0x01 ; 将R5和0x01进行逻辑异或,
;结果保存到R0,并影响标志位
周立功单片机
BIC{cond}{S}Rd←Rn & (~operand2)位清除指令BIC Rd, Rn, operand2
EOR{cond}{S}Rd←Rn ^ operand2逻辑异或操作指令EOR Rd, Rn, operand2
AND{cond}{S}Rd←Rn & operand2逻辑与操作指令AND Rd, Rn, operand2
ORR{cond}{S}Rd←Rn | operand2逻辑或操作指令ORR Rd, Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——逻辑运算指令
位清除指令——BIC指令将寄存器Rn的值与operand2的值的反码按位
作逻辑“与”操作,结果保存到Rd中。指令格式如下:
BIC{cond}{S} Rd,Rn, operand2
应用示例:
BIC R1,R1,#0x0F ;将R1的低4位清零,其它位不变
BIC R1,R2,R3 ;将R3的反码和R2相逻辑“与”,
;结果保存到R1中
周立功单片机
TEQ{cond}标志N、Z、C、V←Rn ^ operand2相等测试指令TEQ Rn, operand2
TST{cond}标志N、Z、C、V←Rn & operand2位测试指令TST Rn, operand2
CMP{cond}标志N、Z、C、V←Rn-operand2比较指令CMP Rn, operand2
CMN{cond}标 志 N 、 Z 、 C 、V←Rn+operand2负数比较指令CMN Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——比较指令
周立功单片机
TEQ{cond}标志N、Z、C、V←Rn ^ operand2相等测试指令TEQ Rn, operand2
TST{cond}标志N、Z、C、V←Rn & operand2位测试指令TST Rn, operand2
CMP{cond}标志N、Z、C、V←Rn-operand2比较指令CMP Rn, operand2
CMN{cond}标 志 N 、 Z 、 C 、V←Rn+operand2负数比较指令CMN Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——比较指令
比较指令——CMP指令将寄存器Rn的值减去operand2的值,根据操作
的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标
志来判断是否执行。指令格式如下:
CMP{cond} Rn, operand2
应用示例:
CMP R1,#10 ; R1与10比较,设置相关标志位
CMP R1,R2 ; R1与R2比较,设置相关标志位
周立功单片机
TEQ{cond}标志N、Z、C、V←Rn ^ operand2相等测试指令TEQ Rn, operand2
TST{cond}标志N、Z、C、V←Rn & operand2位测试指令TST Rn, operand2
CMP{cond}标志N、Z、C、V←Rn-operand2比较指令CMP Rn, operand2
CMN{cond}标 志 N 、 Z 、 C 、V←Rn+operand2负数比较指令CMN Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——比较指令
比较指令——CMP指令将寄存器Rn的值减去operand2的值,根据操作
的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标
志来判断是否执行。指令格式如下:
CMP{cond} Rn, operand2
注意:CMP指令与SUBS指令的区别在于CMP指令不保存运算结果。在进行
两个数据的大小判断时,常用CMP指令及相应的条件码来操作。
周立功单片机
TEQ{cond}标志N、Z、C、V←Rn ^ operand2相等测试指令TEQ Rn, operand2
TST{cond}标志N、Z、C、V←Rn & operand2位测试指令TST Rn, operand2
CMP{cond}标志N、Z、C、V←Rn-operand2比较指令CMP Rn, operand2
CMN{cond}标 志 N 、 Z 、 C 、V←Rn+operand2负数比较指令CMN Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——比较指令
负数比较指令——CMN指令使用寄存器Rn的值加上operand2的值,
根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应
的条件标志来判断是否执行。指令格式如下:
CMN{cond} Rn, operand2
应用示例:
CMN R0,#1 ; R0+1,判断R0是否为1的补码
;如果是,则设置Z标志位
周立功单片机
TEQ{cond}标志N、Z、C、V←Rn ^ operand2相等测试指令TEQ Rn, operand2
TST{cond}标志N、Z、C、V←Rn & operand2位测试指令TST Rn, operand2
CMP{cond}标志N、Z、C、V←Rn-operand2比较指令CMP Rn, operand2
CMN{cond}标 志 N 、 Z 、 C 、V←Rn+operand2负数比较指令CMN Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——比较指令
负数比较指令——CMN指令使用寄存器Rn的值加上operand2的值,
根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应
的条件标志来判断是否执行。指令格式如下:
CMP{cond} Rn, operand2
注意:CMN指令与ADDS指令的区别在于CMN指令不保存运算结果。
CMN指令可用于负数比较,比如CMN R0,#1指令则表示R0与-1比较,若
R0为-1(即1的补码),则Z置位;否则Z复位。
周立功单片机
TEQ{cond}标志N、Z、C、V←Rn ^ operand2相等测试指令TEQ Rn, operand2
TST{cond}标志N、Z、C、V←Rn & operand2位测试指令TST Rn, operand2
CMP{cond}标志N、Z、C、V←Rn-operand2比较指令CMP Rn, operand2
CMN{cond}标 志 N 、 Z 、 C 、V←Rn+operand2负数比较指令CMN Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——比较指令
位测试指令——TST指令将寄存器Rn的值与operand2的值按位作逻辑
“与”操作,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指
令根据相应的条件标志来判断是否执行。指令格式如下:
TST{cond} Rn, operand2
应用示例:
TST R0,#0x01 ; 判断R0的最低位是否为0
TST R1,#0x0F ; 判断R1的低4位是否为0
周立功单片机
TEQ{cond}标志N、Z、C、V←Rn ^ operand2相等测试指令TEQ Rn, operand2
TST{cond}标志N、Z、C、V←Rn & operand2位测试指令TST Rn, operand2
CMP{cond}标志N、Z、C、V←Rn-operand2比较指令CMP Rn, operand2
CMN{cond}标 志 N 、 Z 、 C 、V←Rn+operand2负数比较指令CMN Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——比较指令
位测试指令——TST指令将寄存器Rn的值与operand2的值按位作逻辑
“与”操作,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指
令根据相应的条件标志来判断是否执行。指令格式如下:
TST{cond} Rn, operand2
注意:TST指令与ANDS指令的区别在于TST指令不保存运算结果。TST指令
通常与EQ、NE条件码配合使用,当所有测试位均为0时,EQ有效,而只
要有一个测试位不为0,则NE有效。
周立功单片机
TEQ{cond}标志N、Z、C、V←Rn ^ operand2相等测试指令TEQ Rn, operand2
TST{cond}标志N、Z、C、V←Rn & operand2位测试指令TST Rn, operand2
CMP{cond}标志N、Z、C、V←Rn-operand2比较指令CMP Rn, operand2
CMN{cond}标 志 N 、 Z 、 C 、V←Rn+operand2负数比较指令CMN Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——比较指令
相等测试指令——TEQ指令将寄存器Rn的值与operand2的值按位作逻
辑“异或”操作,根据操作的结果更新CPSR中的相应条件标志位,以便后面
的指令根据相应的条件标志来判断是否执行。指令格式如下:
TEQ{cond} Rn, operand2
应用示例:
TEQ R0,R1 ; 比较R0与R1是否相等 (不影响V位和C位)
周立功单片机
TEQ{cond}标志N、Z、C、V←Rn ^ operand2相等测试指令TEQ Rn, operand2
TST{cond}标志N、Z、C、V←Rn & operand2位测试指令TST Rn, operand2
CMP{cond}标志N、Z、C、V←Rn-operand2比较指令CMP Rn, operand2
CMN{cond}标 志 N 、 Z 、 C 、V←Rn+operand2负数比较指令CMN Rn, operand2
条件码位置操作说明助记符
• ARM数据处理指令——比较指令
相等测试指令——TEQ指令将寄存器Rn的值与operand2的值按位作逻
辑“异或”操作,根据操作的结果更新CPSR中的相应条件标志位,以便后面
的指令根据相应的条件标志来判断是否执行。指令格式如下:
TEQ{cond} Rn, operand2
注意:TEQ指令与EORS指令的区别在于TEQ指令不保存运算结果。使用
TEQ进行相等测试时,常与 EQ、NE条件码配合使用。当两个数据相等
时,EQ有效;否则NE有效。
周立功单片机
ARM指令小节目录
1.指令格式
2.条件码
3.存储器访问指令
4.数据处理指令
5.乘法指令
分支指令
7.协处理器指令
8.杂项指令
9.伪指令
周立功单片机
指令集介绍
• ARM指令集——乘法指令
ARM7TDMI具有三种乘法指令,分别为:
�32××××32位乘法指令;
�32×××× 32位乘加指令;
�32×××× 32位结果为64位的乘/乘加指令。
周立功单片机
• ARM指令——乘法指令
•乘法指令编码
指令执行的条件码
Opcode乘法指令操
作码
S设置条件码,与指
令中的S位对应
Rm为被乘数寄存器
Rd/RdLo为MLA指令相
加的寄存器或64位乘法
指令的目标寄存器(低
32位)Rn/RdHi为目标寄存器或64位乘法指令
的目标寄存器(高
32位)
Rs为乘数寄存器
64位有符号乘加指令SMLAL111
64位有符号乘法指令SMULL110
64位无符号乘加指令UMLAL101
64位无符号乘法指令UMULL100
32位乘加指令MLA001
32位乘法指令MUL000
说明指令助记符操作码
opcode操作码功能表
周立功单片机
SMLAL{cond}{S}(RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)64位有符号乘加指令SMLAL RdLo,RdHi,Rm,Rs
SMULL{cond}{S}(RdLo,RdHi) ←Rm*Rs64位有符号乘法指令SMULL RdLo,RdHi,Rm,Rs
UMLAL{cond}{S}(RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)64位无符号乘加指令UMLAL RdLo,RdHi,Rm,Rs
UMULL{cond}{S}(RdLo,RdHi) ←Rm*Rs 64位无符号乘法指令UMULL RdLo,RdHi,Rm,Rs
MLA{cond}{S}Rd←Rm*Rs+Rn (Rd≠Rm)32位乘加指令MLA Rd,Rm,Rs,Rn
MUL{cond}{S}Rd←Rm*Rs (Rd≠Rm)32位乘法指令MUL Rd,Rm,Rs
条件码位置操作说明助记符
• ARM指令——乘法指令
周立功单片机
SMLAL{cond}{S}(RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)64位有符号乘加指令SMLAL RdLo,RdHi,Rm,Rs
SMULL{cond}{S}(RdLo,RdHi) ←Rm*Rs64位有符号乘法指令SMULL RdLo,RdHi,Rm,Rs
UMLAL{cond}{S}(RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)64位无符号乘加指令UMLAL RdLo,RdHi,Rm,Rs
UMULL{cond}{S}(RdLo,RdHi) ←Rm*Rs 64位无符号乘法指令UMULL RdLo,RdHi,Rm,Rs
MLA{cond}{S}Rd←Rm*Rs+Rn (Rd≠Rm)32位乘加指令MLA Rd,Rm,Rs,Rn
MUL{cond}{S}Rd←Rm*Rs (Rd≠Rm)32位乘法指令MUL Rd,Rm,Rs
条件码位置操作说明助记符
• ARM指令——乘法指令
32位乘法指令——MUL指令将Rm和Rs中的值相乘,结果的低32位保
存到Rd中。指令格式如下:
MUL{cond}{S} Rd,Rm,Rs
应用示例:
MUL R1,R2,R3 ;R1=R2×R3
MULS R0,R3,R7 ;R0=R3×R7,同时影响CPSR中的N位和Z位
周立功单片机
SMLAL{cond}{S}(RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)64位有符号乘加指令SMLAL RdLo,RdHi,Rm,Rs
SMULL{cond}{S}(RdLo,RdHi) ←Rm*Rs64位有符号乘法指令SMULL RdLo,RdHi,Rm,Rs
UMLAL{cond}{S}(RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)64位无符号乘加指令UMLAL RdLo,RdHi,Rm,Rs
UMULL{cond}{S}(RdLo,RdHi) ←Rm*Rs 64位无符号乘法指令UMULL RdLo,RdHi,Rm,Rs
MLA{cond}{S}Rd←Rm*Rs+Rn (Rd≠Rm)32位乘加指令MLA Rd,Rm,Rs,Rn
MUL{cond}{S}Rd←Rm*Rs (Rd≠Rm)32位乘法指令MUL Rd,Rm,Rs
条件码位置操作说明助记符
• ARM指令——乘法指令
32位乘加指令——MLA指令将Rm和Rs中的值相乘,再将乘积加上第3
个操作数,结果的低32位保存到Rd中。指令格式如下:
MLA{cond}{S} Rd,Rm,Rs,Rn
应用示例:
MLA R1,R2,R3,R0 ; R1=R2×R3+R0
周立功单片机
SMLAL{cond}{S}(RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)64位有符号乘加指令SMLAL RdLo,RdHi,Rm,Rs
SMULL{cond}{S}(RdLo,RdHi) ←Rm*Rs64位有符号乘法指令SMULL RdLo,RdHi,Rm,Rs
UMLAL{cond}{S}(RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)64位无符号乘加指令UMLAL RdLo,RdHi,Rm,Rs
UMULL{cond}{S}(RdLo,RdHi) ←Rm*Rs 64位无符号乘法指令UMULL RdLo,RdHi,Rm,Rs
MLA{cond}{S}Rd←Rm*Rs+Rn (Rd≠Rm)32位乘加指令MLA Rd,Rm,Rs,Rn
MUL{cond}{S}Rd←Rm*Rs (Rd≠Rm)32位乘法指令MUL Rd,Rm,Rs
条件码位置操作说明助记符
• ARM指令——乘法指令
64位无符号乘法指令——UMULL指令将Rm和Rs中的值作无符号数相
乘,结果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如
下:
UMULL{cond}{S} RdLo,RdHi,Rm,Rs
应用示例:
UMULL R0,R1,R5,R8 ; (R1、R0)=R5×R8
周立功单片机
SMLAL{cond}{S}(RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)64位有符号乘加指令SMLAL RdLo,RdHi,Rm,Rs
SMULL{cond}{S}(RdLo,RdHi) ←Rm*Rs64位有符号乘法指令SMULL RdLo,RdHi,Rm,Rs
UMLAL{cond}{S}(RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)64位无符号乘加指令UMLAL RdLo,RdHi,Rm,Rs
UMULL{cond}{S}(RdLo,RdHi) ←Rm*Rs 64位无符号乘法指令UMULL RdLo,RdHi,Rm,Rs
MLA{cond}{S}Rd←Rm*Rs+Rn (Rd≠Rm)32位乘加指令MLA Rd,Rm,Rs,Rn
MUL{cond}{S}Rd←Rm*Rs (Rd≠Rm)32位乘法指令MUL Rd,Rm,Rs
条件码位置操作说明助记符
• ARM指令——乘法指令
64位无符号乘加指令——UMLAL指令将Rm和Rs中的值作无符号数相
乘,64位乘积与RdHi、RdLo相加,结果的低32位保存到RdLo中,而高32
位保存到RdHi中。指令格式如下:
UMLAL{cond}{S} RdLo,RdHi,Rm,Rs
应用示例:
UMLAL R0,R1,R5,R8 ;(R1、R0)=R5×R8+(R1、R0)
周立功单片机
SMLAL{cond}{S}(RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)64位有符号乘加指令SMLAL RdLo,RdHi,Rm,Rs
SMULL{cond}{S}(RdLo,RdHi) ←Rm*Rs64位有符号乘法指令SMULL RdLo,RdHi,Rm,Rs
UMLAL{cond}{S}(RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)64位无符号乘加指令UMLAL RdLo,RdHi,Rm,Rs
UMULL{cond}{S}(RdLo,RdHi) ←Rm*Rs 64位无符号乘法指令UMULL RdLo,RdHi,Rm,Rs
MLA{cond}{S}Rd←Rm*Rs+Rn (Rd≠Rm)32位乘加指令MLA Rd,Rm,Rs,Rn
MUL{cond}{S}Rd←Rm*Rs (Rd≠Rm)32位乘法指令MUL Rd,Rm,Rs
条件码位置操作说明助记符
• ARM指令——乘法指令
64位有符号乘法指令——SMULL指令将Rm和Rs中的值作有符号数相
乘,结果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如
下:
SMULL{cond}{S} RdLo,RdHi,Rm,Rs
应用示例:
SMULL R2,R3,R7,R6 ; (R3、R2)=R7×R6
周立功单片机
SMLAL{cond}{S}(RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)64位有符号乘加指令SMLAL RdLo,RdHi,Rm,Rs
SMULL{cond}{S}(RdLo,RdHi) ←Rm*Rs64位有符号乘法指令SMULL RdLo,RdHi,Rm,Rs
UMLAL{cond}{S}(RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)64位无符号乘加指令UMLAL RdLo,RdHi,Rm,Rs
UMULL{cond}{S}(RdLo,RdHi) ←Rm*Rs 64位无符号乘法指令UMULL RdLo,RdHi,Rm,Rs
MLA{cond}{S}Rd←Rm*Rs+Rn (Rd≠Rm)32位乘加指令MLA Rd,Rm,Rs,Rn
MUL{cond}{S}Rd←Rm*Rs (Rd≠Rm)32位乘法指令MUL Rd,Rm,Rs
条件码位置操作说明助记符
• ARM指令——乘法指令
64位有符号乘加指令——SMLAL指令将Rm和Rs中的值作有符号数相
乘,64位乘积与RdHi、RdLo相加,结果的低32位保存到RdLo中,而高32
位保存到RdHi中。指令格式如下:
SMLAL{cond}{S} RdLo,RdHi,Rm,Rs
应用示例:
SMLAL R2,R3,R7,R6 ; (R3、R2)=R7×R6+(R3、R2)
周立功单片机
ARM指令小节目录
1.指令格式
2.条件码
3.存储器访问指令
4.数据处理指令
5.乘法指令
分支指令
7.协处理器指令
8.杂项指令
9.伪指令
周立功单片机
指令集介绍
• ARM指令集——分支指令
在ARM中有两种方式可以实现程序的跳转,一
种是使用分支指令直接跳转,另一种则是直接向PC
寄存器赋值实现跳转。 分支指令有以下三种:
�分支指令B;
�带链接的分支指令BL;
�带状态切换的分支指令BX。
周立功单片机
• ARM分支指令——指令编码
•分支指令B/BL指令编码格式
指令执行的条件码 L区别B指令(L为0)
和BL指令(L为1)
24 位 有 符 号 立 即 数
(偏移量)
•分支指令BX指令编码格式
指令执行的条件码 Rm目标地址寄存器,
该寄存器装载跳转地址
周立功单片机
BX{cond}PC←label,切换处理器状态带状态切换的分支指令BX Rm
BL{cond}LR←PC-4,PC←label带链接的分支指令BL label
B{cond}PC←label分支指令B label
条件码位置操作说明助记符
• ARM指令——分支指令
周立功单片机
BX{cond}PC←label,切换处理器状态带状态切换的分支指令BX Rm
BL{cond}LR←PC-4,PC←label带链接的分支指令BL label
B{cond}PC←label分支指令B label
条件码位置操作说明助记符
• ARM指令——分支指令
分支指令——B指令,该指令跳转范围限制在当前指令的±32M字节地
址内(ARM指令为字对齐,最低2位地址固定为0)。指令格式如下:
B{cond} Label
应用示例:
B WAITA ; 跳转到WAITA标号处
B 0x1234 ; 跳转到绝对地址0x1234处
周立功单片机
BL Label
xxx
xxxLabel
xxx
MOV PC,LR
Addr1
Addr2 xxx
xxx
LR
PC
BX{cond}PC←label,切换处理器状态带状态切换的分支指令BX Rm
BL{cond}LR←PC-4,PC←label带链接的分支指令BL label
B{cond}PC←label分支指令B label
条件码位置操作说明助记符
• ARM指令——分支指令
带链接的分支指令——BL指令适用于子程序调用,使用该指令后,下
一条指令的地址被拷贝到R14(即LR) 连接寄存器中,然后跳转到指定地址运
行程序。跳转范围限制在当前指令的±32M字节地址内。指令格式如下:
BL{cond} Label
Addr1Label
Addr2
Addr2
1.当程序执行到BL跳转指
令时,硬件将下一条指
令的地址Addr2装入LR
寄存器,并把跳转地址
装入程序计数器(PC)
2. 程序跳转到目标地址
Label继续执行,当子程
序执行结束后,将LR寄
存器内容存入PC,返回
调用函数继续执行
周立功单片机
BX{cond}PC←label,切换处理器状态带状态切换的分支指令BX Rm
BL{cond}LR←PC-4,PC←label带链接的分支指令BL label
B{cond}PC←label分支指令B label
条件码位置操作说明助记符
• ARM指令——分支指令
带链接的分支指令——BL指令适用于子程序调用,使用该指令后,下
一条指令的地址被拷贝到R14(即LR) 连接寄存器中,然后跳转到指定地址运
行程序。跳转范围限制在当前指令的±32M字节地址内。指令格式如下:
BL{cond} Label
应用示例:
BL DELAY ; 调用子程序DELAY
周立功单片机
BX{cond}PC←label,切换处理器状态带状态切换的分支指令BX Rm
BL{cond}LR←PC-4,PC←label带链接的分支指令BL label
B{cond}PC←label分支指令B label
条件码位置操作说明助记符
• ARM指令——分支指令
带状态切换的分支指令——BX指令,该指令可以根据跳转地址(Rm)
的最低位来切换处理器状态。其跳转范围限制在当前指令的 ±32M字节地
址内(ARM指令为字对齐,最低2位地址固定为0)。指令格式如下:
BX{cond} Rm
处理器状态CPSR标志T位
Thumb11
ARM00
跳转后跳转地址
Rm[0]
周立功单片机
BX{cond}PC←label,切换处理器状态带状态切换的分支指令BX Rm
BL{cond}LR←PC-4,PC←label带链接的分支指令BL label
B{cond}PC←label分支指令B label
条件码位置操作说明助记符
• ARM指令——分支指令
带状态切换的分支指令——BX指令,该指令可以根据跳转地址(Rm)
的最低位来切换处理器状态。其跳转范围限制在当前指令的 ±32M字节地
址内(ARM指令为字对齐,最低2位地址固定为0)。指令格式如下:
BX{cond} Rm
应用示例:
ADRL R0,ThumbFun+1 ;将Thumb程序的入口地址加1存入R0
BX R0 ; 跳转到R0指定的地址,
;并根据R0的最低位来切换处理器状态
周立功单片机
ARM指令小节目录
1.指令格式
2.条件码
3.存储器访问指令
4.数据处理指令
5.乘法指令
分支指令
7.协处理器指令
8.杂项指令
9.伪指令
周立功单片机
指令集介绍
• ARM指令集——协处理器指令
ARM内核支持协处理器操作,协处理器的控制
要通过协处理器命令实现。
ARM内核与协处理器的关系
ARM内核 协处理器A 协处理器B
握手信号
数据地址总线
…
周立功单片机
MCR{cond}取决于协处理器协处理器寄存器到ARM寄存器到的数据传送指令
MRC coproc,opcode1,Rd,CRn,
CRm{,opcode2}
MCR{cond}取决于协处理器ARM寄存器到协处理器寄存器的数据传送指令
MCR coproc,opcode1,Rd,CRn,
CRm{,opcode2}
STC{cond}{L}取决于协处理器协处理器数据写入指令STC{L} coproc, CRd,<地址>
LDC{cond}{L}取决于协处理器协处理器数据读取指令LDC{L} coproc, CRd,<地址>
CDP{cond}取决于协处理器协处理器数据操作指令
CDP coproc,opcode1,CRd,CRn,
CRm{,opcode2}
条件码位置操作说明助记符
• ARM指令——协处理器指令
周立功单片机
• ARM协处理器指令——数据操作指令
ARM处理器通过CDP指令通知ARM协处理器执行特定的操作。该操作
由协处理器完成,即对命令的参数的解释与协处理器有关,指令的使用取
决于协处理器。若协处理器不能成功地执行该操作,将产生未定义指令异
常中断。指令格式如下:
指令执行的条件码
协处理器的特定操作码
存放第1个源操作数
的协处理器寄存器
作为目标寄存器的协处
理器寄存器
指令操作的协处理器名
可选的协处理器特定
操作码
存放第2个源操作数
的协处理器寄存器
CDP{cond} coproc,opcode1,CRd,CRn,CRm{,opcode2}
CDP{cond} coproc,opcode1,CRd,CRn,CRm{,opcode2}
数据操作指令编码
周立功单片机
• ARM协处理器指令——数据操作指令
ARM处理器通过CDP指令通知ARM协处理器执行特定的操作。该操作
由协处理器完成,即对命令的参数的解释与协处理器有关,指令的使用取
决于协处理器。若协处理器不能成功地执行该操作,将产生未定义指令异
常中断。指令格式如下:
CDP{cond} coproc,opcode1,CRd,CRn,CRm{,opcode2}
应用示例:
CDP p7,0,c0,c2,c3,0 ;对协处理器7操作,操作码为0,
;可选操作码为0
CDP p6,1,c3,c4,c5 ;对协处理器6操作,操作码为1
周立功单片机
• ARM协处理器指令——数据存取指令
协处理器数据存取指令LDC/STC指令可以将某一连续内存单元的数据
读取到协处理器的寄存器中,或者将协处理器的寄存器数据写入到某一连
续的内存单元中,传送的字数由协处理器来控制。若协处理器不能成功地
执行该操作,将产生未定义指令异常中断。
LDC{cond}{L} coproc, CRd,<地址>
数据存储指令格式
STC{cond}{L} coproc, CRd,<地址>
数据读取指令格式
周立功单片机
• ARM协处理器指令——数据存取指令
协处理器数据存取指令LDC/STC指令可以将某一连续内存单元的数据
读取到协处理器的寄存器中,或者将协处理器的寄存器数据写入到某一连
续的内存单元中,传送的字数由协处理器来控制。若协处理器不能成功地
执行该操作,将产生未定义指令异常中断。
数据操作指令编码
指令执行的条件码
P表示前/后变址
U表示加/减
W表示回写
N表示数据大小
L表示该指令是读取
(为0)还是写入
(为1)
8位立即数偏移
协处理器编号
协处理器中的目标
寄存器
基址寄存器
周立功单片机
• ARM协处理器指令——数据存取指令
协处理器数据存取指令LDC/STC指令可以将某一连续内存单元的数据
读取到协处理器的寄存器中,或者将协处理器的寄存器数据写入到某一连
续的内存单元中,传送的字数由协处理器来控制。若协处理器不能成功地
执行该操作,将产生未定义指令异常中断。
应用示例:
LDC p5,c2,[R2,#4] ;读取R2+4指向的内存单元的数据,
;传送到协处理器p5的c2寄存器中
STC p5,c1,[R0] ;将协处理器p5的C1寄存器内数据
;传送到R0指向的内存单元
数据操作指令编码
周立功单片机
• ARM协处理器指令——寄存器传送指令
如果需要在ARM处理器中的寄存器与协处理器中的寄存器之间进行数
据传送,那么可以使用MCR/MRC指令。MCR指令用于将ARM处理器的寄
存器中的数据传送到协处理器的寄存器。MRC指令用于将协处理器的寄存
器中的数据传送到ARM处理器的寄存器中。若协处理器不能成功地执行该
操作,将产生未定义指令异常中断。
MCR{cond} coproc,opcode1,Rd,CRn,CRm{,opcode2}
MRC指令格式(协处理器� ARM )
MCR指令格式(ARM�协处理器)
MRC{cond} coproc,opcode1,Rd,CRn,CRm{,opcode2}
周立功单片机
• ARM协处理器指令——寄存器传送指令
如果需要在ARM处理器中的寄存器与协处理器中的寄存器之间进行数
据传送,那么可以使用MCR/MRC指令。MCR指令用于将ARM处理器的寄
存器中的数据传送到协处理器的寄存器。MRC指令用于将协处理器的寄存
器中的数据传送到ARM处理器的寄存器中。若协处理器不能成功地执行该
操作,将产生未定义指令异常中断。
寄存器传送指令编码
指令执行的条件码
表示协处理器特定操
作码
L 表 示 数 据 是 传 入
ARM(为0)还是传
入协处理器(为1)
存放第2 个操作数
的协处理器寄存器
在ARM中的寄存器
存放第1个操作数的
协处理器寄存器
协处理器编号
可选的协处理器特
定操作码
周立功单片机
• ARM协处理器指令——寄存器传送指令
如果需要在ARM处理器中的寄存器与协处理器中的寄存器之间进行数
据传送,那么可以使用MCR/MRC指令。MCR指令用于将ARM处理器的寄
存器中的数据传送到协处理器的寄存器。MRC指令用于将协处理器的寄存
器中的数据传送到ARM处理器的寄存器中。若协处理器不能成功地执行该
操作,将产生未定义指令异常中断。
寄存器传送指令编码
应用示例:
MCR p6,2,R7,c1,c2 ;将ARM中的R7寄存器内容传递
; 到协处理器6的C1和C2寄存器
MRC p5,2,R2,c3,c2 ;将协处理器5的C3和C2寄存器
;内容传递到ARM中的R2寄存器
周立功单片机
ARM指令小节目录
1.指令格式
2.条件码
3.存储器访问指令
4.数据处理指令
5.乘法指令
分支指令
7.协处理器指令
8.杂项指令
9.伪指令
周立功单片机
指令集介绍
• ARM指令集——杂项指令
ARM指令集中有三条指令作为杂项指令,实际
上这三条指令非常重要。它们如下所示:
MSR{cond}
psr_fields←Rd/#immed_8r,psr为
CPSR或SPSR写状态寄存器指令
MSR psr_fields,
Rd/#immed_8r
MRS{cond}Rd←psr,psr为CPSR或SPSR读状态寄存器指令MRS Rd,psr
SWI{cond}产生软中断,处理器进入管理模式软中断指令SWI immed_24
条件码位置操作说明助记符
周立功单片机
• ARM杂项指令——软中断指令
SWI指令用于产生软中断,从而实现在从户模式变换到管理模式,并
且将CPSR保存到管理模式的SPSR中,然后程序跳转到SWI异常入口。在其
它模式下也可使用SWI指令,处理器同样地切换到管理模式。
该指令主要用于用户程序调用操作系统的系统服务,操作系统在 SWI
异常处理程序中进行相应的系统服务。
SWI{cond} immed_24
SWI指令格式
SWI指令编码
指令执行的条件码 指令传递的参数(24位立即数)
周立功单片机
• ARM杂项指令——软中断指令
根据SWI指令传递的参数SWI异常处理程序可以作出相应的处理。SWI
指令传递参数有以下两种方法,
�指令中的24位立即数指定了用户请求的服务类型,参数通过通用寄存
器传递。
MOV R0,#34 ;设置子功能号为34
SWI 12 ;调用12号软中断
�指令中的24位立即数被忽略,用户请求的服务类型由寄存器R0的值
决定,参数通过其它的通用寄存器传递。
MOV R0,#12 ;调用12号软中断
MOV R1,#34 ;设置子功能号为34
SWI 0
周立功单片机
• ARM杂项指令——软中断指令
在SWI异常中断处理程序中,取出SWI指令中立即数的步骤为:
�首先确定引起软中断的SWI指令是ARM指令还是Thumb指令,这可通
过对SPSR访问得到;
�然后取得该SWI指令的地址,这可通过访问LR寄存器得到;
�接着读出该SWI指令,分解出立即数。
SWI_Handler
STMFD SP!, {R0-R3, R12, LR} ; 现场保护
MRS R0, SPSR ; 读取SPSR
STMFD SP!, {R0} ; 保存SPSR
TST R0, #0x20 ; 测试T标志位
LDRNEH R0, [LR,#-2] ; 若是Thumb指令,读取指令码(16位)
BICNE R0, R0, #0xFF00 ; 取得Thumb指令的8位立即数
LDREQ R0, [LR,#-4] ; 若是ARM指令,读取指令码(32位)
BICEQ R0, R0, #0xFF000000 ; 取得ARM指令的24位立即数
...
LDMFD SP!, {R0-R3, R12, PC}^; SWI异常中断返回
周立功单片机
• ARM杂项指令——状态寄存器读指令
在ARM处理器中,只有MRS指令可以对状态寄存器CPSR和SPSR进行读
操作。通过读CPSR可以了解当前处理器的工作状态。读SPSR寄存器可以了
解到进入异常前的处理器状态。
MRS{cond} Rd,psr
MRS指令格式
指令对应编码
指令执行的条件码 目标寄存器,不能
为R15
区别CPSR(为0)
和SPSR(为1)寄存
器
周立功单片机
• ARM杂项指令——状态寄存器读指令
在ARM处理器中,只有MRS指令可以对状态寄存器CPSR和SPSR进行读
操作。通过读CPSR可以了解当前处理器的工作状态。读SPSR寄存器可以了
解到进入异常前的处理器状态。
MRS{cond} Rd,psr
MRS指令格式
应用示例:
MRS R1,CPSR ; 将CPSR状态寄存器读取,保存到R1中
MRS R2,SPSR ; 将SPSR状态寄存器读取,保存到R2中
周立功单片机
• ARM杂项指令——状态寄存器写指令
在ARM处理器中,只有MSR指令可以对状态寄存器CPSR和SPSR进行写
操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操
作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。
MSR{cond} psr_fields,#immed_8rMSR指令格式1
MSR{cond} psr_fields,RmMSR指令格式2
指令执行的条件码
CPSR或SPSR
指定传送的区域,可以为以下字母
(必须小写)的一个或者组合:
c 控制域屏蔽字节(psr[7..0])
x 扩展域屏蔽字节(psr[15..8])
s 状态域屏蔽字节(psr[23..16])
f 标志域屏蔽字节(psr[31..24])
保存要传送到状态
寄存器指定域数据
的源寄存器
要传送到状态寄存
器指定域的立即数
周立功单片机
保存要传送到状态
寄存器指定域数据
的源寄存器
• ARM杂项指令——状态寄存器写指令
在ARM处理器中,只有MSR指令可以对状态寄存器CPSR和SPSR进行写
操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操
作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。
指令执行的条件码
CPSR或SPSR
指定传送的区域,可以为以下字母
(必须小写)的一个或者组合:
c 控制域屏蔽字节(psr[7..0])
x 扩展域屏蔽字节(psr[15..8])
s 状态域屏蔽字节(psr[23..16])
f 标志域屏蔽字节(psr[31..24])
要传送到状态寄存
器指定域的立即数
MSR指令1编码
MSR指令2编码
Rotate :
立即数对齐
8_bit_immediate :
8位立即数
周立功单片机
(1)
(2)
(3)
(4)
• ARM杂项指令——状态寄存器写指令
在ARM处理器中,只有MSR指令可以对状态寄存器CPSR和SPSR进行写
操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操
作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。
应用示例1:
;子程序:使能IRQ中断
ENABLE_IRQ
MRS R0, CPSR
BIC R0, R0,#0x80
MSR CPSR_c,R0
MOV PC,LR
应用示例2:
;子程序:禁能IRQ中断
DISABLE_IRQ
MRS R0 CPSR
ORR R0, R0,#0x80
MSR CPSR_c,R0
MOV PC,LR
1.将CPSR寄存器内容读出到R0;
2.修改对应于CPSR中的I控制位;
3.将修改后的值写回 CPSR寄存器
的对应控制域;
4.返回上一层函数;
周立功单片机
ARM指令小节目录
1.指令格式
2.条件码
3.存储器访问指令
4.数据处理指令
5.乘法指令
分支指令
7.协处理器指令
8.杂项指令
9.伪指令
周立功单片机
指令集介绍
• ARM伪指令
ARM伪指令不属于ARM指令集中的指令,是
为了编程方便而定义的。伪指令可以像其它ARM指
令一样使用,但在编译时这些指令将被等效的ARM
指令代替。ARM伪指令有四条,分别为ADR伪指令、
ADRL伪指令、LDR伪指令、NOP伪指令。
周立功单片机
• ARM伪指令——小范围的地址读取
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址
值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替
换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该
ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
ADR{cond} register,expr
ADR伪指令格式
指令执行的条件码 加载的目标寄存器 地址表达式
地址表达式expr的取指范围:
�当地址值不是字对齐时,其取指范围为-255~255;
�当地址值是字对齐时,其取指范围为-1020~1020;
�当地址值是16字节对齐时,其取指范围将更大。
周立功单片机
• ARM伪指令——小范围的地址读取
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址
值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替
换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该
ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
...
ADR R0,Delay
...
Delay
MOV R0,r14
...
应用示例(源程序):
使用伪指令将程序标号
Delay的地址存入R0
周立功单片机
...
0x20 ADD r1,pc,#0x3c
...
...
0x64 MOV r0,r14
...
• ARM伪指令——小范围的地址读取
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址
值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替
换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该
ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
...
ADRL R0,Delay
...
Delay
MOV R0,r14
...
应用示例(源程序): 编译后的反汇编代码:
使用伪指令将程序标号
Delay的地址存入R0
地址 程序代码
周立功单片机
• ARM伪指令——小范围的地址读取
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址
值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替
换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该
ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
...
ADRL R0,Delay
...
Delay
MOV R0,r14
...
应用示例(源程序):
...
0x20 ADD r1,pc,#0x3c
...
...
0x64 MOV r0,r14
...
编译后的反汇编代码:
使用伪指令将程序标号
Delay的地址存入R0 ADR伪指令被汇编成一条指令
周立功单片机
• ARM伪指令——小范围的地址读取
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址
值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替
换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该
ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
应用示例2(查表):
ADR R0,DISP_TAB ; 加载转换表地址
LDRB R1,[R0,R2] ; 使用R2作为参数,进行查表
…
DISP_TAB
DCB 0xC0,0xF9,0xA4,0xB0,0x99, 0x92,0x82,0xF8
周立功单片机
• ARM伪指令——中等范围的地址读取
ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地
址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址 。在汇编编
译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能
用两条指令实现,则产生错误,编译失败。
ADRL{cond} register,expr
ADRL伪指令格式
指令执行的条件码 加载的目标寄存器 地址表达式
地址表达式expr的取指范围:
�当地址值不是字对齐时,其取指范围为-64K~64K;
�当地址值是字对齐时,其取指范围为-256K~256K;
�当地址值是16字节对齐时,其取指范围将更大。
周立功单片机
• ARM伪指令——中等范围的地址读取
ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地
址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址 。在汇编编
译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能
用两条指令实现,则产生错误,编译失败。
...
ADRL R0,Delay
...
Delay
MOV R0,r14
...
应用示例(源程序):
使用伪指令将程序标号
Delay的地址存入R0
周立功单片机
• ARM伪指令——中等范围的地址读取
ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地
址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址 。在汇编编
译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能
用两条指令实现,则产生错误,编译失败。
...
ADRL R0,Delay
...
Delay
MOV R0,r14
...
应用示例(源程序):
...
0x20 ADD r1,pc,#40
0x24 ADD r1,r1,#0
...
0x68 MOV r0,r14
...
编译后的反汇编代码:
使用伪指令将程序标号
Delay的地址存入R0
地址 程序代码
周立功单片机
• ARM伪指令——中等范围的地址读取
ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地
址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址 。在汇编编
译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能
用两条指令实现,则产生错误,编译失败。
...
ADRL R0,Delay
...
Delay
MOV R0,r14
...
应用示例(源程序):
...
0x20 ADD r1,pc,#40
0x24 ADD r1,r1,#0
...
0x68 MOV r0,r14
...
编译后的反汇编代码:
使用伪指令将程序标号
Delay的地址存入R0
ADRL伪指令被汇编成两条指令,尽
管第2条指令并没有意义
周立功单片机
• ARM伪指令——大范围的地址读取
LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇
编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的
常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指
令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令
从文字池读出常量。
LDR{cond} register,=expr
LDR伪指令格式
指令执行的条件码 加载的目标寄存器 基于PC的地址表达式
或外部表达式
周立功单片机
• ARM伪指令——大范围的地址读取
LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇
编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的
常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指
令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令
从文字池读出常量。
应用示例(源程序):
...
LDR R1,=InitStack
...
InitStack
MOV R0, LR
...
使用伪指令将程序标号
InitStack的地址存入R1
周立功单片机
• ARM伪指令——大范围的地址读取
LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇
编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的
常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指
令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令
从文字池读出常量。
应用示例(源程序): 编译后的反汇编代码:
...
LDR R1,=InitStack
...
InitStack
MOV R0, LR
...
...
0x60 LDR R1,0xb4
...
0x64 MOV R0, LR
...
0xb4 DCD 0x64
使用伪指令将程序标号
InitStack的地址存入R1
地址 程序代码
周立功单片机
• ARM伪指令——大范围的地址读取
LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇
编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的
常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指
令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令
从文字池读出常量。
应用示例(源程序): 编译后的反汇编代码:
...
LDR R1,=InitStack
...
InitStack
MOV R0, LR
...
...
0x60 LDR R1,0xb4
...
0x64 MOV R0, LR
...
0xb4 DCD 0x64
使用伪指令将程序标号
InitStack的地址存入R1
LDR伪指令被汇编成一条LDR指令,
并在文字池中定义了一个常量,该
常量为InitStack标号的地址
周立功单片机
• ARM伪指令——大范围的地址读取
LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇
编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的
常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指
令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令
从文字池读出常量。
注意:
1.从指令位置到文字池的偏移量必须小于4KB;
2.与ARM指令的LDR相比,伪指令的LDR的参数有“=”号。
周立功单片机
• ARM伪指令——空操作伪指令
NOP伪指令在汇编时将会被代替成ARM中的空操作,比如可能是
“MOV R0,R0”指令等。NOP可用于延时操作。
NOP
NOP伪指令格式
应用示例(延时子程序):
Delay
NOP ;空操作
NOP
NOP
SUBS R1,R1,#1 ;循环次数减一
BNE Delay ;如果循环没有结束,跳转Delay继续
MOV PC,LR ;子程序返回
周立功单片机
第4章 目录
�处理器寻址方式
�2.指令集介绍
� ARM指令集
� Thumb指令集
周立功单片机
指令集介绍
• Thumb指令
Thumb指令集可以看作是ARM指令压缩形式的
子集,它是为减小代码量而提出的,具有 16位的代
码密度。Thumb指令体系不完整,只支持通用功能。
必要时仍需要使用ARM指令,如进入异常时。
说明:Thumb指令的格式与使用方式与ARM指令集类似,而且
使用并不是很频繁,建议这部分内容选修。
周立功单片机
• 简单的Thumb程序
; 功能:使用BX指令切换处理器状态
AREA Example8,CODE,READONLY
ENTRY
CODE32
ARM_CODE
ADR R0,THUMB_CODE+1
BX R0 ; 跳转并切换处理器状态
CODE16
THUMB_CODE
MOV R0,#10 ; R0 = 10
MOV R1,#20 ; R1 = 20
ADD R0,R1 ; R0 = R0+R1
B .
END
在Thumb程序段之前
要用CODE16声明。
周立功单片机
Thumb指令小节目录
指令集与ARM指令集的区别
2.存储器访问指令
3.数据处理指令
4.分支指令
5.杂项指令
6.伪指令
周立功单片机
Thumb指令小节目录
指令集与ARM指令集的区别
2.存储器访问指令
3.数据处理指令
4.分支指令
5.杂项指令
6.伪指令
周立功单片机
指令集介绍
• Thumb指令集与ARM指令集的区别
Thumb指令集较ARM指令集有如下限制:
�只有B指令可以条件执行,其它指令都不能条件执行;
�分支指令的跳转范围有更多限制;
�数据处理指令的操作结果必须放入其中一个;
�单寄存器访问指令,只能操作R0~R7;
�LDM和STM指令可以对R0~R7的任何子集进行操作;
周立功单片机
Thumb指令小节目录
指令集与ARM指令集的区别
2.存储器访问指令
3.数据处理指令
4.分支指令
5.杂项指令
6.伪指令
周立功单片机
指令集介绍
• Thumb存储器访问指令
无Rd←[Rn,Rm],Rd、Rn、Rm为R0~R7加载有符号字节数据LDRSB Rd,addressing
无Rd←[Rn,Rm],Rd、Rn、Rm为R0~R7加载有符号半字数据LDRSH Rd,addressing
无Rd ← [Rn,#immed_5 ×1],Rd、Rn为R0~R7
加载/存储无符号字
节数据
LDRB/STRB
Rd,addressing
无Rd ← [Rn,#immed_5 ×2],Rd、Rn为R0~R7
加载/存储无符号半
字数据
LDRH/STRH
Rd,addressing
无Rd ← [Rn,#immed_5 ×4],Rd、Rn为R0~R7加载/存储字数据LDR/STR Rd,addressing
影响标志操作说明助记符
单寄存器访问指令
周立功单片机
指令集介绍
• Thumb存储器访问指令
•LDR和STR——加载/存储指令
根据指令的寻址方式不同,可以分为以下三类:
�立即数偏移寻址;
�寄存器偏移寻址;
�PC或SP相对偏移寻址;
周立功单片机
• 单寄存器访问指令——立即数偏移寻址
以这种寻址方式对存储器访问时,存储器的地址以
一个寄存器的内容为基址,在偏移一个立即数后指明。
指令格式如下:
LDR Rd,[Rn,#immed_5×4] ;加载内存中的字数据到寄存器Rd中
STR Rd,[Rn,#immed_5×4] ;将Rd中的字数据存储到指定地址的内存中
LDRH Rd,[Rn,#immed_5×2] ;加载内存中的半字数据到寄存器Rd的低16位中
STRH Rd,[Rn,#immed_5×2] ;存储Rd中的低16位半字数据到指定的内存单元
LDRB Rd,[Rn,#immed_5×1] ;加载内存中的字节数据到寄存器Rd中
STRB Rd,[Rn,#immed_5×1] ;存储Rd中的低8位字节数据到指定的内存单元
其中:Rd 表示加载或存储的寄存器。必须为R0~R7。
Rn 表示基址寄存器。必须为R0~R7。
immed_5×N 表示立即数偏移量,其取值范围为(0~31)×N。
周立功单片机
• 单寄存器访问指令——立即数偏移指令编码
指令执行的条件码:
0110b:LDR/STR指令;
1000b:LDRH/STRH指令;
0111b:LDRB/STRB指令;
L用于区别加载(L为1)
或存储(L为0)
Immed_5:5位无符号
立即数偏移
Rn:基址寄存器
Rd:源或目标寄存器
周立功单片机
• 单寄存器访问指令——立即数偏移寻址
注意:进行字数据访问时,必须保证传送地址为32位对
齐。进行半字数据访问时,必须保证传送地址为16位对
齐。
应用示例:
LDR R0,[R1,#0x4]
STR R3,[R4]
LDRH R5,[R0,#0x02]
STRH R1,[R0,#0x08]
LDRB R3,[R6,#20]
STRB R1,[R0,#31]
周立功单片机
• 单寄存器访问指令——寄存器偏移寻址
这种寻址方式是以一个寄存器的内容为基址,以另
一个寄存器的内容为偏移量,两者相加作为存储器的地
址。指令格式如下:
LDR Rd,[Rn,Rm] ;加载一个字数据
STR Rd,[Rn,Rm] ;存储一个字数据
LDRH Rd,[Rn,Rm] ;加载一个无符号半字数据
STRH Rd,[Rn,Rm] ;存储一个无符号半字数据
LDRB Rd,[Rn,Rm] ;加载一个无符号字节数据
STRB Rd,[Rn,Rm] ;存储一个无符号字节数据
LDRSH Rd,[Rn,Rm] ;加载一个有符号半字数据
LDRSB Rd,[Rn,Rm] ;存储一个有符号半字数据
其中:Rd 表示加载或存储的寄存器。必须为R0~R7。
Rn 表示基址寄存器。必须为R0~R7。
Rm 表示内含数偏移量的寄存器,必须为R0~R7 。
周立功单片机
• 单寄存器访问指令——寄存器偏移指令编码
指令执行的条件码:
00b:LDR/STR指令;
01b:LDRH/STRH指令;
10b:LDRB/STRB指令;
L用于区别加载(L为1)
或存储(L为0)
Rm:偏移量寄存器
Rn:基址寄存器
Rd:源或目标寄存器
说明:当opcode位为11b
时 , L 位 为 0 代 表 指 令
“LDRSB“,L位为1代表指
令“LDRSH”
周立功单片机
• 单寄存器访问指令——寄存器偏移寻址
注意:进行字数据访问时,必须保证传送地址为32位对
齐。进行半字数据访问时,必须保证传送地址为16位对
齐。
应用示例:
LDR R3,[R1,R0]
STR R1,[R0,R2]
LDRH R6,[R0,R1]
STRH R0,[R4,R5]
LDRB R2,[R5,R1]
STRB R1,[R3,R2]
LDRSH R7,[R6,R3]
LDRSB R5,[R7,R2]
周立功单片机
• 单寄存器访问指令——相对偏移寻址
这种寻址方式是以PC或SP寄存器的内容为基址,以
一个立即数为偏移量,两者相加作为存储器的地址。指
令格式如下:
LDR Rd,[PC,#immed_8×4]
LDR Rd,label
LDR Rd,[SP,#immed_8×4]
STR Rd,[SP,#immed_8×4]
其中:Rd 表示加载或存储的寄存器。必须为R0~R7。
immed_8×4 表示偏移量,取值范围是(0~255)×4 。
label 表示程序相对偏移表达式,Label必须在当前指令之后的1KB范围内。
周立功单片机
• 单寄存器访问指令——相对偏移指令编码
L:用于区别加载( L
为1)或存储(L为0) Rd:目标或源寄存器
immed8:偏移量
PC相对偏移LDR指令编码
SP相对偏移LDR/STR指令编码
周立功单片机
• 单寄存器访问指令——相对偏移寻址
注意:以PC作为基地址的相对偏移寻址指令只有LDR,
而没有STR指令。
应用示例:
LDR R0,[PC,#0x08] ;读取PC+0x08地址上的字数据,
;保存到R0中
LDR R7,LOCALDAT ;读取LOCALDAT地址上的
;字数据,保存到R7中
LDR R3,[SP,#1020] ; 读取SP+1020地址上的字数据,
;保存到R3中
STR R2,[SP] ; 存储R2寄存器的数据到SP
;指向的存储单元 (偏移量为0)
周立功单片机
指令集介绍
• Thumb存储器访问指令
•PUSH和POP——寄存器入栈及出栈指令
实现低寄存器和可选的LR寄存器入栈及低寄存
器和可选的PC寄存器出栈操作。堆栈地址由SP寄存
器设置,堆栈是满递减堆栈。
周立功单片机
• 寄存器入栈及出栈指令
PUSH {reglist[,LR]}
POP {reglist[,PC]}
其中: reglist 入栈/出栈低寄存器列表,即R0~R7。
LR 入栈时的可选寄存器。
PC 出栈时的可选寄存器。
指令编码
指令格式
L用于区别出栈(L为1)
或入栈(L为0)
R用于区别操作寄存器中
是 否 有 LR/PC 寄 存 器
(有则R为1,否则为0)
周立功单片机
• 寄存器入栈及出栈指令
PUSH {reglist[,LR]}
POP {reglist[,PC]}
其中: reglist 入栈/出栈低寄存器列表,即R0~R7。
LR 入栈时的可选寄存器。
PC 出栈时的可选寄存器。
指令格式
应用示例:
PUSH {R0-R7,LR} ;将低寄存器R0~R7全部入栈,
;LR也入栈
POP {R0-R7,PC} ;将堆栈中的数据弹出到
;低寄存器R0~R7及PC中
周立功单片机
指令集介绍
• Thumb存储器访问指令
•LDMIA和STMIA——多寄存器加载/存储指令
可以实现在一组寄存器和一块连续的内存单元
之间传输数据。LDMIA为加载多个寄存器;STMIA
为存储多个寄存器。使用它们允许一条指令传送8
个低寄存器R0~R7的任何子集。
周立功单片机
• 多寄存器加载/存储指令
LDMIA Rn!,reglist
STMIA Rn!,reglist
其中: Rn 加载/存储的起始地址寄存器。Rn必须为R0~R7。
reglist 加载/存储的寄存器列表。寄存器必须为R0~R7。
指令编码
指令格式
L用于区别加载(L为1)
还是存储(L为0)
周立功单片机
• 多寄存器加载/存储指令
应用示例:
LDMIA R0!,{R2-R7} ;加载R0指向的地址上的多字数据,
;保存到R2~R7中, R0的值更新。
STMIA R1!,{R2-R7} ;将R2~R7的数据存储到R1指向的
;地址上,R1值更新
LDMIA/STMIA 的主要用于数据复制、参数传送等。进行数据传送
时,每次传送后地址加4。
若Rn在寄存器列表中:
�对于LDMIA指令,Rn的最终值是加载的值,而不是增加后的地址;
�对于STMIA指令,若Rn是寄存器列表中的最低数字的寄存器,则Rn
存储的值为Rn在初值,其它情况不可预知。
周立功单片机
Thumb指令小节目录
指令集与ARM指令集的区别
2.存储器访问指令
3.数据处理指令
4.分支指令
5.杂项指令
6.伪指令
周立功单片机
指令集介绍
• Thumb数据处理指令
Thumb数据处理指令涵盖了编译器需要的大多
数操作。大部分的Thumb数据处理指令采用2地址
格式,不能在单指令中同时完成一个操作数的移位
及一个ALU操作。所以数据处理操作比ARM状态的
更少,并且访问寄存器R8~R15受到限制。数据处
理指令分为两类:
�数据传送指令
�算术逻辑运算指令
周立功单片机
指令集介绍
• Thumb数据处理指令——数据传送指令
影响N、Z、C、VRd←(-Rm) ,Rd、Rm均为R0~R7NEG Rd,Rm
影响N、ZRd←(~Rm) ,Rd、Rm均为R0~R7MVN Rd,Rm
Rd和Rm均为R0~R7时,
影响N、Z,清零C、V Rd←Rm,Rd、Rm均可为R0~R15MOV Rd,Rm
影响N、ZRd←expr,Rd为R0~R7MOV Rd,#expr
影响标志操作助记符
周立功单片机
MOV指令将8位立即数或寄存器传送到目标寄存器中。
其指令格式如下:
• 数据传送指令——MOV
MOV Rd,#expr
MOV Rd,Rm
其中:Rd 目标寄存器。MOV Rd,#expr时,Rd必须在R0~R7之间。
exper 8位立即数,即0~255。
Rm 源寄存器。为R0~R15。
指令编码(立即数传送)
指令编码(寄存器传送)
周立功单片机
• 数据传送指令——MOV
注意:
“MOV Rd,#expr”指令会更新N和Z标志,对标志C和V无影响。
“MOV Rd,Rm”指令,若Rd或Rm是高寄存器(R8~R15),则标志不
受影响,若Rd或Rm都是低寄存器(R0~R7),则更新标志N和Z,且清除
标志C和V。
应用示例:
MOV R1,#0x10 ; R1=0x10
MOV R0,R8 ; R0=R8
MOV PC,LR ; PC=LR,子程序返回
周立功单片机
• 数据传送指令——MVN
MVN Rd,Rm
其中:Rd 目标寄存器。MOV Rd,#expr时,Rd必须在R0~R7之间。
Rm 源寄存器。为R0~R15。
指令编码
MVN指令将寄存器Rm按位取反后传送到目标寄存器Rd
中。指令的执行会更新N和Z标志,对标志C和V无影响。其指
令格式如下:
周立功单片机
应用示例:
MVN R1,R2 ; 将R2取反,结果存于R1
• 数据传送指令——MVN
MVN Rd,Rm
其中:Rd 目标寄存器。MOV Rd,#expr时,Rd必须在R0~R7之间。
Rm 源寄存器。为R0~R15。
MVN指令将寄存器Rm按位取反后传送到目标寄存器Rd
中。指令的执行会更新N和Z标志,对标志C和V无影响。其指
令格式如下:
周立功单片机
• 数据传送指令——NEG
NEG Rd,Rm
其中:Rd 目标寄存器,必须在R0~R7之间。
Rm 源寄存器。为R0~R15。
指令编码
NEG指令将寄存器Rm乘以-1后传送到目标寄存器Rd中。
指令会更新N、Z、C和V标志。其指令格式如下:
周立功单片机
• 数据传送指令——NEG
NEG Rd,Rm
其中:Rd 目标寄存器,必须在R0~R7之间。
Rm 源寄存器。为R0~R15。
NEG指令将寄存器Rm乘以-1后传送到目标寄存器Rd中。
指令会更新N、Z、C和V标志。其指令格式如下:
应用示例:
NEG R1,R0 ; R1=-R0
周立功单片机
指令集介绍
• Thumb数据处理指令——算术逻辑运算指令
算术逻辑指令包括以下几类:
�算术指令
�逻辑运算指令
�移位指令
�比较指令
周立功单片机
ADD指令将两个数据相加,结果保存到Rd寄存器中。
• 算术运算指令——ADD
ADD Rd,Rn,Rm
ADD Rd,Rn,#expr3
ADD Rd,#expr8
其中:Rd 目标寄存器,必须在R0~R7之间。
Rn 第1个操作数寄存器,必须在R0~R7之间。
Rm 第2个操作数寄存器,必须在R0~R7之间。
exper 3位立即数,即0~7。
expr8 8位立即数,即0~255。
低寄存器的ADD指令格式:
应用示例:
ADD R1,R1,R0 ; R1=R0+R1
ADD R1,R1,#7 ; R1=R1+7
ADD R1,#200 ; R1=R1+200
周立功单片机
ADD指令将两个数据相加,结果保存到Rd寄存器中。
• 算术运算指令——ADD
ADD Rd,Rm
其中:Rd 目标寄存器,也是第一个操作数寄存器。
Rm 第2个操作数寄存器。
高或低寄存器的ADD指令格式:
应用示例:
ADD R1,R10 ; R1=R1+R10
周立功单片机
ADD指令将两个数据相加,结果保存到Rd寄存器中。
• 算术运算指令——ADD
ADD SP,#expr
其中:SP 目标寄存器,也是第一个操作数寄存器。
expr 立即数,在-508~+508之间的4的整数倍的数。
SP操作的ADD指令格式:
应用示例:
ADD SP,#-500 ;SP=SP-500
周立功单片机
SUB指令将两个数据相减,结果保存到Rd寄存器中。
• 算术运算指令——SUB
SUB Rd,Rn,Rm
SUB Rd,Rn,#expr3
SUB Rd,#expr8
其中:Rd 目标寄存器,必须在R0~R7之间。
Rn 第1个操作数寄存器,必须在R0~R7之间。
Rm 第2个操作数寄存器,必须在R0~R7之间。
exper 3位立即数,即0~7。
expr8 8位立即数,即0~255。
低寄存器的SUB指令格式:
应用示例:
SUB R1,R1,R0 ; R1=R1-R0
SUB R1,R1,#7 ; R1=R1-7
SUB R1,#200 ; R1=R1-200
周立功单片机
SUB指令将两个数据相减,结果保存到Rd寄存器中。
• 算术运算指令——SUB
SUB SP,#expr
其中:SP 目标寄存器,也是第一个操作数寄存器。
expr 立即数,在-508~+508之间的4的整数倍的数。
SP操作的SUB指令格式:
应用示例:
SUB SP,#380 ;SP=SP-380
周立功单片机
ADC指令将Rm的值相加,再加上CPSR中的C
条件标志位,结果保存到Rd寄存器。
• 算术运算指令——ADC
ADC Rd, Rm
其中:Rd 目标寄存器,也是第一个操作数寄存器,必须在R0~R7之间。
Rm 第2个操作数寄存器,必须在R0~R7之间。
ADC指令格式:
应用示例(64位加法):
ADD R0,R2
ADC R1,R3 ;(R1、R0)=(R1、R0)+(R3、R2)
周立功单片机
SBC指令用寄存器Rd减去Rm,再减去CPSR中
的C条件标志位的非,结果保存到Rd寄存器。
• 算术运算指令——SBC
SBC Rd, Rm
其中:Rd 目标寄存器,也是第一个操作数寄存器,必须在R0~R7之间。
Rm 第2个操作数寄存器,必须在R0~R7之间。
SBC指令格式:
应用示例(64位减法):
SUB R0,R2
SBC R1,R3 ;(R1、R0)=(R1、R0)-(R3、R2)
周立功单片机
MUL乘法指令用寄存器Rd乘以Rm,结果保存
到Rd寄存器。
• 算术运算指令——MUL
MUL Rd, Rm
其中:Rd 目标寄存器,也是第一个操作数寄存器,必须在R0~R7之间。
Rm 第2个操作数寄存器,必须在R0~R7之间。
MUL指令格式:
应用示例:
MUL R0,R1 ;R0=R0×R1
周立功单片机
AND指令将寄存器Rd的值与寄存器Rm的值按
位作逻辑“与”操作,结果保存到Rd寄存器中。
• 逻辑运算指令——AND
ADD Rd, Rm
其中:Rd 目标寄存器,也是第一个操作数寄存器,必须在R0~R7之间。
Rm 第2个操作数寄存器,必须在R0~R7之间。
AND指令格式:
应用示例:
MOV R1,#0x0F
AND R0,R1 ; R0=R0 & R1,清零R0高24位
周立功单片机
ORR指令将寄存器Rd的值与寄存器Rn的值按
位作逻辑“或”操作,结果保存到Rd寄存器中。
• 逻辑运算指令——ORR
ORR Rd, Rm
其中:Rd 目标寄存器,也是第一个操作数寄存器,必须在R0~R7之间。
Rm 第2个操作数寄存器,必须在R0~R7之间。
ORR指令格式:
应用示例:
MOV R1,#0x0F
ORR R0,R1 ; R0=R0 | R1,置位R0低4位
周立功单片机
EOR指令将寄存器Rd的值与寄存器Rn的值按位
作逻辑“异或”操作,结果保存到Rd寄存器中。
• 逻辑运算指令——EOR
EOR Rd, Rm
其中:Rd 目标寄存器,也是第一个操作数寄存器,必须在R0~R7之间。
Rm 第2个操作数寄存器,必须在R0~R7之间。
EOR指令格式:
应用示例:
MOV R1,#0x0F
EOR R0,R1 ; R0=R0 ^ R1,取反R0低4位
周立功单片机
BIC指令将寄存器Rd的值与寄存器Rm的值的反
码作逻辑“与”操作,结果保存到Rd寄存器中。
• 逻辑运算指令——BIC
BIC Rd, Rm
其中:Rd 目标寄存器,也是第一个操作数寄存器,必须在R0~R7之间。
Rm 第2个操作数寄存器,必须在R0~R7之间。
BIC指令格式:
应用示例:
MOV R1,#0x02
BIC R0,R1 ; 清零R0的第2位,其它位不变
周立功单片机
ASR指令将数据算术右移,将符号位拷贝到左
侧空出的位,移位结果保存到Rd寄存器中。
• 移位指令——ASR
ASR Rd, Rs
ASR Rd,Rm,#expr
其中:Rd 目标寄存器,也是第一个操作数寄存器,必须在R0~R7之间。
Rs 寄存器控制移位中包含移位位数的寄存器,必须在R0~R7之间
Rm 立即数移位的源寄存器,必须在R0~R7之间
expr 立即数移位位数,值为1~32
ASR指令格式:
ASR移位操作:
若移位位数为32,则Rd清零,最后移出的位保留在标志C中;若移位
位数大于32,则Rd和标志C均被清零;若移位位数为0,则不影响C标志。
周立功单片机
ASR指令将数据算术右移,将符号位拷贝到左
侧空出的位,移位结果保存到Rd寄存器中。
• 移位指令——ASR
ASR Rd, Rs
ASR Rd,Rm,#expr
其中:Rd 目标寄存器,也是第一个操作数寄存器,必须在R0~R7之间。
Rs 寄存器控制移位中包含移位位数的寄存器,必须在R0~R7之间
Rm 立即数移位的源寄存器,必须在R0~R7之间
expr 立即数移位位数,值为1~32
ASR指令格式:
应用示例:
ASR R1,R2
ASR R3,R1,#2
周立功单片机
LSL指令将数据逻辑左移,空位清零,移位结果
保存到Rd寄存器中。
• 移位指令——LSL
LSL Rd, Rs
LSL Rd,Rm,#expr
其中:Rd 目标寄存器,也是第一个操作数寄存器,必须在R0~R7之间。
Rs 寄存器控制移位中包含移位位数的寄存器,必须在R0~R7之间
Rm 立即数移位的源寄存器,必须在R0~R7之间
expr 立即数移位位数,值为1~31
LSL指令格式:
若移位位数为32,则Rd清零,最后移出的位保留在标志C中;若移位
位数大于32,则Rd和标志C均被清零;若移位位数为0,则不影响C标志。
LSL移位操作: 0
周立功单片机
LSL指令将数据逻辑左移,空位清零,移位结果
保存到Rd寄存器中。
• 移位指令——LSL
LSL Rd, Rs
LSL Rd,Rm,#expr
其中:Rd 目标寄存器,也是第一个操作数寄存器,必须在R0~R7之间。
Rs 寄存器控制移位中包含移位位数的寄存器,必须在R0~R7之间
Rm 立即数移位的源寄存器,必须在R0~R7之间
expr 立即数移位位数,值为1~31
LSL指令格式:
应用示例:
LSL R6,R7
LSL R1,R6,#2
周立功单片机
LSR指令将数据逻辑右移,空位清零,移位结
果保存到Rd寄存器中。
• 移位指令——LSR
LSR Rd, Rs
LSR Rd,Rm,#expr
其中:Rd 目标寄存器,也是第一个操作数寄存器,必须在R0~R7之间。
Rs 寄存器控制移位中包含移位位数的寄存器,必须在R0~R7之间
Rm 立即数移位的源寄存器,必须在R0~R7之间
expr 立即数移位位数,值为1~32
LSR指令格式:
若移位位数为32,则Rd清零,最后移出的位保留在标志C中;若移位
位数大于32,则Rd和标志C均被清零;若移位位数为0,则不影响C标志。
LSR移位操作: 0
周立功单片机
LSR指令将数据逻辑右移,空位清零,移位结
果保存到Rd寄存器中。
• 移位指令——LSR
LSR Rd, Rs
LSR Rd,Rm,#expr
其中:Rd 目标寄存器,也是第一个操作数寄存器,必须在R0~R7之间。
Rs 寄存器控制移位中包含移位位数的寄存器,必须在R0~R7之间
Rm 立即数移位的源寄存器,必须在R0~R7之间
expr 立即数移位位数,值为1~32
LSR指令格式:
应用示例:
LSR R3,R0
LSR R5,R2,#2
周立功单片机
ROR指令将数据循环右移,寄存器右侧移出的
位放入左侧空出的位上,移位结果保存到Rd寄存器
中。
• 移位指令——ROR
ROR Rd, Rs
其中:Rd 目标寄存器,也是第一个操作数寄存器,必须在R0~R7之间。
Rs 寄存器控制移位中包含移位位数的寄存器,必须在R0~R7之间
ROR指令格式:
ROR移位操作:
应用示例:
ROR R3,R0
周立功单片机
CMP指令使用寄存器Rn的值减去第二个操作数
的值,根据操作的结果更新CPSR中的N、Z、C和V
标志位。
• 比较指令——CMP
CMP Rn,Rm
CMP Rn,#epr
其中:Rn 第一个操作数寄存器,必须在R0~R7之间。
Rm 第二个操作数寄存器,必须在R0~R7之间。
expr 立即数,值为0~255
ROR指令格式:
应用示例:
CMP R1,#10 ;R1与10比较,设置相关标志位
CMP R1,R2 ;R1与R2比较,设置相关标志位
周立功单片机
CMN指令使用寄存器Rn的值加上寄存器Rm的
值,根据操作的结果更新CPSR中的N、Z、C和V标
志位。
• 比较指令——CMN
CMN Rn,Rm
其中:Rn 第一个操作数寄存器,必须在R0~R7之间。
Rm 第二个操作数寄存器,必须在R0~R7之间。
ROR指令格式:
应用示例:
CMN R0,R2 ;R0与-R2比较,设置相关标志位
周立功单片机
TST指令将寄存器Rn的值与寄存器Rm的值按位
作逻辑“与”操作,根据操作的结果更新CPSR中的N、
Z、C和V标志位。
• 比较指令——TST
TST Rn,Rm
其中:Rn 第一个操作数寄存器,必须在R0~R7之间。
Rm 第二个操作数寄存器,必须在R0~R7之间。
TST指令格式:
应用示例:
MOV R0,#0x01
TST R1,R0 ;判断R1的最低位是否为0
周立功单片机
Thumb指令小节目录
指令集与ARM指令集的区别
2.存储器访问指令
3.数据处理指令
4.分支指令
5.杂项指令
6.伪指令
周立功单片机
指令集介绍
• Thumb分支指令
无PC←label,切换处理器状态带状态切换的分支指令BX Rm
无LR←PC-4,PC←label带链接的分支指令BL label
B{cond}PC←label分支指令B label
条件码位置操作说明助记符
周立功单片机
B指令跳转到指定的地址执行程序,它是Thumb指
令集中的唯一有条件执行指令。如果使用了条件执行,
那么跳转范围在-252~+256字节内。如果没有使用条
件执行,那么跳转范围在±2K内。
• 分支指令——B
B{cond} label
其中:label 表示程序标号。
B指令格式:
应用示例:
B WAITB ;WAITB标号在当前指令的±2K范围内
BEQ LOOP1 ;LOOP1标号在当前指令的-252~+256范围内
周立功单片机
BL指令在跳转到指定地址执行程序前,将下一条指
令的地址拷贝到R14链接寄存器中。
• 分支指令——BL
BL label
其中:label 表示程序标号。
BL指令格式:
注意:由于BL指令通常需要大的地址范围,很难用16位指令格式
实现,为此,Thumb采用两条这样的指令组合成22位半字偏移(符
号扩展为32位),使指令转移范围为±4MB。
应用示例: 反汇编代码:
ADD R0,R1
BL RstInit
[0x1809] add r1,r1,r0
[0xf9dcf000] bl RstInit
指令机器码 汇编指令32位长的机器码
周立功单片机
BX指令是带状态切换的分支指令,跳转地址由Rm
指定,同时根据Rm的最低位的值切换处理器状态,当
最低两位均为0时,切换到ARM状态。
• 分支指令——BX
BX Rm
其中:Rm 保存有目标地址的寄存器。
BX指令格式:
应用示例:
ADR R0,ArmFun ;将ARM程序段地址存入R0
BX R0 ;跳至R0指定的地址,并切换到ARM状态
周立功单片机
Thumb指令小节目录
指令集与ARM指令集的区别
2.存储器访问指令
3.数据处理指令
4.分支指令
5.杂项指令
6.伪指令
周立功单片机
SWI指令用于产生软中断,从而实现从用户模式变
换到管理模式,CPSR保存到管理模式的SPSR中,同时
程序跳转到SWI向量。在系统模式下也可以使用SWI指
令,处理器同样能切换到管理模式。(参数传递的方法
参看ARM指令SWI的使用)
• Thumb杂项指令——SWI
SWI immed_8
其中: immed_8 8位立即数,值为0~255之间的整数。
SWI指令格式:
应用示例:
SWI 1 ;软中断,中断立即数为0
SWI 0x55 ;软中断,中断立即数为0x55
周立功单片机
Thumb指令小节目录
指令集与ARM指令集的区别
2.存储器访问指令
3.数据处理指令
4.分支指令
5.杂项指令
6.伪指令
周立功单片机
ADR伪指令将基于PC相对偏移的地址值读取到寄
存器中。
• Thumb伪指令——ADR
ADR register,expr
其中:register 加载的目标寄存器
expr 地址表达式。偏移量必须是正数并小于1KB。
expr必须是局部定义的,不能被导入。
ADR指令格式:
应用示例:
ADR R0,TxTab
...
TxTab
DCB “ARM7TDMI”,0
地址范围不超过1KB
周立功单片机
LDR伪指令用于加载32位的立即数或一个地址值到
指定寄存器。在汇编编译源程序时,LDR伪指令被编译
器替换成一条合适的指令。详细说明参看ARM伪指令
部分。
• Thumb伪指令——LDR
LDR register,=expr/label-expr
其中:register 加载的目标寄存器
expr 32位立即数
label-expr 基于PC的地址表达式或外部表达式。
LDR指令格式:
应用示例:
LDR R0,=0x12345678 ;加载32位立即数0x123456778
LDR R0,=DATA_BUF+60 ;加载DATA_BUF地址+60
...
LTORG ;声明文字池
地址范围不超过1KB
周立功单片机
NOP伪指令在汇编时将被替换成一条Thumb空操
作的指令。比如可能为“MOV R0,R0”指令。NOP伪指
令可用于延时操作。
• Thumb伪指令——NOP
应用示例(延时子程序):
Delay
NOP ;空操作
NOP
NOP
SUB R1,R1,#1 ;循环次数减一
;不需要加‘S’标志,就可以影响CPSR标志位
BNE Delay ;如果循环没有结束,跳转Delay继续
MOV PC,LR ;子程序返回
周立功单片机
周立功单片机
第5章 LPC2000系列ARM
硬件结构
周立功单片机
第5章 目录
�1.简介
�2.引脚配置
�3.存储器寻址
�4.系统控制模块
�5.存储器加速模块
�6.外部存储器控制器
�7.引脚连接模块
�8. 向量中断控制器
�
�
�
�接口
�接口
�14.定时器0/1
�15.脉宽调制器(PWM)
�
�17.实时时钟
�18.看门狗
周立功单片机
第5章 目录
�1.简介
�2.引脚配置
�3.存储器寻址
�4.系统控制模块
�5.存储器加速模块
�6.外部存储器控制器
�7.引脚连接模块
�8. 向量中断控制器
�
�
�
�接口
�接口
�14.定时器0/1
�15.脉宽调制器(PWM)
�
�17.实时时钟
�18.看门狗
周立功单片机
简介
• LPC2000系列微控制器概述
LPC2000系列微控制器基于ARM7TDMI-S
CPU内核。支持ARM和Thumb指令集,芯片内集
成丰富外设,而且具有非常低的功率消耗。使该
系列微控制器特别适用于工业控制、医疗系统、
访问控制和POS机等场合。
周立功单片机
-双8路128KB16KB64LPC2134
-双8路256KB16KB64LPC2136
带外部
存储器
接口48256KB16KB144LPC2294
--832KB8KB64LPC2131
带1路
DAC
-864KB16KB64LPC2132
-双8路512KB32KB64LPC2138
-44256KB16KB64LPC2194
28-16KB144LPC2290
28256KB16KB144LPC2292
-24256KB16KB64LPC2129
-
-
2
-
-
-
CAN控制器
带外部
存储器
接口8256KB16KB144LPC2214
-4128KB16KB64LPC2119
8128KB16KB144LPC2212
8-16KB144LPC2210
-4256KB16KB64LPC2124
-4128KB16KB64LPC2114
备注10位AD通道数片内Flash片内RAM引脚数器件型号
• LPC2000系列器件信息
周立功单片机
• 芯片内部框图
LPC2000系列微控制器包含四
大部分: ARM7TDMI-SCPU
AHB To VPB
桥
EMC
VIC
I2C串行接口
SPI串行接口
UART0 & 1
CAN
看门狗定时器
系统控制
外部中断
TIMER0/1
ADC
通用I/O
PWM0
实时时钟
SRAM
Flash
AHB总线
ARM7 局部总线
系统功能
�ARM7TDMI-S CPU
�ARM7局部总线及相关部件
�AHB高性能总线及相关部件
�VLSI外设总线及相关部件
周立功单片机
• 芯片内部框图
ARM7TDMI-S
CPU
AHB To VPB
桥
EMC
VIC
I2C串行接口
SPI串行接口
UART0 & 1
CAN
看门狗定时器
系统控制
外部中断
TIMER0/1
ADC
通用I/O
PWM0
实时时钟
SRAM
Flash
AHB总线
ARM7 局部总线
系统功能
�LPC2000系列微控制器将
ARM7TDMI-S配置为小端模式
(Little-endian)。
ARM7TDMI-S
CPU
�AHB外设分配了2M字节的地
址范围,它位于4G字节ARM寻
址空间的最顶端。每个AHB外
设都分配了16KB的地址空间。
EMC
VIC
�LPC2000系列微控制器的外设
功能(除中断控制器)都连接
到VPB总线。AHB到VPB的桥将
VPB总线与AHB总线相连。VPB
外设也分配了2M字节的地址范
围,从地址点开始。每
个VPB外设都分配了16KB的地
址空间。
I2C串行接口
SPI串行接口
UART0 & 1
CAN
看门狗定时器
系统控制
外部中断
TIMER0/1
ADC
通用I/O
PWM0
实时时钟
AHB To VPB
桥
周立功单片机
• 芯片内部各单元简介
ARM7TDMI-S
CPU
AHB To VPB
桥
EMC
VIC
I2C串行接口
SPI串行接口
UART0 & 1
CAN
看门狗定时器
系统控制
外部中断
TIMER0/1
ADC
通用I/O
PWM0
实时时钟
SRAM
Flash
AHB总线
ARM7 局部总线
系统功能
SRAM
Flash
�内部存储器包括无等待SRAM
和Flash;
�外部存储器控制器(EMC)支
持4个BANK的外部SRAM或
Flash,每个BANK最多16MB;
�系统功能包括维持芯片工作的
一些基本功能,如系统时钟、
复位等;
�向量中断控制器(VIC)可以
减少中断的响应时间,最多可
以管理32各中断请求;
�I2C串行接口为标准的I2C总线
接口,支持最高速度400kb;
EMC
系统功能
VIC
I2C串行接口
周立功单片机
• 芯片内部各单元简介
ARM7TDMI-S
CPU
AHB To VPB
桥
EMC
VIC
I2C串行接口
SPI串行接口
UART0 & 1
CAN
看门狗定时器
系统控制
外部中断
TIMER0/1
ADC
通用I/O
PWM0
实时时钟
SRAM
Flash
AHB总线
ARM7 局部总线
系统功能
�具有两个完全独立的SPI控制
器,遵循SPI规范,可配置为SPI
主机或从机;
�具有两个UART接口,均包含
16字节的接收/发送FIFO,内置
波特率发生器。其中UART1具
有调制解调器接口功能;
�在LPC2119/2129/2290/2292
等芯片中包含CAN总线接口;
�看门狗定时器带有内部分频
器,可以方便设置溢出时间,
在软件使能看门狗后只有复位
可以禁止(具有调试模式);
SPI串行接口
UART0 & 1
CAN
看门狗定时器
周立功单片机
• 芯片内部各单元简介
ARM7TDMI-S
CPU
AHB To VPB
桥
EMC
VIC
I2C串行接口
SPI串行接口
UART0 & 1
CAN
看门狗定时器
系统控制
外部中断
TIMER0/1
ADC
通用I/O
PWM0
实时时钟
SRAM
Flash
AHB总线
ARM7 局部总线
系统功能
�系统控制模块包括一些与其它
外设无关的功能,如功率控制
等;
�外部中断有4路多引脚输入,
可用于CPU掉电唤醒;
�定时器0/1为两个独立的带可
编程32位预分频器的32位定时
器/计数器,具有捕获和匹配输
出功能;
�具有4/8路10位ADC,可以设
置为多路循环采样模式。10位
转换时间最短为;
系统控制
外部中断
TIMER0/1
ADC
周立功单片机
• 芯片内部各单元简介
ARM7TDMI-S
CPU
AHB To VPB
桥
EMC
VIC
I2C串行接口
SPI串行接口
UART0 & 1
CAN
看门狗定时器
系统控制
外部中断
TIMER0/1
ADC
通用I/O
PWM0
实时时钟
SRAM
Flash
AHB总线
ARM7 局部总线
系统功能
�不同封装的芯片具有数目不等
的IO口,它们可以承受5V电压。
每个IO口可以独立设置为输入/
输出模式,在作为输出模式时
可以分别置位或清零;
�脉宽调制器可以灵活设置,以
适应不同的场合。可以设置为
单边沿或双边缘输出方式,可
以灵活的设置频率和占空比;
�实时时钟具有可编程的积存时
钟分频器,以适应不同的晶振
频率。带日历和时钟功能,提
供秒、分、时、日、月、年和
星期,同时具有非常的功耗。
通用I/O
PWM0
实时时钟
周立功单片机
第5章 目录
�1.简介
�2.引脚配置
�3.存储器寻址
�4.系统控制模块
�5.存储器加速模块
�6.外部存储器控制器
�7.引脚连接模块
�8. 向量中断控制器
�
�
�
�接口
�接口
�14.定时器0/1
�15.脉宽调制器(PWM)
�
�17.实时时钟
�18.看门狗
周立功单片机
引脚配置
• LPC2000系列芯片外形
LPC2210/2212/2214LPC2114/2124
周立功单片机
GPIO
TXD0
PWM1输出
引脚配置
• 引脚功能选择使用示例
LPC2000系列微控制器的引脚一般是多个功
能复用,但是同一引脚在同一 引脚在同一时刻只
能使用其中一个功能,这可以通过设置PINSELx寄
存器来选择,详细介绍见“引脚连接模块”小节。
通过PINSEL0控制引脚功能
周立功单片机
第5章 目录
�1.简介
�2.引脚配置
�3.存储器寻址
�4.系统控制模块
�5.存储器加速模块
�6.外部存储器控制器
�7.引脚连接模块
�8. 向量中断控制器
�
�
�
�接口
�接口
�14.定时器0/1
�15.脉宽调制器(PWM)
�
�17.实时时钟
�18.看门狗
周立功单片机
小节目录
• 存储器分布
• 各存储器操作方法
• 存储器映射
• 预取指中止和数据中止
• 异常向量表
周立功单片机
小节目录
• 存储器分布
• 各存储器操作方法
• 存储器映射
• 预取指中止和数据中止
• 异常向量表
周立功单片机
存储器寻址
地址空间 0xFFFFFFFF
0x00000000
内部Flash
0x40000000
内部SRAM
0x80000000
外部存储器
0x7FFFE000
Boot Block
片外存储器
片内存储器
• 一个具体应用可能存在的物理存储器
周立功单片机
256K
16K
存储器寻址
• 不同芯片内部存储器分布
16K
128K
16K
LPC2210 LPC2114/2212 LPC2124/2214
片内Flash 片内RAM
0x00000000
0x0001FFFF
0x0003FFFF
0x40000000
0x40001FFF
周立功单片机
小节目录
• 存储器分布
• 各存储器操作方法
• 存储器映射
• 预取指中止和数据中止
• 异常向量表
周立功单片机
存储器寻址
• 片内Flash编程方法:
JTAG
串口
1. 通过内置JTAG接口;
2. 通过在系统编程(ISP),使用UART0通信;
3. 通过在应用编程(IAP);
周立功单片机
存储器寻址
• 片外Flash编程方法(LPC2200):
在CPU上运行一个装载程序(Loader,一般由
用户编写),该程序通过串口接收要烧写的数据,
然后擦除编程Flash。
串口
Loder
程序
外部
Flash
周立功单片机
存储器寻址
• 片内SRAM的写操作
SRAM控制器包含一个回写缓冲区,它总是保
存着软件发送到SRAM的最后一个字数据。该数据
只有在软件请求下一次写操作时才写入SRAM。如
果发生芯片复位,实际的SRAM内容将不会反映最
近一次的写操作。
??
回写缓冲区
内部SRAM
写入地址写入A写入B A A写入AB
周立功单片机
小节目录
• 存储器分布
• 各存储器操作方法
• 存储器映射
• 预取指中止和数据中止
• 异常向量表
周立功单片机
存储器寻址
• 存储器映射基本概念
ARM处理器产生的地址叫虚拟地址,把这个
虚拟地址按照某种规则转换到另一个物理地址去
的方法称为地址映射。这个物理地址表示了被访
问的存储器的位置。它是一个地址范围,该范围
内可以写入程序代码。
通过地址映射的方法将各存储器分配到特定
的地址范围后,这时用户所看见的存储器分布为
存储器映射。
周立功单片机
存储器寻址
• 芯片复位后用户看见的地址空间
128KB Flash(LPC2114/2212)
256KB Flash(LPC2124/2214)
16KB SRAM
8KB BootBlock
2MB VPB 外设
2MB AHB 外设
0x00000000
0xFFFFFFFF
保留给片内存储器使用
保留给片内存储器使用
保留给外部储器使用
0x40000000
0xE0000000
0x80000000
0xF0000000
0x00020000
地址空间
周立功单片机
存储器寻址
• AHB和VPB
AHB(先进的高性能总线)和VPB(VLSI外设总线)外设
区域都为2M字节,可各分配128个外设。每个外设空间的规格
都为16K字节,这样就简化了每个外设的地址译码。
注意:AHB和VPB外设区域中不管是字还是半字,都
是一次性访问。例如不可能对一个字寄存器的最高字
节执行单独的读或写操作
周立功单片机
存储器寻址
• 外设存储器映射
VPB 外设
AHB 外设
保留
+2MB
-2MB
地址空间
0xE0000000
0xE0000000
0xFFE00000
0xFFE00000
VPB 外设
AHB 外设
均为128×16KB(2MB)范围
周立功单片机
存储器寻址
• AHB外设映射
AHB 外设#126
地址空间
0xFFE00000
0xFFE04000
0xFFFF4000
0xFFFF8000
AHB 外设#125
AHB 外设#0
AHB 外设#1
0xFFFFF000
…
0xFFFFC000
向量中断控制器
AHB 外设#127
周立功单片机
存储器寻址
• VPB外设映射
VPB 外设#3
地址空间
0xE0000000
0xE0004000
0xE0008000
0xE000C000
VPB 外设#2
VPB 外设#0
VPB 外设#1
0xE01FC000
…
VPB外设#127
看门狗定时器
定时器0
系统控制模块
定时器1
UART 0
周立功单片机
存储器寻址
• Boot lock的映射地址安排
为了兼容将来的器件,整个Boot Block被映射到
片内存储器空间的顶端。所以将来的芯片内置不同
的RAM和FALSH都不会影响Boot Block的位置。
地址空间
Flash
SRAM
Boot Block
AHB & VPB
映射位置固定在
内部存储器顶端
RAM和Flash
的变化不会影响
BootBlock的位置
SRAM
Flash
0x80000000
周立功单片机
存储器寻址
• 存储器重新映射
存储器重新映射是将复位后用户所见的存储器
中部分区域,再次映射到其它的地址上。
对于Philips的LPC系列ARM微控制器,存储器
重新映射区域一共为64字节,分别为异常向量区
(32字节)和紧随其后的32字节。存储器重新映射
的方法允许在不同模式下处理中断,重新映射的存
储器区域在地址0x00000000~0x0000003F处。存储
器重新映射的控制见“存储器映射控制”小节。
周立功单片机
存储器寻址
• 使用存储器重新映射的原因
�使Flash存储器中的FIQ处理程序不必考虑因为重新映
射所导致的存储器边界问题
�用来处理代码空间中段边界仲裁的SRAM和Boot Block
向量的使用大大减少
�为超过单字转移指令范围的跳转提供空间来保存常量
周立功单片机
• 存储器分布
• 各存储器操作方法
• 存储器映射
• 预取指中止和数据中止
• 异常向量表
小节目录
周立功单片机
存储器寻址
• 预取指中止和数据中止异常
如果试图访问一个保留地址或未分配区域的地
址,ARM处理器将产生预取指中止或数据中止异
常。
周立功单片机
存储器寻址
• 预取指中止和数据中止异常
这些区域分别为:
Flash
SRAM
Boot Block
VPB
地址空间
AHB
1.特定的ARM器件所没有的存储
器映射区域;
2. AHB外设空间中未分配的区域;
3. VPB外设空间中未分配的区域。
周立功单片机
存储器寻址
• 预取指中止和数据中止异常
注意:
只有在试图执行从非法地址取指的指令时,
ARM才会将预取指中止标志与相关的指令(没有意
义的指令)一起保存到流水线并对中止进行处理。
当代码在非常靠近存储器边界执行时,防止了由预
取指所导致的意外中止。
周立功单片机
存储器寻址
• 预取指中止和数据中止异常举例
指令流水线 指令C
指令B
指令A
存储器无效区域
取指
译码
执行
指令C
指令B
指令A
取指
译码
执行
存储器
程序
存储器
第N次取指
周立功单片机
第N+1次取指
存储器寻址
• 预取指中止和数据中止异常举例
指令流水线 指令C
指令B
指令A
存储器无效区域
取指
译码
执行
指令C
指令B
指令A
无效指令
指令C
指令B
取指
译码
执行
存储器
程序
存储器
周立功单片机
第N+2次取指
存储器寻址
• 预取指中止和数据中止异常举例
指令流水线 指令C
指令B
指令A
存储器无效区域
取指
译码
执行
指令C
指令B
指令A
无效指令
指令C
指令B
取指
译码
执行
无效指令
无效指令
指令C
存储器
程序
存储器
周立功单片机
存储器寻址
• 预取指中止和数据中止异常举例
指令流水线 指令C
指令B
指令A
存储器无效区域
取指
译码
执行
指令C
指令B
指令A
无效指令
指令C
指令B
取指
译码
执行
无效指令
无效指令
指令C
无效指令
无效指令
无效指令
存储器
程序
存储器
第N+3次取指,此时流水线的
执行级执行了无效指令,发生预取
指中止。如果指令C为跳转指令则
可以避免预取指中止的发生。
周立功单片机
• 存储器分布
• 各存储器操作方法
• 存储器映射
• 预取指中止和数据中止
• 异常向量表
小节目录
周立功单片机
存储器寻址
• 异常向量表
对于每一个异常事件,都有一个与之相
对应的处理程序,它们是关联在一起的,并
以一张一维表的格式存储在存储器的固定单
元中。这张指定了各异常中断及其处理程序
的对应关系的表,称为异常向量表。
周立功单片机
存储器寻址
• 异常向量表
地址 异常
0x0000 0000 复位
0x0000 0004 未定义指令
0x0000 0008 软件中断
0x0000 000C 预取指中止(从存储器取指出错)
0x0000 0010 数据中止(访问存储器数据出错)
0x0000 0014 保留 *
0x0000 0018 IRQ
0x0000 001C FIQ
各异常向量的固定位置
该位置被Boot装载程序用作有效用户程序的检测标志。
通过定义此保留值,使向量表所有数据32位累加和为
0,芯片复位后才能脱机运行用户程序。
周立功单片机
存储器寻址
• 位于启动代码中的异常向量表
什么是启动代码?
一般在32位ARM应用系统中,大多数采用C语言进
行软件编程。但是在运行应用代码前需要进行系统
初始化。
常用一个汇编文件作启动代码,它可以实现
异常向量表定义、堆栈初始化、系统变量初始化、
中断系统初始化、I/O初始化、外围部件初始化、地
址重映射等操作。
周立功单片机
• 位于启动代码中的异常向量表
CODE32
AREA vectors,CODE,READONLY
ENTRY
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
. . .
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr
ResetAddr DCD ResetInit
UndefinedAddr DCD Undefined
. . .
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
前32字节为异常入口
后32字节为跳转地址
异常向量表
周立功单片机
• 位于启动代码中的异常向量表
CODE32
AREA vectors,CODE,READONLY
ENTRY
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
. . .
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr
ResetAddr DCD ResetInit
UndefinedAddr DCD Undefined
. . .
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
异常向量表
例如:发生未定义异常时
1.程序计数器(PC)指向
0x00000004;
2.执行当前的指令,将
Undefined地址值装入
PC,实现至未定义异常处
理程序的跳转。
装入
周立功单片机
• 位于启动代码中的异常向量表
CODE32
AREA vectors,CODE,READONLY
ENTRY
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
. . .
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr
ResetAddr DCD ResetInit
UndefinedAddr DCD Undefined
. . .
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
异常向量表
注意:异常向量表中程序跳
转使用LDR指令,而没有使
用B指令。
原因:
指令可以全地址范围跳
转,而B指令只能在前后
32MB范围内跳转;
2.芯片具有Remap功能。当向
量表位于内部RAM或外部存
储器中,用B指令不能跳转到
正确的位置。
B ResetAddr
周立功单片机
第5章 目录
�1.简介
�2.引脚配置
�3.存储器寻址
�4.系统控制模块
�5.存储器加速模块
�6.外部存储器控制器
�7.引脚连接模块
�8. 向量中断控制器
�
�
�
�接口
�接口
�14.定时器0/1
�15.脉宽调制器(PWM)
�
�17.实时时钟
�18.看门狗
周立功单片机
系统控制模块小节目录
�系统控制模块概述
�系统时钟
�复位
�外部中断
�存储器映射控制
�功率控制
�唤醒定时器
周立功单片机
系统控制模块小节目录
�系统控制模块概述
�系统时钟
�复位
�外部中断
�存储器映射控制
�功率控制
�唤醒定时器
周立功单片机
系统控制模块
• 系统控制模块概述
系统控制模块包括一些系统构件和控制寄存
器,它们具有众多与芯片内其它外设无关的功能。
系统控制模块包括:系统时钟单元、复位、外部
中断输入、存储器映射控制、功率控制和唤醒定
时器。
周立功单片机
系统控制模块小节目录
�系统控制模块概述
�系统时钟
�复位
�外部中断
�存储器映射控制
�功率控制
�唤醒定时器
周立功单片机
系统时钟小节目录
• 系统时钟概述
• 晶体振荡器()
• PLL()
• VPB分频器()
周立功单片机
系统时钟小节目录
• 系统时钟概述
• 晶体振荡器()
• PLL()
• VPB分频器()
周立功单片机
系统时钟
• 系统时钟概述
CPU正常工作需要有合适的时钟信号,包括
ARM7内核使用的CCLK时钟,和芯片外设使用的
PCLK时钟。
通过LPC2000系列微控制器的时钟产生单元产
生ARM7内核和芯片外设正常工作所需要的时钟节
拍。
周立功单片机
系统时钟
• 系统时钟概述
ARM7核 桥 外设
时钟产生
FCCLK FPCLK
FOSC
CPU时钟结构
周立功单片机
系统时钟
• 时钟产生单元
时钟产生单元包括晶体振荡器、锁相环振荡器
(PLL)和VPB分频器。
PLL
晶体
振荡器
VPB分频器
FCCLK
FPCLK
FOSC
周立功单片机
• 系统时钟概述
• 晶体振荡器()
• PLL()
• VPB分频器()
系统时钟小节目录
周立功单片机
系统时钟
• 晶体振荡器
LPC2000微控制器可以使用内部的晶体振荡器
产生时钟信号,也可以从外部引入时钟信号。
LPC2000 LPC2000
X1 X2 X1 X2
Clock CX1 CX2
CC
XTAL
从属模式 振荡模式
周立功单片机
系统时钟
• 晶体振荡器
使用从属模式时,时钟信号通过X1引脚从外部
输入,输入频率范围:1~50(MHz),其幅度不
小于200m Vrms。
LPC2000
X1 X2
Clock
CC
从属模式
周立功单片机
系统时钟
• 晶体振荡器
使用振荡模式时,时钟信号由内部晶体振荡器
和外部连接的晶体振荡产生,振荡频率范围:1~
30(MHz)。
LPC2000
X1 X2
CX1 CX2XTAL
振荡模式
周立功单片机
系统时钟
• 晶体振荡器
注意:如果使用了ISP下载功能或者连接PLL提高频
率,则输入的时钟频率范围必须在10~25(MHz)
之间。
LPC2000 LPC2000
X1 X2 X1 X2
Clock CX1 CX2
CC
XTAL
从属模式 振荡模式
周立功单片机
系统时钟小节目录
• 系统时钟概述
• 晶体振荡器()
• PLL()
• VPB分频器()
周立功单片机
系统时钟
• 锁相环(PLL)
由晶体振荡器输出的时钟信号,通过PLL升
频,可以获得更高的系统时钟(CCLK)。
PLL接受的输入时钟频率范围为10~25MHz,
通过一个电流控制振荡器(CCO)倍增到10~
60MHz。
PLL
晶体
振荡器
VPB分频器
FCCLK
FPCLK
FOSC
10MHz~25MHz
10MHz~60MHz
PLL
周立功单片机
• PLL内部结构
相位频率
检测 CCO
1
0
2P
分频
M
分频
0
1
0
1
FOSC
FCCO FCLK
晶体振荡器
输入时钟
对输入的两路时钟
信号进行相位频率
检测,将两者差值
以电流形式输出
电流控制振
荡器,根据
输入电流控
制振荡频率
对输入时钟
分频
输入时钟
2选1开关
周立功单片机
• PLL内部结构
相位频率
检测 CCO
1
0
2P
分频
M
分频
0
1
0
1
FOSC
FFFFCCOCCOCCOCCO FCLK
FFFFCCO CCO CCO CCO / 2P/ 2P/ 2P/ 2P
FFFFCCO CCO CCO CCO / (2P/ (2P/ (2P/ (2P****M)M)M)M)
CCO自由振荡,
输出频率FCCOCCOCCOCCO
根据两个输入时钟的
相位偏差,控制CCO。当
两个时钟相位同步时,回
路锁定。
周立功单片机
• PLL相关寄存器
相位频率
检测 CCO
1
0
2P
分频
M
分频
0
1
0
1
FOSC
FCCO FCLK
PLL控制寄存器(PLLCON):
功能
位
PLLEPLLC------
01234567
PLLE:PLL使能,该位为1时将激活PLL并允许其锁定到指定的频率;
PLLC:PLL连接,当PLLE为1,并且在PLL锁定后,该位为1,将把PLL作为时钟源
连接到CPU,否则直接使用振荡器时钟。
PLLCPLLCPLLCPLLC
PLLEPLLEPLLEPLLE
周立功单片机
相位频率
检测 CCO
1
0
2P
分频
M
分频
0
1
0
1
FOSC
FCCO FCLK
功能
位
PLLEPLLC------
01234567
注:其中“-”表示该位保留,用户不要向该位写入1,读取的值将不确定
PLLCPLLCPLLCPLLC
PLLEPLLEPLLEPLLE
• PLL相关寄存器
PLL控制寄存器(PLLCON):
周立功单片机
相位频率
检测 CCO
1
0
2P
分频
M
分频
0
1
0
1
FOSC
FCCO FCLK
PLL已经使能,并连接到处理器作为系统时钟源。11
与00组合相同。避免PLL已连接,当还没有使能的情况。01
PLL被激活但是尚未连接。可以在PLOCK置位后连接。10
PLL被关闭,并断开连接。00
PLL功能PLLEPLLC
PLLCPLLCPLLCPLLC
PLLEPLLEPLLEPLLE
• PLL相关寄存器
PLL控制寄存器(PLLCON):
周立功单片机
相位频率
检测 CCO
1
0
2P
分频
M
分频
0
1
0
1
FOSC
FCCO FCLK
PLL配置寄存器(PLLCFG):
功能
位
MSEL[4:0]PSEL[1:0]-
01234567
MSEL[4:0]:PLL倍频器值,在PLL频率计算中其值为(M-1);
PSEL[1:0]:PLL分频器值,在PLL频率计算中其值为P 。
• PLL相关寄存器
周立功单片机
相位频率
检测 CCO
1
0
2P
分频
M
分频
0
1
0
1
FOSC
FCCO FCLK
PLL状态寄存器(PLLSETA):
MSEL[4:
0]
PSEL[1:0]-PLLE功能
位
PLLCPLOC
K
-
4 : 06 : 57891015 : 11
MSEL[4:0]、PSEL[1:0]、PLLE、PLLC:读出反映这几个参数的设置值,写入无效;
PLOCK:反映PLL的锁定状态。为0时,PLL未锁定;为1时,PLL锁定到指定频率。
• PLL相关寄存器
周立功单片机
相位频率
检测 CCO
1
0
2P
分频
M
分频
0
1
0
1
FOSC
FCCO FCLK
PLL馈送寄存器(PLLFEED):
PLLFEDD[7:0]:PLL馈送序列必须写入该寄存器才能使PLL配置和控制寄存器的更
改生效;
功能
位
PLLFEED[7:0]
01234567
• PLL相关寄存器
周立功单片机
相位频率
检测 CCO
1
0
2P
分频
M
分频
0
1
0
1
FOSC
FCCO FCLK
馈送序列为:
1.将值0xAA写入PLLFEED;
2.将值0x55写入PLLFEED。
功能
位
PLLFEED[7:0]
01234567
• PLL相关寄存器
PLL馈送寄存器(PLLFEED):
周立功单片机
• PLL频率计算
回路锁定后:FOSC = FCCOCCOCCOCCO / (2P × M)
FCLK = FOSC × M
相位频率
检测 CCO
1
0
2P
分频
M
分频
0
1
0
1
FOSC
FFFFCCOCCOCCOCCO FCLK
FFFFCCO CCO CCO CCO / 2P/ 2P/ 2P/ 2P
FFFFCCO CCO CCO CCO / (2P/ (2P/ (2P/ (2P****M)M)M)M)
FOSC:晶振频率;
FCCO :CCO振荡器输出频率
FCCLK:处理器时钟频率;
M:PLL倍频值
P:PLL分频值
必须满足的条件:
FOSC范围:10MHz~25MHz;
FCCLK范围:10MHz~60MHz;
FCCO范围:156MHz~320MHz;
周立功单片机
系统时钟
• 锁相环(PLL)计算流程
1111.选择处理器的
工作频率(CCLK)
2222.选择振荡器
频率(FOSC)
3333.计算M值
配置MSEL位
4444.计算P值
配置PSEL位
根据处理器的整体
要求、UART波特率的
支持等因素来决定。外
围器件的时钟频率可以
低于处理器频率
CCLK 必须为FOSC的
整数倍。
M = CCLK / FOSC,
取值范围1~32。写入
MSEL的值为(M-1)。 选择合适的P值,使
FCCO在限制范围内。P只
能取1、2、4或8。写入
PSEL的值为P。
周立功单片机
系统时钟
• 锁相环(PLL)计算实例
系统要求:FOSC=10MHz、CCLK= 60MHz
1.计算M值:M= CCLK / FOSC =6 ;
2.设置MSEL位:写入值为(M-1)=5;
3. 设置PSEL位:P=FCCO/(CCLK×2)
=(156~320)/120=~
所以P取整数2,PSEL写入值为2。
周立功单片机
系统时钟
• 锁相环(PLL)注意要点
�PLL在芯片复位或进入掉电模式时被关闭并旁
路,在掉电唤醒后不会自动恢复PLL的设定;
�PLL只能通过软件使能;
�PLL在激活后必须等待其锁定,然后才能连接;
�PLL如果设置不当将会导致芯片的错误操作。
周立功单片机
系统时钟小节目录
• 系统时钟概述
• 晶体振荡器()
• PLL()
• VPB分频器()
周立功单片机
系统时钟
• VPB分频器
VPB分频器将PLL输出的时钟信号分频后作为
芯片外设的时钟。
PLL
晶体
振荡器
VPB分频器
FCCLK
FPCLK
FOSC
VPB分频器
周立功单片机
系统时钟
• VPB分频器
VPB分频器决定处理器时钟(CCLK)与外设
器件所使用的时钟(PCLK)之间的关系。
VPB用途1:通过VPB总线为外设提供所需的PCLK
时钟,以便外设在合适的速度下工作;
VPB用途2:在应用不需要任何外设全速运行时使
功耗降低。
周立功单片机
系统时钟
• VPB分频器相关寄存器
--XCLKDIV[1:0]- VPBDIV[1:0]功能
位
-
01234567
VPB分频寄存器(VPBDIV):
VPBDIV[1:0]:设置分频值,可以设定3个值;
XCLKDIV[1:0]:这些位用于控制LPC2200系列微控制器A23/XCLK引脚上的时
钟驱动,取值编码方式与VPBDIV相同;
周立功单片机
系统时钟
• VPB分频器相关寄存器
--XCLKDIV[1:0]- VPBDIV[1:0]功能
位
-
01234567
VPB分频寄存器(VPBDIV):
保留。写入该值将不改变分频值。11
VPB总线时钟为处理器时钟的1/2。10
VPB总线时钟与处理器时钟相同。01
VPB总线时钟为处理器时钟的1/4。00
说明VPBDIV[1:0]
周立功单片机
• 系统时钟初始化流程
使能PLL
设置VPB
分频值
PLL馈送序列
等待PLL锁定
设置PLL
分频值
连接PLL
PLL馈送序列
周立功单片机
• 系统时钟初始化——启动代码实例
//应当与实际一至晶振频率,10MHz~25MHz,应当与实际一至
#define Fosc 11059200
//系统频率,必须为Fosc的整数倍(1~32),且<=60MHZ
#define Fcclk (Fosc * 4)
//CCO频率,必须为Fcclk的2、4、8、16倍,范围为156MHz~320MHz
#define Fcco (Fcclk * 4)
//VPB时钟频率,只能为(Fcclk / 4)的1、2、4倍
#define Fpclk (Fcclk / 4) * 1
将系统内各时钟的频率定义为宏,方便用户操作。
设置晶
振频率
设置内核
工作频率
设置CCO
输出频率
设置外设
工作频率
周立功单片机
• 系统时钟初始化——启动代码实例
使能PLL
设置VPB
分频值
PLL馈送序列
等待PLL锁定
设置PLL
分频值
连接PLL
PLL馈送序列
使能PLL
设置VPB
分频值
C代码分析:
PLLCON = 1;
#if (Fpclk / (Fcclk / 4)) == 1
VPBDIV = 0;
#endif
#if (Fpclk / (Fcclk / 4)) == 2
VPBDIV = 2;
#endif
#if (Fpclk / (Fcclk / 4)) == 4
VPBDIV = 1;
#endif
. . .注意:在启动代码中很多地方使用了条件编译的
方法,根据用户定义的宏来决定要设置的值,可
以方便用户使用。
周立功单片机
• 系统时钟初始化——启动代码实例
使能PLL
设置VPB
分频值
PLL馈送序列
等待PLL锁定
设置PLL
分频值
连接PLL
PLL馈送序列
设置PLL
分频值
C代码分析:
. . .
#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=((Fcclk/Fosc)-1)|(3<<5);
. . .
周立功单片机
• 系统时钟初始化——启动代码实例
使能PLL
设置VPB
分频值
PLL馈送序列
等待PLL锁定
设置PLL
分频值
连接PLL
PLL馈送序列
PLL馈送序列
等待PLL锁定
连接PLL
PLL馈送序列
C代码分析:
. . .
PLLFEED = 0xaa;
PLLFEED = 0x55;
while((PLLSTAT & (1 << 10)) == 0);
PLLCON = 3;
PLLFEED = 0xaa;
PLLFEED = 0x55;
注意:在修改PLL的控制和配置寄存器
后,必须写入馈送序列,使修改生效。
周立功单片机
系统控制模块小节目录
�系统控制模块概述
�系统时钟
�复位
�外部中断
�存储器映射控制
�功率控制
�唤醒定时器
周立功单片机
复位
• 复位的分类
�外部复位
—把nRESET引脚拉为低电平,并保持一个最小时间,引发
复位
�看门狗复位
—通过设置看门狗相关寄存器,当看门狗定时器溢出后,引
发复位
周立功单片机
复位
• 外部复位
外部复位引脚(nRESET)连接内部的施密特触发
器,通过施密特触发器可以滤除引脚输入的干扰信号,
保证复位的可靠性。如果外部复位信号一直有效,芯片
将保持复位状态。
注意:
如果芯片使用了外部晶体,上电后nRESET引脚的复
位信号必须保持至少10ms,以便产生稳定的振荡信号。
如果晶振已经稳定运行且X1引脚上以出现稳定信号时,
nRESET引脚的复位信号只需保持至少300ns时间。
周立功单片机
1. 在芯片未上电时,芯片振荡器没有工作;
复位
UX1
t
LPC2xxx
nRESET
电源输入
X1
X2
• 外部复位
周立功单片机
复位
振荡器稳定需要一段时间
UX1
t
LPC2xxx
nRESET
电源输入
X1
X2
• 外部复位
2. 芯片上电后,晶体振荡器开始振荡。因为振荡从开
始到稳定需要一过程,所以外部复位信号至少要保持
10ms;
>=10ms
周立功单片机
>=300ns
复位
UX1
t
此时振荡器稳定工作
• 外部复位
LPC2xxx
nRESET
电源输入
X1
X2
3. 在晶体振荡器保持稳定振荡,或者使用有源钟振
时,外部复位信号可以缩短到不小于300ns;
周立功单片机
复位
任何复位源引起的芯片复位都会启动唤醒定时器,
当计数到一个固定个数的时钟时,处理器开始执行指令。
这确保振荡器和芯片所需要的其它模拟电路在处理器开
始执行指令之前能够正确工作。
• 外部复位与内部看门狗复位的共同点
周立功单片机
复位
• 外部复位与内部看门狗复位的区别
外部复位将把某几个特定引脚的值锁存,来决定系
统复位后的状态,而看门狗(WDT)复位则无此功能。
检测引脚 锁存状态 对应功能
0 ~作为跟踪端口
0 ~作为调试端口
0 进入ISP状态
BOOT1、BOOT2 全1 内部Flash启动,否则外部启动
周立功单片机
复位
• 复位后的系统状态
芯片被复位后,处理器和外设寄存器都恢复为默认
状态。程序计数器(PC)值为0,即CPU复位后运行的
第一条代码位于0x00000000处。此时位于该地址的程序
并不位于片内Flash,而是来自Boot Block的异常向量表
的重新映射。通过异常向量表的复位异常入口,程序跳
转至Boot Block中执行Boot程序。
周立功单片机
复位
• 复位后的系统状态
Flash
SRAM
Boot Block
AHB & VPB
0x00000000
0xFFFFFFFF
0x40000000
0x80000000
地址空间
1. 复位后用户见到的存储器分布
周立功单片机
2. BootBlock中的异常向量表重新
映射
复位
• 复位后的系统状态
Flash
SRAM
Boot Block
AHB & VPB
0x00000000
0xFFFFFFFF
0x40000000
0x80000000
地址空间
复位异常入口
未定义异常入口
软件中断入口
. . .
0x00000000
0x00000004
0x00000008
0x00000040
周立功单片机
PC指向
3. PC指向0x0000地址处,CPU执
行复位后的第一条指令
复位
• 复位后的系统状态
Flash
SRAM
Boot Block
AHB & VPB
0x00000000
0xFFFFFFFF
0x40000000
0x80000000
地址空间
复位异常入口
未定义异常入口
软件中断入口
. . .
0x00000004
0x00000008
0x00000040
周立功单片机
4. 通过跳转指令,程序跳入Boot
Block,执行Boot程序。
复位
• 复位后的系统状态
PC指向 Flash
SRAM
Boot Block
AHB & VPB
0x00000000
0xFFFFFFFF
0x40000000
0x80000000
地址空间
复位异常入口
未定义异常入口
软件中断入口
. . .
0x00000004
0x00000008
0x00000040
周立功单片机
复位
• Boot程序
Boot程序是芯片生产厂家固化在芯片中的一段代码,
它完成芯片复位后的初始化操作,并提供实现Flash编程
的方法。Boot装载程序可启动对空片的编程、已编程器件
的擦除和再编程,以及在运行的系统中由应用程序对
Flash存储器进行编程。
周立功单片机
• Boot程序工作流程——LPC2114/2124
复位
运行ISP服务程序
看门狗复位
根据硬件
(、)
配置
进入ISP状态吗?
(为低)
初始化
用户代码
是否有效
执行用户代码
(片内Flash:
0x00000000)
N
Y
Y
Y
N
N
在此检测特定引脚
检测用户代码是否有效
周立功单片机
• Boot程序工作流
程——LPC2210/2212/2214
复位
看门狗复位
进入ISP模式?
(为低)
初始化
用户代码
是否有效
芯片加密 允许调试
外部引导
芯片加密
运行ISP服务程序 执行外部用户代码(0x80000000)
执行内部用户代码
(0x00000000)
N
N
Y
Y N
N
NN
Y
Y
Y
Y
在此检测特定引脚
检测用户代码是否有效
周立功单片机
复位
• 有效用户代码的判别
LPC2000系列微控制器规定 “内部Flash中向量表所有
数据的32位累加为零”时,判定内部Flash中的代码为有效
可执行代码。即只有当向量表所有数据32位累加和为零
时,用户的程序才能脱机运行。
周立功单片机
• 有效用户代码的判别
CODE32
AREA vectors,CODE,READONLY
ENTRY
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
. . .
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr
ResetAddr DCD ResetInit
UndefinedAddr DCD Undefined
. . .
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
异常向量表
前32字节为异常入口
后32字节为跳转地址
周立功单片机
• 有效用户代码的判别
Reset
[0xe59ff018] ldr pc,ResetAddr
[0xe59ff018] ldr pc,UndefinedAddr
. . .
[0xb9205f80] dcd 0xb9205f80
[0xe51ffff0] ldr pc,0x7ffff030
[0xe59ff018] ldr pc,FIQ_Addr
ResetAddr
[0x8000008c] dcd 0x8000008c
UndefinedAddr
[0x80000040] dcd 0x80000040
. . .
Nouse
[0x00000000] dcd 0x00000000
IRQ_Addr
[0x00000000] dcd 0x00000000
FIQ_Addr
[0x8000004c] dcd 0x8000004c
异常向量表反汇编代码
前32字节为异常入口
后32字节为跳转地址
周立功单片机
• 有效用户代码的判别
Reset
[0xe59ff018] ldr pc,ResetAddr
[0xe59ff018] ldr pc,UndefinedAddr
. . .
[0xb9205f80] dcd 0xb9205f80
[0xe51ffff0] ldr pc,0x7ffff030
[0xe59ff018] ldr pc,FIQ_Addr
ResetAddr
[0x8000008c] dcd 0x8000008c
UndefinedAddr
[0x80000040] dcd 0x80000040
. . .
Nouse
[0x00000000] dcd 0x00000000
IRQ_Addr
[0x00000000] dcd 0x00000000
FIQ_Addr
[0x8000004c] dcd 0x8000004c
异常向量表反汇编代码
指令的机器码
指令
周立功单片机
• 有效用户代码的判别
Reset
[0xe59ff018] ldr pc,ResetAddr
[0xe59ff018] ldr pc,UndefinedAddr
. . .
[0xb9205f80] dcd 0xb9205f80
[0xe51ffff0] ldr pc,0x7ffff030
[0xe59ff018] ldr pc,FIQ_Addr
ResetAddr
[0x8000008c] dcd 0x8000008c
UndefinedAddr
[0x80000040] dcd 0x80000040
. . .
Nouse
[0x00000000] dcd 0x00000000
IRQ_Addr
[0x00000000] dcd 0x00000000
FIQ_Addr
[0x8000004c] dcd 0x8000004c
异常向量表反汇编代码
8条指令的机器码累
加和为0,表示用户
代码有效
周立功单片机
Reset
[0xe59ff018] ldr pc,ResetAddr
[0xe59ff018] ldr pc,UndefinedAddr
. . .
[0xb9205f80] dcd 0xb9205f80
[0xe51ffff0] ldr pc,0x7ffff030
[0xe59ff018] ldr pc,FIQ_Addr
ResetAddr
[0x8000008c] dcd 0x8000008c
UndefinedAddr
[0x80000040] dcd 0x80000040
. . .
Nouse
[0x00000000] dcd 0x00000000
IRQ_Addr
[0x00000000] dcd 0x00000000
FIQ_Addr
[0x8000004c] dcd 0x8000004c
异常向量表反汇编代码
8条指令的机器码累
加和为0,表示用户
代码有效
• 有效用户代码的判别
[0x00000000][0x00000000][0x00000000][0x00000000]
[0xe59ff018][0xe59ff018][0xe59ff018][0xe59ff018]
[0xe59ff018][0xe59ff018][0xe59ff018][0xe59ff018]
. . .. . .. . .. . .
[0xb9205f80][0xb9205f80][0xb9205f80][0xb9205f80]
[0xe51ffff0][0xe51ffff0][0xe51ffff0][0xe51ffff0]
[0xe59ff018][0xe59ff018][0xe59ff018][0xe59ff018]
跳转地址数据不在
累加范围内
通过调整该保留字,
使累加和为0
周立功单片机
系统控制模块小节目录
�系统控制模块概述
�系统时钟
�复位
�外部中断
�存储器映射控制
�功率控制
�唤醒定时器
周立功单片机
外部中断
• 外部中断
外部中断是通过引脚输入符合要求的信号而触
发的中断。LPC2114/2124/2212/2214含有4个外部
中断输入(作为可选引脚功能,通过PINSEL0/1寄
存器设置相应管脚为外部中断功能)。外部中断输
入可用于将处理器从掉电模式唤醒。
周立功单片机
管脚
连接控制
外部中断
极性控制
外部中断
方式控制
掉电
唤醒控制
中断标志
CPU
其它部件
PINSELx
EXTPOLAR EXTMODE
EXTINT
EXTWAKE
外部中断
• 外部中断内部示意图
2.控制某几个引脚作为外部中断输入;
管脚
连接控制
1.可作为外部中断输入的引脚;
外部中断
极性控制
外部中断
方式控制
掉电
唤醒控制
中断标志
3.控制触发外部中断的信号波形;
4.控制外部中断产生后是否唤醒CPU;
5.外部中断产生后设置的标志位;
(2)
(1)
(3) (3)
(4)
(5)
周立功单片机
• 外部中断相关寄存器
外部中断极性控制寄存器(EXTPOLAR):
功能
位
EXTPOLAR
0
EXTPOLAR
1
EXTPOLAR
2
EXTPOLAR
3
-
01237 : 4
该寄存器控制着外部中断输入信号的极性,其中低四位(EXTPOLAR[3:0])
分别对应外部中断3~0。
管脚
连接控制
外部中断
极性控制
外部中断
方式控制
掉电
唤醒控制
中断标志
CPU
其它部件
PINSELx
EXTPOLAR EXTMODE
EXTINT
EXTWAKE
外部中断
极性控制
周立功单片机
• 外部中断相关寄存器
外部中断3 外部中断2 外部中断1 外部中断0
(EINT3) (EINT2) (EINT1) (EINT0)
分别控制着
• 外部中断相关寄存器
外部中断极性控制寄存器(EXTPOLAR):
功能
位
EXTPOLAR
0
EXTPOLAR
1
EXTPOLAR
2
EXTPOLAR
3
-
01237 : 4
管脚
连接控制
外部中断
极性控制
外部中断
方式控制
掉电
唤醒控制
中断标志
CPU
其它部件
PINSELx
EXTPOLAR EXTMODE
EXTINT
EXTWAKE
周立功单片机
当EXTPOLARx设置为1时EINTx引脚输入信号高电平或上升沿有效。
当EXTPOLARx设置为0时EINTx引脚输入信号低电平或下降沿有效。
• 外部中断相关寄存器• 外部中断相关寄存器
外部中断极性控制寄存器(EXTPOLAR):
功能
位
EXTPOLAR
0
EXTPOLAR
1
EXTPOLAR
2
EXTPOLAR
3
-
01237 : 4
管脚
连接控制
外部中断
极性控制
外部中断
方式控制
掉电
唤醒控制
中断标志
CPU
其它部件
PINSELx
EXTPOLAR EXTMODE
EXTINT
EXTWAKE
周立功单片机
• 外部中断相关寄存器
外部中断方式控制寄存器(EXTMODE):
功能
位
EXTMODE0EXTMODE1EXTMODE2EXTMODE3-
01237 : 4
该寄存器控制着外部中断输入信号的有效触发方式,其中低四位
(EXTMODE [3:0])分别对应外部中断3~0。
• 外部中断相关寄存器
管脚
连接控制
外部中断
极性控制
外部中断
方式控制
掉电
唤醒控制
中断标志
CPU
其它部件
PINSELx
EXTPOLAR EXTMODE
EXTINT
EXTWAKE
外部中断
方式控制
周立功单片机
当EXTMODEx设置为0时输入信号为电平触发有效。
当EXTMODEx设置为1时输入信号为边沿触发有效。
• 外部中断相关寄存器
外部中断方式控制寄存器(EXTMODE):
功能
位
EXTMODE0EXTMODE1EXTMODE2EXTMODE3-
01237 : 4
• 外部中断相关寄存器
管脚
连接控制
外部中断
极性控制
外部中断
方式控制
掉电
唤醒控制
中断标志
CPU
其它部件
PINSELx
EXTPOLAR EXTMODE
EXTINT
EXTWAKE
周立功单片机
• 外部中断相关寄存器
极性与方式控制的组合关系:
• 外部中断相关寄存器
管脚
连接控制
外部中断
极性控制
外部中断
方式控制
掉电
唤醒控制
中断标志
CPU
其它部件
PINSELx
EXTPOLAR EXTMODE
EXTINT
EXTWAKE
上升沿
高电平
下降沿
低电平
说明波形
11
01
10
00
外部中断触发信号外部中断方式
控制寄存器
(EXTMODE)
外部中断极性
控制寄存器
(EXTPOLAR)
周立功单片机
• 外部中断相关寄存器
外部中断唤醒寄存器(EXTWAKE):
功能
位
EXTWAKE0EXTWAKE1EXTWAKE2EXTWAKE3-
01237 : 4
设置该寄存器允许相应的外部中断将处理器从掉电模式唤醒。实现掉
电唤醒不需要在向量中断控制器(VIC)中使能相应的中断。该寄存器的低
四位(EXTWAKE[3:0])分别对应外部中断3~0。
管脚
连接控制
外部中断
极性控制
外部中断
方式控制
掉电
唤醒控制
中断标志
CPU
其它部件
PINSELx
EXTPOLAR EXTMODE
EXTINT
EXTWAKE
掉电
唤醒控制
周立功单片机
• 外部中断相关寄存器
当EXTWAKEx设置为1时对应的外部中断将处理器从掉电模式唤醒。
外部中断唤醒寄存器(EXTWAKE):
功能
位
EXTWAKE0EXTWAKE1EXTWAKE2EXTWAKE3-
01237 : 4
管脚
连接控制
外部中断
极性控制
外部中断
方式控制
掉电
唤醒控制
中断标志
CPU
其它部件
PINSELx
EXTPOLAR EXTMODE
EXTINT
EXTWAKE
周立功单片机
• 外部中断相关寄存器
外部中断标志寄存器(EXTINT):
功能
位
EINT0EINT1EINT2EINT3-
01237 : 4
若引脚上出现了符合要求的信号,EXTINT寄存器中对应的中断标志将
被置位。向该寄存器的EINT0~EINT3位写入1,可将其清零。
管脚
连接控制
外部中断
极性控制
外部中断
方式控制
掉电
唤醒控制
中断标志
CPU
其它部件
PINSELx
EXTPOLAR EXTMODE
EXTINT
EXTWAKE
中断标志
周立功单片机
注意:在电平触发方式下,清除中断标志只有在引脚处于无效状态时才可
实现。比如设置为低电平中断,则只有在中断引脚恢复为高电平后才能清
除中断标志。
• 外部中断相关寄存器
外部中断标志寄存器(EXTINT):
功能
位
EINT0EINT1EINT2EINT3-
01237 : 4
管脚
连接控制
外部中断
极性控制
外部中断
方式控制
掉电
唤醒控制
中断标志
CPU
其它部件
PINSELx
EXTPOLAR EXTMODE
EXTINT
EXTWAKE
周立功单片机
外部中断
• 外部中断引脚设置
通过软件设置引脚选择寄存器(PINESLEx),
可以将多个引脚同时作为同一个外部中断的输入引
脚。EINT3~EINT0外部中断的逻辑电路接收所有
与之相连引脚的状态和信号。
周立功单片机
外部中断
• 外部中断引脚设置
根据其方式位和极性位的不同,外部中断逻
辑处理如下:
�低电平触发方式:作为EINT功能的全部引脚的状
态相与后作为输入信号;
�高电平触发方式:作为EINT功能的全部引脚的状
态相或后作为输入信号;
�边沿触发方式:只使用GPIO端口号最低的那个引
脚,并且与极性设置无关。
周立功单片机
外部中断
• 外部中断应用示例1——设置EINT0为低电平触发中断
...
PINSEL1 = (PINSEL1 & 0xFFFFFFFC) | 0x01;
EXTMODE &= 0x0E;
EXTPOLAR &= 0x0E;
...
C代码:
1.设置引脚连接模块,将设置为外部中断功能;
2.设置中断方式寄存器,将外部中断0设置为电平触发;
3.设置中断极性寄存器,将外部中断0设置为低电平触发;
步骤:
(1)
(2)
(3)
周立功单片机
外部中断
• 外部中断应用示例2——设置EINT0为下降沿触发中断
...
PINSEL1 = (PINSEL1 & 0xFFFFFFFC) | 0x01;
EXTMODE |= 0x01;
EXTPOLAR &= 0x0E;
...
C代码:
1.设置引脚连接模块,将设置为外部中断功能;
2.设置中断方式寄存器,将外部中断0设置为边沿触发;
3.设置中断极性寄存器,将外部中断0设置为下降沿触发;
步骤:
(1)
(2)
(3)
周立功单片机
外部中断
• 使用外部中断注意要点
�把某个引脚设置为外部中断功能后,该引脚为输
入模式,由于没有内部上拉电阻,所以必须外接一
个上拉电阻,确保引脚不被悬空;
�除了引脚连接模块的设置,还需确设置VIC模
块,才能产生外部中断,否则外部中断只能反映在
EXTINT寄存器中。
�要使器件进入掉电模式并通过外部中断唤醒,软
件应该正确设置引脚的外部中断功能,再进入掉电
模式。
周立功单片机
系统控制模块小节目录
�系统控制模块概述
�系统时钟
�复位
�外部中断
�存储器映射控制
�功率控制
�唤醒定时器
周立功单片机
存储器映射控制
• 存储器映射控制的作用
“存储器映射控制”用于控制地址范围为
0x0000 ~0x003F存储区域的重新映射。该区域存放
着异常向量表。
周立功单片机
AREA vectors,CODE,READONLY
ENTRY
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
. . .
当发生异常时,程序总是跳转到地址为0x0000~
0x003F的对应入口处,在该地址范围内存储有异常向
量表。
指令未定义中止入口
软件中断入口
取数据中止入口
预取指中止入口
复位入口
. . .
• 存储器映射控制的必要性
异常向量表
周立功单片机
AREA vectors,CODE,READONLY
ENTRY
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
. . .
• 存储器映射控制的必要性
复位后用户看
见的地址空间
Flash
SRAM
BootBlock
VPB外设
AHB外设
0x00000000
0xFFFFFFFF
0x40000000
0xE0000000
0x80000000
片外存储器
可能存在的
程序存储器
Flash
SRAM
BootBlock
片外存储器
异常向量表
周立功单片机
AREA vectors,CODE,READONLY
ENTRY
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
. . .
Flash
SRAM
BootBlock
VPB外设
AHB外设
0x00000000
0xFFFFFFFF
0x40000000
0xE0000000
0x80000000
片外存储器
异常向量表 内部Flash可以来自
• 存储器映射控制的必要性
复位后用户看
见的地址空间
周立功单片机
内部SRAM
AREA vectors,CODE,READONLY
ENTRY
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
. . .
Flash
SRAM
BootBlock
VPB外设
AHB外设
0x00000000
0xFFFFFFFF
0x40000000
0xE0000000
0x80000000
片外存储器
异常向量表可以来自
• 存储器映射控制的必要性
复位后用户看
见的地址空间
周立功单片机
Boot Block
AREA vectors,CODE,READONLY
ENTRY
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
. . .
Flash
SRAM
BootBlock
VPB外设
AHB外设
0x00000000
0xFFFFFFFF
0x40000000
0xE0000000
0x80000000
片外存储器
异常向量表可以来自
• 存储器映射控制的必要性
复位后用户看
见的地址空间
周立功单片机
外部存储器
AREA vectors,CODE,READONLY
ENTRY
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
. . .
Flash
SRAM
BootBlock
VPB外设
AHB外设
0x00000000
0xFFFFFFFF
0x40000000
0xE0000000
0x80000000
片外存储器
异常向量表可以来自
• 存储器映射控制的必要性
复位后用户看
见的地址空间
为了让运行在不同存储器空间中的程序对异常
进行控制。可以通过存储器映射控制,将位于不同
存储空间的异常向量表重新映射至固定地址0x00~
0x3F处,以实现异常向量表的来源控制。
周立功单片机
存储器映射控制寄存器(MEMMAP)是一个可读可写的寄存器 。
MAP[1:0] :用于存储器映射控制,实现部分地址的重新映射;
-:表示该位保留。
功能
位
MAP[1:0]------
01234567
PLL控制寄存器(PLLCON):
存储器映射控制
• 存储器映射控制寄存器描述
周立功单片机
MEMMAP为不同值时,ARM内核发生异常,程序跳转到异常向量表
的来源也不相同。
外部存储器模式。异常向量表从外部存储器重新映
射。该模式仅适用于LPC2200系列。11
片内RAM模式。异常向量表从静态RAM重新映射。10
片内Flash模式。异常向量表不重新映射,它位于
Flash中。01
Boot装载程序模式。异常向量表从Boot Block重新
映射。00
映射方式MAP[1:0]
存储器映射控制
• 存储器映射控制寄存器描述
周立功单片机
存储器映射控制
• MEMMAP在芯片复位后被修改的条件
2212/2214
从内部Flash执行程
序01
1.引脚BOOT1:0全为高电平
2.片内Flash中用户代码有效
LPC2210/2212/22
14
从外部Flash执行程
序11
1.引脚BOOT1:0不全为高电
平
2.芯片没有加密
LPC2114/2124
从内部Flash执行用
户程序01片内Flash中用户代码有效
微控制器型号说明MAP[1:0]判断条件
在芯片复位时,MEMMAP值为0。首先得到运行的Boot程序,根据
上表最左栏的判断条件来修改MEMMAP值。上表不包括的其它情况,
MEMMAP值均为0x00。
周立功单片机
• Boot程序对MEMMAP的影响——LPC2114/2124
进入ISP状态吗?
(为低)
复位
运行ISP服务程序
看门狗复位
根据硬件
(、)
配置
初始化
用户代码
是否有效
执行用户代码
(片内Flash:
0x00000000)
N
Y
Y
Y
N
N
在此检测特定引脚
检测用户代码是否有效
复位后
MEMMAP=00
其它情况下
MEMMAP=00
用户代码有效且为高电平
MEMMAP=01
复位
运行ISP服务程序
执行用户代码
(片内Flash:
0x00000000)
周立功单片机
• Boot程序对MEMMAP的影响——LPC2210/2212/2214
复位
看门狗复位
进入ISP模式?
(为低)
初始化
用户代码
是否有效
芯片加密 允许调试
外部引导
芯片加密
运行ISP服务程序 执行外部用户代码(0x80000000)
执行内部用户代码
(0x00000000)
N
N
Y
Y N
N
NN
Y
Y
Y
Y
在此检测特定引脚
检测用户代码是否有效
复位复位后MEMMAP=00
其它情况下
MEMMAP=00
BOOT引脚全为高且
用户代码有效
MEMMAP=01
运行ISP服务程序 执行外部用户代码(0x80000000)
执行内部用户代码
(0x00000000)
芯片未加密且
BOOT引脚不全为高
MEMMAP=11
周立功单片机
0x00000000
0x40000000
0x80000000
0x7FFFE000
存 储 空 间 0xFFFFFFFF
内核地址总线 存储器地址总线
内部Flash
内部SRAM
外 部 存 储 器
Boot Block
异 常 向 量 表
32位 ARM指令
0x0000003F
0x4000003F
0x7FFFE03F
0x8000003F
地 址 转 换 器
0x00000000
0x0000003F
0x00000040
映射的目标存储块
MEMMAP
1 1
0 0
1 0
0 1
内核执行的异常向
量表地址范围
地址转换器 物理存储器
的地址空间
内核与物理存储器的关系
• 存储器映射控制原理
周立功单片机
0x00000000
0x40000000
0x80000000
0x7FFFE000
存 储 空 间 0xFFFFFFFF
内核地址总线 存储器地址总线
内部Flash
内部SRAM
外 部 存 储 器
Boot Block
异 常 向 量 表
32位 ARM指令
0x0000003F
0x4000003F
0x7FFFE03F
0x8000003F
地 址 转 换 器
0x00000000
0x0000003F
0x00000040
映射的目标存储块
MEMMAP
1 1
0 0
1 0
0 1
1.内核产生地址 2.经过地址转
换器
3.映射到物理
存储器地址
存储器映射的流程
• 存储器映射控制原理
周立功单片机
存储器映射控制
• 存储器映射控制重新映射前后地址
对应不变任意0x00000040~0xFFFFFFFF
0x80000000~0x8000003F11
0x40000000~0x4000003F10
0x00000000~0x0000003F01
0x7FFFE000~
0x7FFFE03F
00
0x00000000~
0x0000003F
转换后
存储器地址总线值MEMMAP值
转换前
内核地址总线值
周立功单片机
复位后用户看
见的地址空间
Flash
SRAM
BootBlock
VPB外设
AHB外设
0x00000000
0xFFFFFFFF
0x40000000
0xE0000000
0x80000000
片外存储器
存储器映射控制
• 存储器映射控制重新映射前后地址
0 1MEMMAP[1:0]= 1 00 01 1
不重新映射
周立功单片机
存储器映射控制
• Remap应用实例——中断向量表位于片内RAM
在某些应用中,为了能动态修改异常向量表的
内容,需要把异常向量表放在RAM中,并设置存储
器映射控制寄存器(MEMMAP)。
周立功单片机
1.将异常向量表从Flash
中复制到内部SRAM的
0x40000000 到
0x4000003F地址处
操作流程
2.设置MEMMAP值为2
Vectors
地 址 空 间
内部Flash
Vectors+3F
0x40000000
0x4000003F
内部SRAM
存储器映射控制
• Remap应用实例——中断向量表位于片内RAM
周立功单片机
. . .
cp1 = uint32(Vectors);
cp2 = 0x40000000;
for(i=0; i<16; i++)
{
*cp2++ = *cp1++;
}
MEMMAP = 2;
. . .
程序代码
存储器映射控制
• Remap应用实例——中断向量表位于片内RAM
1.将异常向量表从Flash
中复制到内部SRAM的
0x40000000 到
0x4000003F地址处
操作流程
2.设置MEMMAP值为2
周立功单片机
系统控制模块小节目录
�系统控制模块概述
�系统时钟
�复位
�外部中断
�存储器映射控制
�功率控制
�唤醒定时器
周立功单片机
功率控制
• 功率控制——描述
LPC2114/2124/2210/2212/2214支持两种节电
模式:空闲模式和掉电模式。另外还具有外设的功
率控制特性,允许独立关闭应用中不需要的外设,
这样可以进一步降低功耗。
周立功单片机
功率控制
• 功率控制——空闲模式
在该模式下,内核停止执行指令,直到发生复
位或中断为止,但系统时钟CCLK一直有效。外设
功能在空闲模式下继续保持并可产生中断使处理器
恢复运行。空闲模式使处理器、存储器系统和相关
控制器以及内部总线不再消耗功率。
周立功单片机
功率控制
• 功率控制——掉电模式
在该模式下,振荡器关闭,这样芯片没有任何
内部时钟。处理器状态和寄存器、外设寄存器以及
内部SRAM值在掉电模式下被保持。芯片引脚的逻
辑电平保持掉电时的状态。复位或特定的不需要时
钟仍能工作的中断可终止掉电模式并使芯片恢复正
常运行。由于掉电模式使芯片所有的动态操作都挂
起,因此芯片的功耗降低到几乎为零。
周立功单片机
功率控制
• 功率控制——两种模式对比
保持
保持
芯片状态
几乎为零复位、不需要时钟支持的中断
需要时钟支持的
外设停止工作无掉电
低复位、任何中断是有空闲
功耗唤醒方式外设工作内部时钟模式类别
周立功单片机
功率控制
• 功率控制——寄存器描述
功率控制寄存器(PCON):
该寄存器控制芯片的节电模式,下表为低两位的设置关系。
IDLPD------功能
01234567位
掉电模式11
掉电模式01
空闲模式10
正常工作00
芯片状态IDL位PD位
周立功单片机
功率控制
• 功率控制——寄存器描述
外设功率控制寄存器(PCONP):
该寄存器允许将所选的外设功能关闭以实现节电的目的。芯片中有部
分外设不能被关闭,分别为看门狗定时器、GPIO、引脚连接模块和系统控
制模块。
该寄存器的每个位都控制一个外设,由于LPC2210/2212/2214具有EMC
模块,而LPC2114/2114没有,所以它们的PCONP寄存器有所区别。
周立功单片机
功率控制
• 功率控制——寄存器描述
外设功率控制寄存器(PCONP)——2112/2114:
保留-6
I2CPCI2C7
PWM0PCPWM05
串口1PCURT14
串口0PCURT03
定时器1PCTIM12
定时器0PCTIM01
保留-0
控制外设功能位
保留-14
保留-15
保留-13
A/D转换器PCAD12
保留-11
SPI1接口PCSPI110
RTCPCRTC9
SPI0PCSPI08
控制外设功能位
周立功单片机
功率控制
• 功率控制——寄存器描述
外设功率控制寄存器(PCONP)——2210/2212/2214:
保留-6
I2CPCI2C7
PWM0PCPWM05
串口1PCURT14
串口0PCURT03
定时器1PCTIM12
定时器0PCTIM01
保留-0
控制外设功能位
保留-14
保留-15
保留-13
A/D转换器PCAD12
EMC部件PCEMC11
SPI1接口PCSPI110
RTCPCRTC9
SPI0PCSPI08
控制外设功能位
注意:在运行片外存储器的程序时,不要
设置PCEMC为0,否则由于EMC关闭,会
导致程序运行错误。
周立功单片机
功率控制
• 功率控制——注意要点
�芯片复位后,硬件设置PCONP的值为使能芯片
内所有的接口和外围模块。因此用户的应用程序除
了对外围部件的相关寄存器进行配置外,不需要为
了启用片内的某个外围功能而设置PCONP寄存
器;
�在需要控制功率的系统中,只要将应用中用到的
外围模块对应在PCONP寄存器的位置1,而寄存器
的其它“保留”位或当前无需使用的外围模块对应在
寄存器中的位都必须清零。
周立功单片机
系统控制模块小节目录
�系统控制模块概述
�系统时钟
�复位
�外部中断
�存储器映射控制
�功率控制
�唤醒定时器
周立功单片机
唤醒定时器
• 唤醒定时器——用途
唤醒定时器的用途:当给芯片复位或某个事件
将处理器从掉电模式唤醒时,需要唤醒定时器来确
保振荡器和芯片所需要的其它模拟电路在处理器开
始执行指令之前能够正确工作。
唤醒定时器的工作完全由硬件控制,不需要用
户干预。
周立功单片机
唤醒定时器
• 唤醒定时器——与时钟的关系
在检测到第一个有效的时钟后,唤醒定时器需
要对4096个时钟计数,这段时间可使Flash进行初
始化。在Flash存储器初始化结束时,如果外部复
位已撤除,处理器开始执行指令。
复位或掉
电唤醒
振荡器
输出
时钟产生单元
启动
唤醒定时器
启动
唤醒定时器
复位或掉
电唤醒
计数4096个时钟
后控制开关闭合
对输入时钟计数
周立功单片机
唤醒定时器
• 唤醒定时器——与外部中断的关系
如果使能了外部中断唤醒功能,并且所选中断
事件出现,那么唤醒定时器将被启动。如果向量中
断控制器(VIC)的中断功能也使能,那么实际的
中断在唤醒定时器停止后产生。
周立功单片机
周立功单片机
第5章 目录
�1.简介
�2.引脚配置
�3.存储器寻址
�4.系统控制模块
�5.存储器加速模块
�6.外部存储器控制器
�7.引脚连接模块
�8. 向量中断控制器
�
�
�
�接口
�接口
�14.定时器0/1
�15.脉宽调制器(PWM)
�
�17.实时时钟
�18.看门狗
周立功单片机
存储器加速模块(MAM)
• 概述
LPC2114/2124/2210/2212/2214微控制器的
ARM内核工作在最高频率60MHz时,执行一条指
令约为17ns。而Flash存储器的访问周期需要
50ns,即最高频率20MHz。所以如果将代码存放
在Flash中,将影响ARM内核发挥最大效能。为了
能将指令从内部Flash存储器更高效快速地提取到
ARM内核,而设计产生了一个存储器加速模块
(MAM)。
周立功单片机
分支跟踪缓存 分支跟踪缓存
总线
接口
Flash
存储器组0
Flash
存储器组1
预取指缓存 预取指缓存
数据缓存区
选择
ARM局部总线
2×128位 2×128位
• MAM结构
�使能MAM模块后,ARM内核
将通过MAM模块访问Flash存
储器。
Flash
存储器组0
Flash
存储器组1
分支跟踪缓存 分支跟踪缓存
预取指缓存 预取指缓存
数据缓存区
选择
总线
接口
周立功单片机
• MAM结构
�Flash存储器被分为两组,当
CPU执行其中一组Flash内的指
令时,另一组进行读取缓存操
作。
�使能MAM模块后,ARM内核
将通过MAM模块访问Flash存
储器。
�每个Flash组包含预取指缓存和
分支跟踪缓存。
分支跟踪缓存 分支跟踪缓存
总线
接口
Flash
存储器组0
Flash
存储器组1
预取指缓存 预取指缓存
数据缓存区
选择
ARM局部总线
2×128位 2×128位
�MAM模块中的数据总线宽度
为128位,所以一次读取操作可
以读出4条ARM指令或8条
Thumb指令。
分支跟踪缓存
预取指缓存
分支跟踪缓存
Flash
存储器组1
预取指缓存
分支跟踪缓存
预取指缓存
分支跟踪缓存
预取指缓存
Flash
存储器组0
分支跟踪缓存 分支跟踪缓存
预取指缓存 预取指缓存
周立功单片机
分支跟踪缓存 分支跟踪缓存
• MAM结构
总线
接口
Flash
存储器组0
Flash
存储器组1
预取指缓存 预取指缓存
数据缓存区
选择
ARM局部总线
�当程序向前跳转时,尝试从预
取指缓存区取指。
2×128位 2×128位
�如果程序跳转出缓存的范围,
CPU将要停止,等待若干个周
期,直到正确的指令从Flash中
被读出。
�当程序向后跳转时,尝试从分
支跟踪缓存区取指。
�预取指缓存区保存有将要执行
的指令。而分支跟踪缓存区保
存有程序跳转后可能执行到的
指令。
周立功单片机
分支跟踪缓存 分支跟踪缓存
• MAM结构
总线
接口
Flash
存储器组0
Flash
存储器组1
预取指缓存 预取指缓存
数据缓存区
ARM局部总线
2×128位 2×128位
�Flash中除了存储指令之外,还
可用来存储不修改或者很少修
改的数据,所以在MAM模块中
设计有数据缓冲区。数据缓存
区可以提高顺序读取数据的操
作速度。但是对随机读取操作
几乎没有加速效果。
数据缓存区
�Flash编程由另一个独立的模块
完成,Flash在进行编程操作时
禁止访问。在编程操作结束
后,缓存区的数据将自动失
效,可以避免读取到无效的数
据。
选择
周立功单片机
存储器加速模块(MAM)
• 存储器加速模块寄存器描述
MAM控制寄存器(MAMCR):
MAMCR[1:0]:用于MAM的模式控制,具体关系如下表。
模式控制------功能
[1 : 0]234567位
保留11
完全使能MAM功能10
部分使能MAM功能01
禁止MAM功能00
描述MAMCR[1:0]
周立功单片机
存储器加速模块(MAM)
• 存储器加速模块寄存器描述
MAM定时寄存器(MAMTIM):
MAMTIM[2:0]:决定使用多少个CCLK周期访问Flash存储器,这样
可以调整MAM时序使其匹配处理器操作频率,具体关系如下表。
取指周期控制-----功能
[2 : 0]34567位
取指周期为7个CCLK
取指周期为6个CCLK
取指周期为5个CCLK
取指周期为4个CCLK
描述
111
110
101
100
MATIM[2:0]
取指周期为3个CCLK
取指周期为2个CCLK
取指周期为1个CCLK
保留
描述
011
010
001
000
MATIM[2:0]
周立功单片机
存储器加速模块(MAM)
• 存储器加速模块寄存器描述
MAM定时寄存器(MAMTIM):
取指周期为7个CCLK
取指周期为6个CCLK
取指周期为5个CCLK
取指周期为4个CCLK
描述
111
110
101
100
MATIM[2:0]
取指周期为3个CCLK
取指周期为2个CCLK
取指周期为1个CCLK
保留
描述
011
010
001
000
MATIM[2:0]
当访问周期设置为1个CCLk时,实际上关闭了MAM,但是仍可以选择
MAM模式对功耗进行优化。
注意:不正确的设定会导致器件的错误操作
周立功单片机
存储器加速模块(MAM)
• MAM使用要点
�当改变MAM定时值时,必须先将MAMCR设置
为0关闭MAM,然后将新值写入MAMTIM。最后
将需要的操作模式的对应值(1或2)写入
MAMCR,再次打开MAM;
�对于低于20MHz的系统时钟,MAMTIM设定为
001,将Flash访问时间设定为1CCLK ;对于20MHz
到40MHz之间的系统时钟,建议将Flash访问时间
设定为2CCLK;高于40MHz的系统时钟,建议使
用3CCLK。
周立功单片机
• 相关启动代码分析
. . .
MAMCR = 0;
#if Fcclk < 20000000
MAMTIM = 1;
#else
#if Fcclk < 40000000
MAMTIM = 2;
#else
MAMTIM = 3;
#endif
#endif
MAMCR = 2;
. . .
设置步骤:
1.关闭MAM模块;
2.根据用户定义的系统时钟频率
决定MAM定时寄存器的值;
3.打开MAM模块,完全使能
MAM模块;
3> 40MHz
220MHz ~ 40MHz
1< 20MHz
MAM定时值系统时钟(CCLK)
C代码:
周立功单片机
第5章 目录
�1.简介
�2.引脚配置
�3.存储器寻址
�4.系统控制模块
�5.存储器加速模块
�6.外部存储器控制器
�7.引脚连接模块
�8. 向量中断控制器
�
�
�
�接口
�接口
�14.定时器0/1
�15.脉宽调制器(PWM)
�
�17.实时时钟
�18.看门狗
周立功单片机
ARM7TDMI-S
CPU
AHB To VPB
桥
EMC
VIC
I2C串行接口
SPI串行接口
UART0 & 1
CAN
看门狗定时器
系统控制
外部中断
TIMER0/1
ADC
通用I/O
PWM0
实时时钟
SRAM
Flash
AHB总线
ARM7 局部总线
系统功能
EMC
• 外部存储器控制器概述
�只有LPC2200系列的微
控制器含有EMC模块 。
�外部静态存储器控制器
是一个AHB总线上的从模
块 。
�EMC模块为AHB系统总
线和外部存储器件之间提
供了一个接口。
周立功单片机
ARM7TDMI-S
CPU
AHB To VPB
桥
EMC
VIC
I2C串行接口外部中断
TIMER0/1
SRAM
Flash
AHB总线
ARM7 局部总线
系统功能
EMC
外部存储器或
外部I/O器件
外部存储器或
外部I/O器件
外部存储器或
外部I/O器件
外部存储器或
外部I/O器件
• 外部存储器控制器概述
�EMC模块支持4个独立配置
的存储器组,每个存储器组
的总线宽度可设置为8、16或
者32位,但是同一个存储器
组的器件必须宽度相同。
�每个存储器组最大支持
16MB寻址空间。
�支持字节定位读取。
周立功单片机
ARM7TDMI-S
CPU
AHB To VPB
桥
EMC
VIC
I2C串行接口外部中断
TIMER0/1
SRAM
Flash
AHB总线
ARM7 局部总线
系统功能
EMC
外部存储器或
外部I/O器件
外部存储器或
外部I/O器件
外部存储器或
外部I/O器件
外部存储器或
外部I/O器件
• 外部存储器控制器概述
�地址输出线是A[23:0],
其中地址位A[25:24]用于
4个存储器组的译码
(CS[3:0])。
总线
存储器组选择线
CS[3:0]
BCFG3
0x8300 0000~0x83FF
FFFF
3
BCFG2
0x8200 0000~0x82FF
FFFF
2
BCFG1
0x8100 0000~0x81FF
FFFF
1
BCFG0
0x8000 0000~0x80FF
FFFF
0
配置寄存器地址范围Bank
Bank0
Bank1
Bank2
Bank3
周立功单片机
• 外部存储器总线接口描述
芯片选择信号,低有效输出CS[3:0]
写使能信号,低有效输出WE
字节定位选择信号,低有效输出BLS
输出使能信号,低有效输出OE
外部存储器地址线输出A[23:0]
外部存储器数据线输入/输出D[31:0]
引脚描述类型引脚名
接口引脚描述:
这些引脚与P1、P2和P3口GPIO功能复用,所
以在使用外部总线前首先要正确设置PINSEL2寄存
器。可以在硬件上对引脚BOOT1:0设定,复位时
微处理器自动初始化PINSEL2。或者在软件上字节
初始化PINSEL2,这只适用于片内FLASH引导程序
运行的系统中。
周立功单片机
XCLK
CS
OE
WE/BLS
Addr
Data
外部存储器读访问典型波形:
• 外部存储器总线接口描述
外部存储器写访问典型波形:
XCLK
CS
OE
WE/BLS
Addr
Data 有效数据
有效地址
有效地址
变化数据 有效数据
经过一个等待状态后,存储器输出有效数据。
周立功单片机
外部存储器控制器(EMC)
• 相关寄存器
外部存储器控制器包含4个寄存器,它们分别
对应一个存储器组。通过这些寄存器,可以分别
设置每个存储器组读写访问之间插入的等待周期
个数、每个存储器组的总线宽度等。
0xFFE0 000C0x0000
FBEF
读/写存储器组3的配置寄存器BCFG
3
0xFFE0 00080x1000
FBEF
读/写存储器组2的配置寄存器BCFG
2
0xFFE0 00040x2000
FBEF
读/写存储器组1的配置寄存器BCFG
1
0xFFE0 00000x2000
FBEF
读/写存储器组0的配置寄存器BCFG
0
地址复位值访问描述名称
周立功单片机
外部存储器控制器(EMC)
• 相关寄存器
BUSER
R
WPER
R
WPBMMWAT功能
2425262729:2831:30位
IDCY
3:0
保留WST1RBLEWST2保留功能
49:51015:1123:16位
存储器组配置寄存器0~3(BCFG0~3):
IDCY:在两个存储器组之间切换访问时,为了避免器件间的总线竞争,需
要插入空闲的CCLK周期,该域控制着这个周期数。
计算公式为:空闲CCLK周期数 = IDCY +1;(IDCY的复位值为15)
周立功单片机
外部存储器控制器(EMC)
• 相关寄存器
BUSER
R
WPER
R
WPBMMWAT功能
2425262729:2831:30位
IDCY
3:0
保留WST1RBLEWST2保留功能
49:51015:1123:16位
存储器组配置寄存器0~3(BCFG0~3):
WST1:一些慢速的外部存储器可能不能适应EMC最高速度的读操作,所以需
要在读周期中插入若干个空闲等待周期,以降低读操作的速度。该域控制
着读周期中插入的空闲CCLK周期数。
计算公式为:读操作周期长度 = WST1 + 3;(WST1的复位值为15)
周立功单片机
外部存储器控制器(EMC)
• 相关寄存器
IDCY
3:0
保留WST1RBLEWST2保留功能
49:51015:1123:16位
存储器组配置寄存器0~3(BCFG0~3):
XCLK
CS
OE
WE/BLS
Addr
Data
有效地址
变化数据 有效数据
WST1=0WST1=0WST1=0WST1=0
1111个等待周期个等待周期个等待周期个等待周期
外部存储器读访问波形(WST1=0):
读操作,共需读操作,共需读操作,共需读操作,共需3333个周期个周期个周期个周期
周立功单片机
外部存储器控制器(EMC)
• 相关寄存器
IDCY
3:0
保留WST1RBLEWST2保留功能
49:51015:1123:16位
存储器组配置寄存器0~3(BCFG0~3):
XCLK
CS
OE
WE/BLS
Addr
Data
有效地址
变化数据 有效数据
WST1=0WST1=0WST1=0WST1=0
1111个等待周期个等待周期个等待周期个等待周期
读操作,共需读操作,共需读操作,共需读操作,共需3333个周期个周期个周期个周期
外部存储器读访问波形(WST1=1):
增加1个等待周期
周立功单片机
外部存储器控制器(EMC)
• 相关寄存器
IDCY
3:0
保留WST1RBLEWST2保留功能
49:51015:1123:16位
存储器组配置寄存器0~3(BCFG0~3):
XCLK
CS
OE
WE/BLS
Addr
Data
WST1=1WST1=1WST1=1WST1=1,,,,2222个等待周期个等待周期个等待周期个等待周期
外部存储器读访问波形(WST1=1):
有效地址
变化数据 有效数据
读操作,共需读操作,共需读操作,共需读操作,共需4444个周期个周期个周期个周期
周立功单片机
外部存储器控制器(EMC)
• 相关寄存器
BUSER
R
WPER
R
WPBMMWAT功能
2425262729:2831:30位
IDCY
3:0
保留WST1RBLEWST2保留功能
49:51015:1123:16位
存储器组配置寄存器0~3(BCFG0~3):
RBLE:如果外部存储器的总线宽度为16或32位,那么读写操作是对总线上
的2个或4个字节的数据同时进行的。某些存储器允许对总线上的某几个字
节进行独立的读写操作,而不影响其它字节,这通过芯片的字节定位引脚
实现。当RBLE位为1时使能字节定位功能,BLS3:0在读写操作时输出低电平。
当RBLE位为0时,禁止该功能。
周立功单片机
D[7:0]
D[15:8]
nBLS0
nBLS1
nLB
nUB
A[23:0]
nCS0 nCE
nWE nWE
D[15:0]
D[7:0]
D[15:0]
D[7:0]
A[23:0] A[23:0]
LPC2200 SRAM
外部存储器控制器(EMC)
• 相关寄存器
例1:向地址0x80001000
写入一个8位数据0xAA
�1.地址总线上出现地址;
�2.数据总线上出现数据
0x??AA,高8位无效;
0xAA
无效数据
�3.控制线nBLS0、nCS0和
nWE拉低,将低8位数据写
入芯片。
0x80001000
LDR R0,=0x80001000
MOV R1,#0xAA
STRB R1,[R0]
汇编代码:
周立功单片机
D[7:0]
D[15:8]
nBLS0
nBLS1
nLB
nUB
A[23:0]
nCS0 nCE
nWE nWE
D[15:0]
D[7:0]
D[15:0]
D[7:0]
A[23:0] A[23:0]
LPC2200 SRAM
外部存储器控制器(EMC)
• 相关寄存器
例2:向地址0x80001001
写入一个8位数据0x55
�1.地址总线上出现地址;
�2.数据总线上出现数据
0x55??,低8位无效;
0x55
无效数据
�3.控制线nBLS1、nCS0和
nWE拉低,将高8位数据写
入芯片。
0x80001000
LDR R0,=0x80001001
MOV R1,#0x55
STRB R1,[R0]
汇编代码:
周立功单片机
外部存储器控制器(EMC)
• 相关寄存器
BUSER
R
WPER
R
WPBMMWAT功能
2425262729:2831:30位
IDCY
3:0
保留WST1RBLEWST2保留功能
49:51015:1123:16位
存储器组配置寄存器0~3(BCFG0~3):
WST2:和读操作类似,一些慢速的外部存储器可能不能适应EMC最高速度的
写操作,所以需要在写周期中插入若干个空闲等待周期,以降低写操作的
速度。该域控制着写周期中插入的空闲CCLK周期数。
计算公式为:写操作周期长度 = WST2 + 3;(WST2的复位值为15)
对于Burst ROM,计算公式为:写操作周期长度 = WST2 + 1;
周立功单片机
外部存储器写访问波形(WST2=0):
XCLK
CS
OE
WE/BLS
Addr
Data 有效数据
有效地址
外部存储器控制器(EMC)
• 相关寄存器
IDCY
3:0
保留WST1RBLEWST2保留功能
49:51015:1123:16位
存储器组配置寄存器0~3(BCFG0~3):
WST1=0WST1=0WST1=0WST1=0
1111个等待周期个等待周期个等待周期个等待周期
写操作,共需写操作,共需写操作,共需写操作,共需3333个周期个周期个周期个周期
周立功单片机
XCLK
CS
OE
WE/BLS
Addr
Data 有效数据
有效地址
外部存储器控制器(EMC)
• 相关寄存器
IDCY
3:0
保留WST1RBLEWST2保留功能
49:51015:1123:16位
存储器组配置寄存器0~3(BCFG0~3):
WST1=0WST1=0WST1=0WST1=0
1111个等待周期个等待周期个等待周期个等待周期
写操作,共需写操作,共需写操作,共需写操作,共需3333个周期个周期个周期个周期
外部存储器写访问波形(WST2=1):
增加1个等待周期
周立功单片机
外部存储器写访问波形(WST2=1):
XCLK
CS
OE
WE/BLS
Addr
Data
外部存储器控制器(EMC)
• 相关寄存器
IDCY
3:0
保留WST1RBLEWST2保留功能
49:51015:1123:16位
存储器组配置寄存器0~3(BCFG0~3):
写操作,共需写操作,共需写操作,共需写操作,共需4444个周期个周期个周期个周期
有效数据
有效地址
WST1=1WST1=1WST1=1WST1=1
2222个等待周期个等待周期个等待周期个等待周期
周立功单片机
外部存储器控制器(EMC)
• 相关寄存器
BUSER
R
WPER
R
WPBMMWAT功能
2425262729:2831:30位
IDCY
3:0
保留WST1RBLEWST2保留功能
49:51015:1123:16位
存储器组配置寄存器0~3(BCFG0~3):
BUSERR:总线错误状态位。如果EMC检测到AMBA总线上出现一个大于32位数
据访问的请求,那么该位将置位。ARM7TDMI-S内核不会出现这样的请求;
WPERR:错误写状态位。如果对一个已经写保护(WP位为1)的存储器组进
行写操作,该位将置位。向该位写入1,可以清零该位。
周立功单片机
外部存储器控制器(EMC)
• 相关寄存器
BUSER
R
WPER
R
WPBMMWAT功能
2425262729:2831:30位
IDCY
3:0
保留WST1RBLEWST2保留功能
49:51015:1123:16位
存储器组配置寄存器0~3(BCFG0~3):
WP:该位为1时,相应的存储器组被写保护;
BM:如果外部存储器使用了Burst ROM,将该位置1;
AT:该域通常写入00。
周立功单片机
外部存储器控制器(EMC)
• 相关寄存器
BUSER
R
WPER
R
WPBMMWAT功能
2425262729:2831:30位
IDCY
3:0
保留WST1RBLEWST2保留功能
49:51015:1123:16位
存储器组配置寄存器0~3(BCFG0~3):
MW:该位控制相应存储器组的数据总线宽度,如下表所示。
保留11
3210
1601
800
数据总线宽度BCFGx[29:2
8]
周立功单片机
外部存储器控制器(EMC)
• 相关寄存器
MW控制域(BCFG[29:28])与引脚BOOT1:0的关系:
由于Bank0可用于引导程序运行,所以BCFG0[29:28]的复位值与引脚
BOOT1:0的设定有关(当BOOT1:0=11时,复位后从片内Flash引导程序运行)。
800XX3
1601XX2
3210XX1
3210HH0
3210HL0
1601LH0
800LL0
存储器宽度BCFG[29:28]复位值复位时BOOT1:0的状态Bank
周立功单片机
外部存储器控制器(EMC)
• 与外部存储器的连接
�如果存储器组配置成32位宽度,地址线A0和A1无
用,可作为GPIO使用(由PINSEL2设置);
�如果存储器组配置成16位宽度,地址线A0无用,
可作为GPIO使用(由PINSEL2设置);
�如果存储器组配置成8位宽度,并且使能字节定位
功能(RBLE=1),存储器的写信号由BLS[0]提供,
否则由WE信号提供;
�同一寄存器组的器件宽度必须一致。
周立功单片机
• 与外部存储器连接——32位宽度
A[a_b:2]
BLS[1]
D[15:8]
CE
OE
WE
IO[7:0]
A[a_m:0]
BLS[0]
D[7:0]
CE
OE
WE
IO[7:0]
A[a_m:0]
OE
CS
BLS[ 3]
D[31:24]
CE
OE
WE
IO[7:0]
A[a_m:0]
BLS[2]
D[23:16]
CE
OE
WE
IO[7:0]
A[a_m:0]
a) 32 位宽存储器组连接8位的存储器芯片
b) 32位宽存储器组连接16位的存储器芯片
OE
CS
WE
CE
OE
WE
B3
B2
B1
B0
IO[31:0]
A[a_m:0]
D[31:0]
BLS[2]
A[a_b:0]
BLS[3]
BLS[0]
BLS[1]
c) 32 位宽存储器组连接32位的存储器芯片
OE
CS
WE
CE
OE
WE
UB
LB
IO[15:0]
A[a_m:0]
D[31:16]
BLS[ 2]
CE
OE
WE
UB
LB
IO[15:0]
A[a_m:0]
D[15:0]
BLS[0]
A[a_b:2]
BLS[ 3] BLS[1]
A[a_b:2]
BLS[1]
D[15:8]
CE
OE
WE
IO[7:0]
A[a_m:0]
BLS[0]
D[7:0]
CE
OE
WE
IO[7:0]
A[a_m:0]
OE
CS
BLS[ 3]
D[31:24]
CE
OE
WE
IO[7:0]
A[a_m:0]
BLS[2]
D[23:16]
CE
OE
WE
IO[7:0]
A[a_m:0]
a) 32 位宽存储器组连接8位的存储器芯片
b) 32位宽存储器组连接16位的存储器芯片
OE
CS
WE
CE
OE
WE
B3
B2
B1
B0
IO[31:0]
A[a_m:0]
D[31:0]
BLS[2]
A[a_b:0]
BLS[3]
BLS[0]
BLS[1]
c) 32 位宽存储器组连接32位的存储器芯片
OE
CS
WE
CE
OE
WE
UB
LB
IO[15:0]
A[a_m:0]
D[31:16]
BLS[ 2]
CE
OE
WE
UB
LB
IO[15:0]
A[a_m:0]
D[15:0]
BLS[0]
A[a_b:2]
BLS[ 3] BLS[1]
A[a_b:2]
BLS[1]
D[15:8]
CE
OE
WE
IO[7:0]
A[a_m:0]
BLS[0]
D[7:0]
CE
OE
WE
IO[7:0]
A[a_m:0]
OE
CS
BLS[ 3]
D[31:24]
CE
OE
WE
IO[7:0]
A[a_m:0]
BLS[2]
D[23:16]
CE
OE
WE
IO[7:0]
A[a_m:0]
a) 32 位宽存储器组连接8位的存储器芯片
b) 32位宽存储器组连接16位的存储器芯片
OE
CS
WE
CE
OE
WE
B3
B2
B1
B0
IO[31:0]
A[a_m:0]
D[31:0]
BLS[2]
A[a_b:0]
BLS[3]
BLS[0]
BLS[1]
c) 32 位宽存储器组连接32位的存储器芯片
OE
CS
WE
CE
OE
WE
UB
LB
IO[15:0]
A[a_m:0]
D[31:16]
BLS[ 2]
CE
OE
WE
UB
LB
IO[15:0]
A[a_m:0]
D[15:0]
BLS[0]
A[a_b:2]
BLS[ 3] BLS[1]
由1片32位宽度的存储器
芯片构成32位存储器
由2片16位宽度的存储器
芯片构成32位存储器
由4片8位的存储器芯
片构成32位存储器
周立功单片机
• 与外部存储器连接——8/16位宽度
OE
CS
BLS[1]
D[15:8]
CE
OE
WE
IO[7:0]
A[a_m:0]
BLS[0]
D[7:0]
CE
OE
WE
IO[7:0]
A[a_m:0]
A[a_b:1]
OE
CS
WE
CE
OE
WE
UB
LB
IO[15:0]
A[a_m:0]
D[15:0]
BLS[0]
A[a_b:1]
BLS[1]
a) 16 位宽存储器组连接8位的存储器芯片 a) 16位宽存储器组连接16位的存储器芯片
OE
CS
BLS[1]
D[15:8]
CE
OE
WE
IO[7:0]
A[a_m:0]
BLS[0]
D[7:0]
CE
OE
WE
IO[7:0]
A[a_m:0]
A[a_b:1]
OE
CS
WE
CE
OE
WE
UB
LB
IO[15:0]
A[a_m:0]
D[15:0]
BLS[0]
A[a_b:1]
BLS[1]
a) 16 位宽存储器组连接8位的存储器芯片 a) 16位宽存储器组连接16位的存储器芯片由1片16位宽度的存储器芯
片构成16位存储器
由2片8位宽度的存储器
芯片构成16位存储器
OE
CS
BLS[0]
D[7:0]
CE
OE
WE
IO[7:0]
A[a_m:0]
A[a_b:0]
由1片8位宽度的存储器芯
片构成8位存储器
使用字节定位引脚
BLS[0]作为写使能信号
周立功单片机
• 相关启动代码分析
. . .
LDR R0, =PINSEL2
IF :DEF: EN_CRP
LDR R1, =0x0f814910
ELSE
LDR R1, =0x0f814914
ENDIF
STR R1, [R0]
LDR R0, =BCFG0
LDR R1, =0x1000ffef
STR R1, [R0]
. . .
C代码: 在LPC2200的启动代码
中包含总线的初始化设置。
设置步骤:
1.设置引脚连接模块,将P2口
用于外部存储器总线接口。这
里使用了汇编的条件编译语
句,前者为芯片加密时的设置
值(禁止JTAG调试);
2.设置BANK0,将其设置为
16位总线接口,使能字节定
位功能,并把读写周期设置
为最大,以兼容不同速度的
外部存储器,实际应用中根
据存储器的实际速度进行调
整;
芯片加密,禁止JTAG调试功能
周立功单片机
• 相关启动代码分析
. . .
LDR R0, =BCFG1
LDR R1, =0x1000ffef
STR R1, [R0]
; LDR R0, =BCFG2
; LDR R1, =0x2000ffef
; STR R1, [R0]
; LDR R0, =BCFG3
; LDR R1, =0x2000ffef
; STR R1, [R0]
. . .
C代码:设置步骤:
3.设置BANK1,与BANK0
的设置值相同;
和BANK4被设置
为32位宽度其它与BANK0
相同。因为在暂时没有使用
到这两个BNAK,所以在此
被屏蔽,需要使用时再进行
设置;
周立功单片机
第5章 目录
�1.简介
�2.引脚配置
�3.存储器寻址
�4.系统控制模块
�5.存储器加速模块
�6.外部存储器控制器
�7.引脚连接模块
�8. 向量中断控制器
�
�
�
�接口
�接口
�14.定时器0/1
�15.脉宽调制器(PWM)
�
�17.实时时钟
�18.看门狗
周立功单片机
引脚连接模块
• 概述
LPC2000系列微控制器的大部分管脚都具有
多种功能,即管脚复用,但是同一引脚在同一时
刻只能使用其中一个功能,通过配置相关寄存器
控制多路开关来连接引脚与片内外设。
GPIO
TXD0
PWM1输出
通过引脚连接模块控制引脚功能
周立功单片机
• 外部存储器寄存器描述——PINSEL0
00保留EINT2RIGPIO :30
00保留EINT1CDGPIO :28
00保留匹配 :26
00保留匹配 :24
00保留捕获 :22
00保留捕获 :20
00EINT3PWM6RxD1GPIO :18
00保留PWM4TxD1GPIO :16
00EINT2PWM2SSEL0GPIO :14
00保留捕获 :12
00保留匹配 :10
00保留捕获 :8
00EINT1匹配 :6
00保留捕获 :4
00EINT0PWM3RxD0GPIO :2
00保留PWM1TxD0GPIO :0
复位值11100100引脚名称PINSEL0
表示寄存器中某两位的设定值
如PINSEL0[1:0]=01时,连接TXD0
表示寄存器中的控制位
如[9:8]表示PINSEL0寄存器的第9和8位
周立功单片机
• 外部存储器寄存器描述——PINSEL0
00保留EINT2RIGPIO :30
00保留EINT1CDGPIO :28
00保留匹配 :26
00保留匹配 :24
00保留捕获 :22
00保留捕获 :20
00EINT3PWM6RxD1GPIO :18
00保留PWM4TxD1GPIO :16
00EINT2PWM2SSEL0GPIO :14
00保留捕获 :12
00保留匹配 :10
00保留捕获 :8
00EINT1匹配 :6
00保留捕获 :4
00EINT0PWM3RxD0GPIO :2
00保留PWM1TxD0GPIO :0
复位值11100100引脚名称PINSEL0
如:PINSEL[19:18]设置为01
时,引脚的功能为RXD1
周立功单片机
• 外部存储器寄存器描述——PINSEL1
00保留:30
00捕获
:28
00匹配捕获
:26
00匹配捕获
:24
00匹配捕获
:22
00保留:20
00保留保留保留GPIO :18
00保留保留保留GPIO :16
00保留保留保留GPIO :14
00匹配捕获保留GPIO :12
00捕获保留PWM5GPIO :10
00EINT3SSEL1匹配
:8
00匹配匹配
:6
00匹配捕获
:4
00匹配捕获
:2
00保留匹配 :0
复位值11100100引脚名称PINSEL1
周立功单片机
• 外部存储器寄存器描述——PINSEL2
0
为1时,作GPIO使用
为0时,作WE使用
8
1
当数据总线不占用时:
为1时,作GPIO使用
为0时,作AIN6使用
6
1
当数据总线不占用时:
为1时,作GPIO使用
为0时,作AIN7使用
7
复位时将BOOT1:0引脚
电平作为该域的复位值控制数据总线和选通引脚的使用5:4
复位时将引脚电平
取反后作为该位复位值
为0时,:16作GPIO使用
为1时,:16作跟踪端口使用
3
复位时将引脚电平
取反后作为该位复位值
为0时,:26作GPIO使用
为1时,:26作调试端口使用
2
00保留1:0
复位值描述PINSEL2
周立功单片机
• 外部存储器控制器概述——PINSEL2
—保留19:18
00
为00时,作GPIO使用
为01时,作CS2使用
其它设置值保留
15:14
00
为00时,作GPIO使用
为01时,作CS3使用
其它设置值保留
17:16
0
当地址总线不占用引脚时:
为1时,作外部总线时钟输出
(XCLK)使用
为0时,作GPIO使用
13
—保留12
0
为1时,作CS1使用
为0时,作GPIO使用
11
—保留10:9
复位值描述PINSEL2
周立功单片机
• 外部存储器控制器概述——PINSEL2
保留31:28
复位时,BOOT1引脚为
低电平时,该位为1
为0时,作GPIO使用
为1时,作地址线A1使用
24
复位时,BOOT1:0引脚
都为高电平时,该域为
000,否则为111
控制
总线的数目27:25
复位时,BOOT1:0引脚
都为低电平时,该位为1
为0时,作GPIO使用
为1时,作地址线A0使用
23
1
当数据总线没有占用时:
为0时,作GPIO使用
为1时,作AIN5使用
22
1
当数据总线没有占用时:
为0时,作GPIO使用
为1时,作AIN4使用
21
0
当数据总线没有占用:28时:
为0时,:28作GPIO使用
为1时,保留
20
复位值描述PINSEL2
周立功单片机
无
32位
16位
8位
数据总线
宽度
————————11
CS0OEBLS3:2BLS1BLS0D[7:0]D[15:0]D[31:16]10
CS0OE—BLS1BLS0D[7:0]D[15:0]—01
CS0OE——BLS0D[7:0]——00
:2
8
:
0
:
8
:1
5
PINSEL
2
[5:4]
• 外部总线设置
PINSEL[5:4]与数据总线和控制线的关系列表
无地址线
000
A23:2A19:2A15:2A11:2A7:2A5:2A3:2地址线宽度
111110101100011010001
PINSEL2
[27:25]
PINSEL[27:25]与地址线的关系列表
注:“—”表示该引脚不作数据总线使用,可作其它用途。
周立功单片机
引脚连接模块
• 使用示例——将、设置为TxD1、RxD1
PINSEL0 = 0x05 << 16;
C代码:
通过查阅PINSE0寄存器设置表,得到和的控制位
为PINSEL0[19:16],当该域设置为[0101](0x05)时选择 RxD1和
TxD1 ;
为了不影响别的管脚连接设置,通常选择下面的设置方法。
PINSEL0 = (PINSEL0 & 0xFFF0FFFF) | (0x05 << 16);
C代码:
周立功单片机
引脚连接模块
• 启动代码相关部分
LPC2200系列微控制器是总线开放型芯片,其总
线宽度可设置为8位、16位或32位,对于没有使用到
的总线引脚(比如16位总线宽度时,D16~D31位没有
使用),可作为GPIO使用。
周立功单片机
引脚连接模块
• 启动代码相关部分
. . .
LDR R0, =PINSEL2
IF :DEF: EN_CRP
LDR R1, =0x0f814910
ELSE
LDR R1, =0x0f814914
ENDIF
STR R1, [R0]
. . .
C代码:
如果在工程目标中选择
RelInChip项,编译器将会预
定义EN_CRP宏,PINSEL2被
设置为0x0f814910,禁止
JTAG调试。
当没有预定义EN_CRP宏时,
PINSEL2被设置为
0x0f814914,使能JTAG调试。
周立功单片机
第5章 目录
�1.简介
�2.引脚配置
�3.存储器寻址
�4.系统控制模块
�5.存储器加速模块
�6.外部存储器控制器
�7.引脚连接模块
�8. 向量中断控制器
�
�
�
�接口
�接口
�14.定时器0/1
�15.脉宽调制器(PWM)
�
�17.实时时钟
�18.看门狗
周立功单片机
向量中断控制器(VIC)
• 向量中断控制器概述
ARM7TDMI内核具有两个中断输入,分别为
IRQ中断和FIQ中断。但是芯片内部有许多中断源,
最多可以有32个中断输入请求。向量中断控制器的
作用就是允许哪些中断源可以产生中断、可以产生
哪类中断、产生中断后执行哪段服务程序。
ARM7TDMI-S
IRQ
FIQ
VIC
中断请求输入0
中断请求输入31
. . .
周立功单片机
向量中断控制器(VIC)
• 中断源列表
6
Rx线状态(RLS),发送保持寄存器空(THRE)
Rx数据可用(RDA),字符超时指示(CTI)
UART0
5
匹配0~3(MR0,MR1,MR2,MR3)
捕获0~3(CR0,CR1,CR2,CR3)
定时器1
4
匹配0~3(MR0,MR1,MR2,MR3)
捕获0~3(CR0,CR1,CR2,CR3)
定时器0
3EmbeddedICE,DbgCommTxARM内核
2EmbeddedICE,DbgCommRxARM内核
1保留给软件中断—
0看门狗中断(WDINT)WDT
VIC通道号可产生中断的标志模块
周立功单片机
向量中断控制器(VIC)
• 中断源列表
13计数器增加(RTCCIF),报警(RTCALF)RTC
12PLL锁定(PLOCK)PLL
11SPI中断标志(SPIF),模式错误(MODF)SPI1
10SPI中断标志(SPIF),模式错误(MODF)SPI0
9SI(状态改变)I2C
8匹配0~6(MR0,MR1,MR2,MR3,MR4,MR5,MR6)PWM0
7
Rx线状态(RLS),发送保持寄存器空(THRE)
Rx数据可用(RDA),字符超时指示(CTI)
UART1
VIC通道号可产生中断的标志模块
周立功单片机
向量中断控制器(VIC)
• 中断源列表
18A/D转换器A/D
19~31保留保留
17外部中断3(EINT3)系统控制
16外部中断2(EINT2)系统控制
15外部中断1(EINT1)系统控制
14外部中断0(EINT0)系统控制
VIC通道号可产生中断的标志模块
周立功单片机
向量中断控制器(VIC)
• 允许中断源产生中断
芯片内部许多部件都可以作为中断源,但并不
是每个中断源都需要在中断情况下进行操作,也可
以通过其它方法来处理各种状态。
比如通过串口发送一段数据,可以选择在一批
发送结束后产生中断,然后在中断服务程序中发送
下一批数据。也可以通过查询发送标志位来决定什
么时候发送下一批数据。
允许中断源产生中断由寄存器VICIntEnable和
VICIntEnClr控制,前者使能中断,后者禁止中断。
周立功单片机
向量中断控制器(VIC)
• 允许中断源产生中断
中断使能清零寄存器(VICIntEnClr):
WDT
0
—
1
ARM内核外部中断3A/D转换器保留功能
2…1718…31位
与中断使能寄存器的功能相反,向某位写入1时,禁止对应的中断
源产生中断。
中断使能寄存器(VICIntEnable):
WDT
0
—
1
ARM内核外部中断3A/D转换器保留功能
2…1718…31位
寄存器中每一位控制着一个中断源,各中断源的位置与中断源列
表所示相同。向某位写入1时,允许对应的中断源产生中断。
周立功单片机
向量中断控制器(VIC)
• 选择产生中断的类型
ARM7TDMI内核具有FIQ和IRQ两个中断输
入,所有中断源产生的中断都可以选择产生其中一
种中断。这通过中断选择寄存器完成。
中断选择寄存器(VICIntSelect):
WDT
0
—
1
ARM内核外部中断3A/D转换器保留功能
2…1718…31位
寄存器中每一位控制着一个中断源,各中断源的位置与中断源列
表所示相同。向某位写入1时,对应中断源产生的中断为FIQ中断,否
则为IRQ中断。
周立功单片机
向量中断控制器(VIC)
中断输入请求可以在VIC中被设置为以下三类:
�FIQ中断:具有最高优先级;
�向量IRQ中断:具有中等优先级;
�非向量IRQ中断:具有最低优先级;
• 中断类型
19个
中断输入
VIC
将32个
中断输入
进行分配13个未使用
FIQ中断
向量IRQ中断
非向量IRQ中断
中断源0
中断源1
……
中断源18
周立功单片机
向量中断控制器(VIC)
VIC最多支持16个向量IRQ中断,这些中断被
分为16个优先级,并且为每个优先级指定一个服
务程序入口地址。在发生向量IRQ中断后,相应优
先级的服务程序入口地址被装入向量地址寄存器
VICVectAddr中,通过一条ARM指令即可跳转到
相应的服务程序入口处,所以向量IRQ中断具有较
快的中断响应。
• 向量IRQ中断
周立功单片机
向量中断控制器(VIC)
任何中断源都可以设置为非向量IRQ中断。它
与向量IRQ中断的区别在于前者不能为每个非向量
IRQ中断源设置服务程序地址,而是所有的非向量
IRQ中断都共用一个相同的服务程序入口地址。
当有多个中断源被设置为非向量IRQ中断时,
需要在用户程序中识别中断源,并分别作出处理。
所以非向量IRQ中断响应延时相对较长。
• 非向量IRQ中断
周立功单片机
向量中断控制器(VIC)
VICVectCntl0~15和VICVectAddr0~15两类
寄存器与向量IRQ中断设置有关,前者为中断源分
配向量IRQ中断的优先级,后者为该中断优先级设
置服务程序入口地址。寄存器名称最后的数字同
时也代表该寄存器控制的向量IRQ中断的优先级,
数值越小优先级越高。
• 向量IRQ中断相关寄存器
注意:如果将同一个中断源分配给多个使能的向
量IRQ中断,那么该中断源发生中断时,会使用最
高优先级(最低编号)的寄存器设置。
周立功单片机
向量中断控制器(VIC)
• 向量IRQ中断相关寄存器
向量地址寄存器(VICVectAddr0~15):
该寄存器中存放对应优先级向量IRQ中断服务程序的入口地址。
中断服务程序入口地址功能
[31:0]位
向量控制寄存器(VICVectCntl0~15):
VICVectCntlx[4:0]:分配给此优先级向量IRQ中断的中断源序号;
VICVectCntlx[5]:该位为1,使能当前优先级的向量IRQ中断。否则为禁止。
中断源序号EN--功能
[4:0]567位
周立功单片机
向量中断控制器(VIC)
• 非向量IRQ中断相关寄存器
向量地址寄存器(VICDefVectAddr):
VICDefVectAddr寄存器存放非向量中断服务程序的入口地址,当发生非向
量中断时该寄存器中保存的地址存入VICVectAddr寄存器。
中断服务程序入口地址功能
[31:0]位
周立功单片机
向量中断控制器(VIC)
• 产生中断后的服务程序地址
在发生向量IRQ中断后,VIC能将对应中断的服
务程序地址存入VICVectAddr寄存器中。如果为非
向量中断,将把VICDefVectAddr寄存器的值存入该
寄存器。在异常向量表的IRQ异常入口处放置一条
指令,将VICVectAddr寄存器的内容装入程序计数
器(PC),就可以跳转到当前中断的服务函数。
这样的设计可以减小中断响应延时。
向量地址寄存器(VICVectAddr):
中断服务程序入口地址功能
[31:0]位
周立功单片机
向量中断控制器(VIC)
• 中断状态寄存器
如果使用了多个非向量IRQ中断或多个FIQ中
断,那么在发生中断后要在程序中查找中断源。通
过IRQ状态寄存器和FIQ状态寄存器可以了解到这
些中断源的中断请求状态。
任何在VIC中使能的中断都会把中断请求反映
在“所有中断状态寄存器(VICRawIntr)”中。
周立功单片机
IRQ状态寄存器(VICIRQStatus):
当某位为1时表示对应位的中断源产生IRQ中断请求。功能
[31:0]位
向量中断控制器(VIC)
• 中断状态寄存器
所有中断状态寄存器(VICRawIntr):
当某位为1时表示对应位的中断源产生中断请求。功能
[31:0]位
FIQ状态寄存器(VICFIQStatus):
当某位为1时表示对应位的中断源产生FIQ中断请求。功能
[31:0]位
周立功单片机
向量中断控制器(VIC)
• 软件中断寄存器
软件中断寄存器(VICSoftInt):
当某位为1时,将产生与该位相对应的中断请求。功能
[31:0]位
软件中断清零寄存器(VICSoftIntClear):
当某位为1时,将清零VICSoftInt寄存器中对应位功能
[31:0]位
在一些特殊场合或者调试时,可能需要使用
软件强制产生某个中断请求。
周立功单片机
向量中断控制器(VIC)
• 保护使能寄存器
软件中断寄存器(VICSoftInt):
当该位为1时,只能在特权模式下访问VIC寄存器。
0
—功能
[31:1]位
在某些场合可能需要禁止在用户模式下访问
VIC寄存器,以提高软件的安全等级。
周立功单片机
• IRQ中断的设计实例
设置外部中断0产生向量IRQ中断后执行中断
服务程序“IRQ_Eint0( )”。
...
PINSEL1 = (PINSEL1&0xFFFFFFFC)|0x01;
VICIntSelect = 0x00000000;
VICVectCntl0 = (0x20 | 14);
VICVectAddr0 = (int)IRQ_Eint0;
EXTINT = 0x01;
VICIntEnable = (1 << 14);
...
C代码:
1.设置引脚连接模块,将
设置为外部中断功能;
步骤:
2.设置所有中断为IRQ中断;
3.将外部中断0(在中断源
列表中序号14)设置到优先
级0中,并使能IRQ中断;
4.将外部中断0的中断服务
程序写入对应优先级的地
址寄存器中;
5.清除外部中断0的标志后
使能外部中断0;
(1)(1)(1)(1)
(2)(2)(2)(2)
(3)(3)(3)(3)
(4)(4)(4)(4)
(5)(5)(5)(5)
(5)(5)(5)(5)
周立功单片机
0x0000 0000
0xFFFF FFFF
用户程序
中断服务程序
异常向量表
1.正在执行用户程序;
①
2.外部中断0发生中断;
②
硬件将中断服务程序地址
装入VICVectAddr寄存器;
④
4.程序跳转至异常向量表中IRQ
入口0x0018处;
5.执行指令跳转至VICVectAddr
寄存器中的中断服务地址;
⑤
⑥
6.中断服务程序执行完毕,返回
被中断的用户程序继续执行被
中断的代码。
• 图示IRQ中断的发生过程
③ IRQ_Eint0 ???
VICVectAddr0 VICVectAddr
IRQ_Eint0⑤ LDR PC, [PC, #-0xff0]
周立功单片机
0x0000 0000
0xFFFF FFFF
用户程序
中断服务程序
异常向量表
①
②
④
⑤
⑥
• 图示IRQ中断的发生过程
③ IRQ_Eint0 ???
VICVectAddr0 VICVectAddr
IRQ_Eint0⑤ LDR PC, [PC, #-0xff0]
注意:
任何IRQ中断产生之后,微
控制器跳转到地址0x18执行代
码,该地址处的指令为:
LDR PC, [PC, #-0xff0]
在执行该指令时,PC指向当前指
令后的第2条指令,即地址0x20。
该指令将内存地址:
0x20-0xFF0 = 0xFFFFF030
处的内容存入PC,该地址正是
VICVectAddr寄存器的地址。
所以一条ARM指令即可实现
程序向中断服务程序的跳转。
周立功单片机
向量中断控制器(VIC)
• 使用VIC的注意要点
�如果在片内RAM中调试程序,并使用了中断,那
么必须将存储器映射控制设置为内部RAM模式;
�将多个中断源设置为FIQ,将增加中断响应延
时,所以建议FIQ中断只有一个中断源;
�规定在定义中断服务函数时必须加入关键
字“__irq”,保证函数返回时会切换处理器模式;
�在退出中断服务程序时要清零相应外设的中断标
志,以及VICVectAddr寄存器,为响应下次中断作
好准备。
周立功单片机
• VIC相关启动代码分析
...
/* 初始化VIC */
VICIntEnClr = 0xffffffff;
VICVectAddr = 0;
VICIntSelect = 0;
...
在LPC2100、LPC2200的启
动代码中包含有VIC初始化程
序,默认是禁止所有中断。
TargetResetInit函数:
InitStack
...
MSR CPSR_c,#0xdf
LDR SP,=StackUsr
MOV PC,R0
在LPC2100、 LPC2200的启
动代码中默认是关闭IRQ和FIQ
中断的。如果用户需要使用这两
个中断,则要设置CPSR寄存器的
I位或F位,这需要在特权模式下
处理。最简单的方法是在启动代
码中设置(修改0xdf值)。
处理器各模式堆栈设置:
周立功单片机
CODE32
AREA vectors,CODE,READONLY
ENTRY
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
. . .
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr
ResetAddr DCD ResetInit
UndefinedAddr DCD Undefined
. . .
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
• VIC相关启动代码分析
异常向量表:
�一旦产生IRQ中断,微控制器切
换到IRQ模式,并跳转到向量表
0x0018地址执行指令。
�一旦产生FIQ中断,微控制器切
换到FIQ模式,并跳转到向量表
0x001C地址执行指令,然后跳
转到FIQ_Handler代码段。
周立功单片机
周立功单片机
GPIO
(建议使用Office2003以上版本播放,将有更丰富的动画效果)
周立功单片机
第5章 目录
�1.简介
�2.引脚配置
�3.存储器寻址
�4.系统控制模块
�5.存储器加速模块
�6.外部存储器控制器
�7.引脚连接模块
�8. 向量中断控制器
�
�
�
�接口
�接口
�14.定时器0/1
�15.脉宽调制器(PWM)
�
�17.实时时钟
�18.看门狗
周立功单片机
GPIO
• 特性
LPC2000系列作为 “微控制器”,其GPIO特性就显
得很重要。它具有如下的特性:
�可以独立控制每个GPIO口的方向(输入/输出模
式);
�可以独立设置每个GPIO的输出状态(高/低电
平);
�所有GPIO口在复位后默认为输入状态。
周立功单片机
GPIO
• 应用
R3
10K
RST C16
104
LED1
POWER
+
R3
10K
+
QB 1
QC 2
QD 3
QE 4
QF 5
QG 6
QH 7GND8
SQH9
SCLR10
SCK11
RCK12
OE13
SI14
QA 15VCC16
U11
74HC595
+
LPC2000
检测数字输
入,如键盘
或开关信号
驱动LED或
其它指示器
控制片外器件
周立功单片机
GPIO
• 引脚描述
LPC2114/2124微控制器具有两个端口——P0和
P1,可以作为GPIO使用的引脚数为46个。
LPC2210/2212/2214微控制器还包含另外两个端
口——P2和P3,这个两个端口与外部存储器总线复
用,当它们全部作为GPIO使用时,GPIO引脚数多达
112个。
周立功单片机
GPIO
• 引脚描述
GPIO与控制寄存器的关系
PINSELx
IOxDIR IOxCLR
IOxPIN
IOxSET
in
out
1
0
引脚
周立功单片机
PINSELx
IOxDIR IOxCLR
IOxPIN
IOxSET
in
out
1
0
PINSELx
IOxDIR IOxCLR
IOxPIN
IOxSET
in
out
1
0
0x0000
0000
读/写GPIO方向控制寄存器。该寄存器单独控制每个IO口的方向IODIR
0x0000
0000只清零
GPIO输出置位寄存器。该寄存器控制引脚输
出低电平IOCLR
0x0000
0000
读/置位GPIO输出置位寄存器。该寄存器控制引脚输出高电平IOSET
NA只读GPIO引脚值寄存器,不管方向模式如何,引脚的当前状态都可以从该寄存器中读出IOPIN
复位值访问类型描述通用名称
• GPIO相关寄存器描述
周立功单片机
PINSELx
IOxDIR IOxCLR
IOxPIN
IOxSET
in
out
1
0
• GPIO相关寄存器描述——IOxPIN
未定义GPIO引脚值。IOxPIN[0]对应于 … IOxPIN[31]对应于引脚31 : 0
复位值描述IOxPIN
该寄存器反映了当前引脚的状态。IOxPIN中的x对应于某一个端口,
如P1口对应于IO1PIN。所以芯片存在多少个端口,就有多少个IOxPIN分
别与之对应。
写该寄存器会将值保存到输出寄存器,具体使用稍后介绍。
注意:无论引脚被设置为输入还是输出模式,都不影响引脚状态的读出。
周立功单片机
PINSELx
IOxDIR IOxCLR
IOxPIN
IOxSET
in
out
1
0
• GPIO相关寄存器描述——IOxDIR
未定义方向控制位。IOxDIR[0]对应于 … IOxDIR[31]对应于引脚31 : 0
复位值描述IOxDIR
当引脚设置为GPIO输出模式时,可使用该寄存器控制引脚的方向。
向某位写入1使对应引脚作为输出功能,写入0时作为输入功能。
作为输入功能时,引脚处于高阻态。
周立功单片机
PINSELx
IOxDIR IOxCLR
IOxPIN
IOxSET
in
out
1
0
• GPIO相关寄存器描述——IOxSET
未定义输出置位。IOxSET[0]对应于 … IOxPIN[31]对应于引脚31 : 0
复位值描述IOxSE
T
当引脚设置为GPIO输出模式时,可使用该寄存器从引脚输出高电平。
向某位写入1使对应引脚输出高电平。写入0无效。
从该寄存器读回的数据为GPIO输出寄存器的值。该值不反映外部环
境对引脚的影响。
周立功单片机
PINSELx
IOxDIR IOxCLR
IOxPIN
IOxSET
in
out
1
0
• GPIO相关寄存器描述——IOxCLR
未定义输出清零。IOxCLR[0]对应于 … IOxCLR[31]对应于引脚31 : 0
复位值描述IOxCLR
当引脚设置为GPIO输出模式时,可使用该寄存器从引脚输出低电平。
向某位写入1使对应引脚输出低电平。写入0无效。
注意:读取该寄存器无效,不能读回输出寄存器的值。
周立功单片机
GPIO
• 使用GPIO注意要点
�引脚设置为输出方式时,输出状态由IOxSET和
IOxCLR中最后操作的寄存器决定;
�大部分GPIO输出为推挽方式(个别引脚为开漏输
出),正常拉出/灌入电流均为4mA(短时间极限值
40mA);
�复位后默认所有GPIO为输入模式。
周立功单片机
...
PINSEL0 &= 0xFFFFFFFC;
IO0DIR |= 0x00000001;
IO0SET = 0x00000001;
...
C代码:
PINSEL0
IO0DIR IO0CLR
IO0PIN
IO0SET
in
out
1
0
• GPIO应用示例——设置输出高电平
(1) 设置引脚连接模块,为GPIO
(2) 设置口方向,设置为输出
(3) 设置口状态,输出高电平
1111
周立功单片机
...
uint32 PinStat;
PINSEL0 &= 0xFFFFFFFC;
IO0DIR &= 0xFFFFFFFE;
PinStat = IO0PIN;
...
C代码:
PINSEL0
IO0DIR IO0CLR
IO0PIN
IO0SET
in
out
1
0
• GPIO应用示例——读取引脚状态
(1) 设置引脚连接模块,为GPIO
(2) 设置口方向,设置为输入
(3) 从IO0PIN读取引脚状态
IO0PIN
周立功单片机
#define DataBus 0xFF
PINSEL0 &= 0xFFFF0000;
IO0DIR |= DataBus;
IO0CLR = DataBus;
IO0SET = Data;
...
使用IOxSET和IOxCLR实现:
• GPIO应用示例——输出多位数据至IO口
(1) 设置引脚连接模块,~7为GPIO
(2) 设置口方向,设置为输出
(3) 清零8位IO口的输出状态
在需要将多位数据同时输出到某几个IO口线时,通常使用
IOxSET和IOxCLR来实现,在某些情况下也可以使用IOxPIN寄存
器实现。后者可以在多个IO口上直接输出0和1电平。
本例将8位无符号整数变量Data的值输出到~。
(4) Data变量中为1的位将输出高电平
0x??0x??0x??0x?? 0x000x000x000x00 DataDataDataData数据输出线:
周立功单片机
#define DataBus 0xFF
PINSEL0 &= 0xFFFF0000;
IO0DIR |= DataBus;
IO0PIN = (IO0SET & 0xFFFFFF00) | Data;
...
• GPIO应用示例——输出多位数据至IO口
(1) 设置引脚连接模块,为GPIO
(2) 设置口方向,设置为输出
(3) 写IO0PIN,输出数据
在需要将多位数据同时输出到某几个IO口线时,通常使用
IOxSET和IOxCLR来实现,在某些情况下也可以使用IOxPIN寄存
器实现。后者可以在多个IO口上直接输出0和1电平。
本例将8位无符号整数变量Data的值输出到~。
使用IOxPIN实现:
0x??0x??0x??0x?? DataDataDataData数据输出线:
0x??0x??0x??0x?? 0x000x000x000x00 DataDataDataData与前者对比:
周立功单片机
第5章 目录
�1.简介
�2.引脚配置
�3.存储器寻址
�4.系统控制模块
�5.存储器加速模块
�6.外部存储器控制器
�7.引脚连接模块
�8. 向量中断控制器
�
�
�
�接口
�接口
�14.定时器0/1
�15.脉宽调制器(PWM)
�
�17.实时时钟
�18.看门狗
周立功单片机
UART0
• 特性
LPC2000系列微控制器具有两个功能强大的UART,
其中UART0具有如下的特性:
�16字节接收FIFO和16字节发送FIFO;
�寄存器位置符合16C550工业标准;
�接收FIFO触发点可设置为1、4、8或14字节;
�内置波特率发生器。
周立功单片机
使用UART0通信需要两个引脚,分别为:
串行输出,发送数据输出TxD0
串行输入,接收数据输入RxD0
描述类型引脚名称
• 使用UART0通信
LPC2000的I/O电压为
(可承受5V),
连接时须注意电平的
匹配。
与PC机相连时,由于
PC机串口是RS232电
平,所以连接时需要
使用RS232转换器。
LPC2000
LPC2000
LPC2000
LPC2000
其它
通信设备
LPC2000
LPC2000
LPC2000
LPC2000
PC机串口
232
电平转换
TxD0
RxD0
TxD0
RxD0
TxD0
RxD0
TxD0
RxD0
周立功单片机
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
1.在使用UART之前需要设置的寄存器
• UART0内部结构示意图
U0LCR
U0IER
U0FCR
U0DLM U0DLL
FIFO控制
中断使能
UART0格式设置
波特率设置
周立功单片机
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
2.发送数据的通道
• UART0内部结构示意图
U0THR U0TSR
VPB
接口
CPU内核通过VPB接口对UART0的寄存器进行读写访问
发送缓存 发送移位寄存器
周立功单片机
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
3.接收数据的通道
• UART0内部结构示意图
U0RBR U0RSR
VPB
接口
接收缓存 接收移位寄存器
周立功单片机
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
4.通信过程中可能影响的标志位
• UART0内部结构示意图
U0LSR
U0IIR
中断标志
UART0
当前状态
周立功单片机
• UART0相关寄存器描述
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
U0RBR
未定义接收缓存寄存器,它包含了接收FIFO中最早接收到的字节7 : 0
复位值描述U0RB
R
U0RSR移位寄存器从RxD0引脚接收的有效数据将被送到接收FIFO中。
通过读取U0RBR寄存器可以将接收FIFO中最早接收到的字节读出,当FIFO
中不再包含有效数据时,该寄存器反映接收到的最后一个有效字节数据。
接收的数据不足8位时,高位用0填充。
注意: U0RBR只读。访问该寄存器时,U0LCR的除数锁存访问位(DLAB)
必须为0。
——接收缓存寄存器
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
周立功单片机
• UART0相关寄存器描述
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
未定义发送器保持寄存器,写入该寄存器的值保存到发送FIFO中,当该字节到达FIFO底部时,它将被送入发送移位寄存器(U0TSR)进行发送。7 : 0
复位值描述U0THR
写入该寄存器的值将是发送FIFO中的最高字节。访问该寄存器时,
U0LCR的除数锁存访问位(DLAB)必须为0。
注意: U0THR只写。它的地址与U0RBR相同,通过读/写操作予以区分。
U0THR
——发送器保持寄存器
周立功单片机
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
U0THRU0THR U0TSR
TxD0
RxD0
U0LCR U0LSR
U0IIR U0IER
U0DLM U0DLL
• UART0相关寄存器描述
除数锁存寄存器高字节
两个寄存器一起构成一个16位的除数,
决定UART0的波特率。
除数锁存寄存器低字节U0DLL[7:0]
未定义
U0DLM[7:0]
复位值描述名称
这两个寄存器决定波特率时钟的频率,而波特率时钟必须是波特率的
16倍。波特率计算公式如下:
BaudRateBaudRateBaudRateBaudRate = F = F = F = FPCLKPCLKPCLKPCLK / ([U0DLM,U0DLL] / ([U0DLM,U0DLL] / ([U0DLM,U0DLL] / ([U0DLM,U0DLL]××××16)16)16)16)
——除数锁存寄存器
U0DLM U0DLL
注意:由于U0DLL、U0DLM寄存器与其它寄存器的地址重叠,所以在访问
它们时,U0LCR的除数锁存访问位(DLAB)必须为1。
周立功单片机
U0THR U0TSR
TxD0
RxD0
U0LCR U0LSR
U0IIR U0IER
U0DLM U0DLL
• UART0相关寄存器描述
0
Rx线状态中断使能。1:禁止Rx线状态中断;0:禁止Rx线状态中断;
该中断状态可从U0LSR[4:1]读出。
2
0THRE中断使能。1:使能THRE中断;0:禁止THRE中断。1
0RBR中断使能。1:使能RDA中断;0:禁止RDA中断。0
未定义保留,用户软件不要向这些位写入1。7 : 3
复位值描述U0IER
——中断使能寄存器
U0IER
U0IER可以控制UART0的4个中断源。其中RBR中断使能包括两个中
断,一个是接收数据可用(RDA)中断,一个是接收超时中断(CTI)。稍
后将对各中断源作详细介绍。
周立功单片机
U0THR U0TSR
TxD0
RxD0
U0LCR U0LSR
U0IIR U0IER
U0DLM U0DLL
• UART0相关寄存器描述
001:3. 发送中断(THRE)
110:2b. 字符超时指示(CTI)
010:2a. 接收数据可用中断(RDA)
011:1. 接收线状态中断(RLS)
0
0中断标识。
这3位表示了对应于UART0
Rx FIFO的中断。未列出的其
它组合作为保留值。
3 : 1
0中断挂起。1:没有挂起的中断;0:至少有一个中断被挂起。0
未定义保留,用户软件不要向这些位写入1。7 : 3
复位值描述U0IIR
——中断标识寄存器
U0IIR提供状态代码用于指示一个挂起中断的中断源和优先级。在访问
U0IIR过程中,中断被冻结。如果在访问U0IIR时产生了中断,该中断将
被记录,在下次访问U0IIR时可以读出,避免了中断的丢失。
U0IIR
周立功单片机
U0THR U0TSR
TxD0
RxD0
U0LCR U0LSR
U0IIR U0IER
U0DLM U0DLL
• UART0相关寄存器描述——中断标识寄存器
中断源和中断使能的关系
U0IIR
RLSRLSRLSRLS中断(U0IIR[3:1]=011)
RDARDARDARDA中断(U0IIR[3:1]=010)
CTICTICTICTI中断(U0IIR[3:1]=110)
THRETHRETHRETHRE中断(U0IIR[3:1]=001)
VIC
中断控制器
ARM7TDMI
内核
U0IER bit2 bit1 bit0
周立功单片机
优先级
最高
第二
第二
第三
U0THR U0TSR
TxD0
RxD0
U0LCR U0LSR
U0IIR U0IER
U0DLM U0DLL
• UART0相关寄存器描述——中断标识寄存器
U0IIR
RLSRLSRLSRLS中断
RDARDARDARDA中断
CTICTICTICTI中断
THRETHRETHRETHRE中断
VIC
中断控制器
ARM7TDMI
内核
U0IER bit2 bit1 bit0
中断源和中断使能的关系
周立功单片机
• UART0相关寄存器描述——中断源说明
� RLS中断:该中断为最高优先级。它在UART0产生了四个错误
条件(溢出错误(OE)、奇偶错误(PE)、帧错误(FE)和间隔中断
(BI))中的任意一个时置位。通过查看U0LSR[4:1]可以了解
到产生该中断的错误条件。读取U0LSR时清除该中断;
周立功单片机
• UART0相关寄存器描述——中断源说明
�RDA中断:该中断与CTI中断并列为第二优先级。当接收的有效
数据到达接收FIFO设置寄存器(U0FCR)中设置的触发点时,
RDA被激活。当接收FIFO中的有效数据少于触发点时,RDA复
位;
1.移位寄存器(U0RSR)从RxD0引脚
接收串行数据后,送入接收FIFO中;
2.当接收FIFO中的有效数据数量到
达预定的触发点时,置位RDA中断;
3.从U0RBR寄存器中读取FIFO中最
早到达的数据,当FIFO中的有效数据
小于预定触发点时,清零RDA中断;
接收FIFO
1
2
3
4
5
6
7
9
10
11
12
13
14
15
16
8
触发点设置=8
U0RBR
U0RSR
RxD0
U0IIR[3:1] xxx
U0IIR[0] 1
010
0
xxx
1
D
A
T
A
周立功单片机
• UART0相关寄存器描述——中断源说明
�CTI中断:该中断为第二优先级。当接收FIFO中的有效数据少
于预定的触发点数量,但至少有一个字节时,如果超过接收
~个字节所需要的时间仍没有接收到数据,那将触发该
中断。对接收FIFO的任何操作都会清零该中断标志;
接收FIFO
1
2
3
4
5
6
7
9
10
11
12
13
14
15
16
8
触发点设置=8
U0RBR
1.移位寄存器(U0RSR)从RxD0引脚
接收串行数据后,送入接收FIFO中;
2.当接收FIFO中的有效数据少于触
发个数,但至少有一个时,如果长时
间没有数据到达,将触发CTI中断;
3.从U0RBR中读取接收FIFO中的数
据,或者有新的数据送入接收FIFO,
都将清零CTI中断;
U0RSR
D
A
T
A
RxD0
U0IIR[3:1] xxx
U0IIR[0] 1
110
0
xxx
1
周立功单片机
• UART0相关寄存器描述——中断源说明
�CTI中断:该中断为第二优先级。当接收FIFO中的有效数据少
于预定的触发点数量,但至少有一个字节时,如果超过接收
~个字节所需要的时间仍没有接收到数据,那将触发该
中断。对接收FIFO的任何操作都会清零该中断标志;
接收FIFO
1
2
3
4
5
6
7
9
10
11
12
13
14
15
16
8
触发点设置=8
U0RBR
说明:“~个字节的时间”,
其意思是在串口当前的波特率下,发
送~个字节所需要的时间;
U0RSR
D
A
T
A
RxD0
U0IIR[3:1] xxx
U0IIR[0] 1
110
0
xxx
1
注意:当接收FIFO中存在多个数据,
从U0RBR读取数据,但是没有读完所
有数据,那么在经过~个字
节的时间后将触发CTI中断;
周立功单片机
1
2
3
4
5
6
7
9
10
11
12
13
14
15
16
8
U0RBR
U0TSR
TxD0
U0IIR[3:1] xxx
U0IIR[0] 1
• UART0相关寄存器描述——中断源说明
�THRE中断:该中断为第三优先级。当发送FIFO为空并且满足
一定的条件时,该中断将被触发。这些条件是:
发送FIFO
1.系统启动时,虽然发送FIFO为
空,但不会产生THRE中断。
D
A
T
A
110
0
U0TSR
2.在上一次发生THRE中断后,向发
送FIFO中写入1个字节数据,将在延
时一个字节加上一个停止位后发生
THRE中断。
这是因为:如果发送移位寄存器为空,
那么写入发送FIFO的数据将直接进入发送移
位寄存器;
此时发送FIFO仍然为空,如果立即产生
THRE中断,就会影响紧接着要写入发送FIFO
的数据;
所以在发送完该字节以及一个停止位
后,才产生THRE中断;
3.如果在发送FIFO中有过两个字节
以上的数据,但是现在发送FIFO为空
时,将立即触发THRE中断。
当THRE中断为当前有效的最高优先级
中断时,往U0THR写数据,或者对
U0IIR的读操作,将使THRE中断复位。
周立功单片机
• UART0相关寄存器描述
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
复位RxFIFO
1
复位TxFIFO
2
—
[5 : 3]6
使能FIFORx触发点设置功能
07位
——FIFO控制寄存器
U0FCR
U0FCR控制UART0接收和发送FIFO的操作。EnFIFO:FIFO使能。该位的任何变化都将清空UART0的FIFO。
1:使能UART0的接收和发送FIFO,并且允许访问U0FCR[7:1]。
0:禁止接收FIFO,此时接收缓存只有1个字节。而发送FIFO不会被关闭。
周立功单片机
• UART0相关寄存器描述
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
复位RxFIFO
1
复位TxFIFO
2
—
[5 : 3]6
使能FIFORx触发点设置功能
07位
——FIFO控制寄存器
U0FCR
复位RxFIFO:接收FIFO复位。当该位置位时,UART0接收FIFO中的所有
字节被清零并复位指针逻辑。
注意:该位会自动清零。
周立功单片机
• UART0相关寄存器描述
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
复位RxFIFO
1
复位TxFIFO
2
—
[5 : 3]6
使能FIFORx触发点设置功能
07位
——FIFO控制寄存器
U0FCR
复位TxFIFO:发送FIFO复位。当该位置位时,UART0发送FIFO中的所有
字节被清零并复位指针逻辑。
注意:该位会自动清零。
周立功单片机
• UART0相关寄存器描述
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
复位RxFIFO
1
复位TxFIFO
2
—
[5 : 3]6
使能FIFORx触发点设置功能
07位
——FIFO控制寄存器
U0FCR
—:这些位保留,用户程序不要向这些位写入1。
周立功单片机
• UART0相关寄存器描述
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
复位RxFIFO
1
复位TxFIFO
2
—
[5 : 3]6
使能FIFORx触发点设置功能
07位
——FIFO控制寄存器
U0FCR
Rx触发点设置:通过设置这两位可以调整接收FIFO中触发RDA中断的有效
字节数量。
00:触发点0(1字节); 01:触发点1(4字节);
10:触发点2(8字节); 11:触发点3(14字节);
周立功单片机
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
U0THR U0TSR
TxD0
U0LCR U0LSR
U0IIR U0IER
U0DLM U0DLL
P1 1 D0D1D2D3D4D5D6D7 0
• UART0相关寄存器描述——线状态控制寄存器
U0LCR
间隔
6
停止位
2
奇偶设置
6
奇偶选择
[5 : 4]
字长除数锁存功能
[1 :0]7位
UART数据帧结构
停止位
(1~2位) 数据(5~8位)
奇偶校验位
(可选) 起始位
U0LCR寄存器:
U0LCR控制发送和接收数据帧的格式。
周立功单片机
U0THR U0TSR
TxD0
U0LCR U0LSR
U0IIR U0IER
U0DLM U0DLL
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
• UART0相关寄存器描述——线状态控制寄存器
间隔
6
停止位
2
奇偶设置
6
奇偶选择
[5 : 4]
字长除数锁存功能
[1 :0]7位
字长:这些位控制数据长度。
00:5位字符长度; 01:6位字符长度;
10:7位字符长度; 11:8位字符长度;
间隔
6
停止位
2
奇偶设置
6
奇偶选择
[5 : 4]
字长除数锁存功能
[1 :0]7位
U0LCR
周立功单片机
• UART0相关寄存器描述
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
——线状态控制寄存器
U0LCR
间隔
6
停止位
2
奇偶设置
6
奇偶选择
[5 : 4]
字长除数锁存功能
[1 :0]7位
停止位:控制每帧数据包含的停止位个数。
0:1个停止位; 1:2个停止位;
周立功单片机
• UART0相关寄存器描述
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
——线状态控制寄存器
U0LCR
间隔
6
停止位
2
奇偶使能
6
奇偶选择
[5 : 4]
字长除数锁存功能
[1 :0]7位
奇偶使能:控制是否进行奇偶校验。如果使能,发送时将添加一位校验位。
0:禁止奇偶产生和校验; 1:使能奇偶产生和校验;
奇偶选择:设置奇偶校验类型。
00:奇数(数据位+校验位=奇数);
01:偶数(数据位+校验位=偶数);
10:校验位强制为1; 11:校验位强制为0;
周立功单片机
• UART0相关寄存器描述
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
——线状态控制寄存器
U0LCR
间隔
6
停止位
2
奇偶使能
6
奇偶选择
[5 : 4]
字长除数锁存功能
[1 :0]7位
间隔:当该位为1时,输出引脚(TxD0)强制为逻辑0,可以引起通信对方
(LPC2000)产生间隔中断。在某些通信方式中,使用间隔中断作为通信的
起始信号(如:LIN Bus)。
0:禁止间隔发送; 1:使能间隔发送;
周立功单片机
• UART0相关寄存器描述
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
——线状态控制寄存器
U0LCR
间隔
6
停止位
2
奇偶使能
6
奇偶选择
[5 : 4]
字长除数锁存功能
[1 :0]7位
除数锁存:因为U0DLL和U0RBR/U0THR的地址重叠,通过设置该位可以指
定其中某个寄存器操作。
0:禁止访问除数锁存寄存器; 1:使能访问除数锁存寄存器;
周立功单片机
• UART0相关寄存器描述
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
TEMT
6
BI
4
THRE OE
1
PE
2
FE
35
RDRRXFE功能
07位
——线状态寄存器
U0LSR为只读寄存器,它反映了UART0接收和发送模块的状态信息。RDR:接收数据就绪。判断该位是否置一,决定能否从FIFO中读取数据。
0:U0RBR为空;
1:U0RBR中包含有效数据。从接收FIFO中读走所有数据后,恢复为0。
U0LSR
周立功单片机
• UART0相关寄存器描述
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
TEMT
6
BI
4
THRE OE
1
PE
2
FE
35
RDRRXFE功能
07位
——线状态寄存器
OE:溢出错误标志。当U0RBR寄存器中已经有新的字符就绪,而接收FIFO
已满时,该位置位。
0:接收缓存区没有溢出;
1:接收缓存区发生溢出错误。
U0LSR
周立功单片机
• UART0相关寄存器描述
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
TEMT
6
BI
4
THRE OE
1
PE
2
FE
35
RDRRXFE功能
07位
——线状态寄存器
PE:奇偶校验错误。在使能奇偶校验位之后,对所有接收的数据都进行奇
偶校验,如果与U0LCR中的设置不符,将引起奇偶校验错误。
0:没有发生奇偶校验错误;
1:发生奇偶校验错误。读操作使该位恢复为0。
U0LSR
周立功单片机
• UART0相关寄存器描述
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
TEMT
6
BI
4
THRE OE
1
PE
2
FE
35
RDRRXFE功能
07位
——线状态寄存器
FE:帧错误标志。当接收字符的停止位为0时,产生帧错误。
0:没有发生帧错误;
1:发生帧错误。读取该位时恢复为0。
U0LSR
周立功单片机
• UART0相关寄存器描述
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
TEMT
6
BI
4
THRE OE
1
PE
2
FE
35
RDRRXFE功能
07位
——线状态寄存器
BI:间隔中断标志。在发送数据时,如果RXD0引脚保持低电平,将产生间
隔中断。发生间隔中断后,接收模块停止数据接收。
0:没有发生间隔中断;
1:发生间隔中断。
U0LSR
周立功单片机
• UART0相关寄存器描述
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
TEMT
6
BI
4
THRE OE
1
PE
2
FE
35
RDRRXFE功能
07位
——线状态寄存器
THRE:反映U0THR是否为空,也可以认为发送FIFO是否为空。
0:不为空;
1:空。对U0THR进行写操作,使该位恢复为0。
U0LSR
周立功单片机
• UART0相关寄存器描述
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
TEMT
6
BI
4
THRE OE
1
PE
2
FE
35
RDRRXFE功能
07位
——线状态寄存器
TEMT:当发送移位寄存器和U0THR均为空时,该位置位。
0:不为空;
1:空。对U0THR进行写操作,使该位恢复为0。
U0LSR
周立功单片机
• UART0相关寄存器描述
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
TEMT
6
BI
4
THRE OE
1
PE
2
FE
35
RDRRXFE功能
07位
——线状态寄存器
RXFE:如果一个带有接收错误(如帧错误、奇偶错误或间隔中断)的字符
装入U0RBR时,该位置位。
0:U0RBR中没有接收错误,或U0FCR[0]为0;
1:U0RBR中包含至少一个UART0 Rx错误。
U0LSR
周立功单片机
UART0
• 使用UART0注意要点
• U0RBR与U0THR在同一地址上,但实际上是两个独立的寄存
器,读操作时选择U0RBR,写操作时选择U0THR;
• U0DLL与U0RBR/U0THR、U0DLM与U0IER在同一地址上,通
过除数访问位DLAB选择。当该位为1时,选择U0DLL和U0DLM。
为0时,选择U0RBR/U0THR和U0IER;
• 无论在U0FCR中是否使能FIFO,接收FIFO不能被禁止。关闭
FIFO后,接收FIFO只有一个字节缓冲;
• 波特率计算公式:U0DLM、U0DLL = FPCLK/(16×baud);
周立功单片机
• UART0应用示例——操作流程
设置引脚连接模块
将对应IO连接到
UART0
设置串口波特率
设置串口工作模式
发送或接收数据
检查串口状态字或
等待串口中断
周立功单片机
• UART0应用示例——初始化代码
UART0初始化代码:
#define UART_BPS 115200
Void UART0_Ini(void)
{
uint16 Fdiv;
PINSEL0 = 0x00000005;
U0LCR = 0x83;
Fdiv = (Fpclk / 16) / UART_BPS;
U0DLM = Fdiv / 256;
U0LLM = Fdiv % 256;
U0LCR = 0x03;
}
定义表示波特率的宏,方便修改
设置引脚连接模块
置位除数锁存位
根据波特率计算分频值
设置除数寄存器
(除数锁存访问位必须置位)
清除除数锁存位,并设置工作模式
周立功单片机
• UART0应用示例——初始化代码
UART0初始化代码:
#define UART_BPS 115200
Void UART0_Ini(void)
{
uint16 Fdiv;
PINSEL0 = 0x00000005;
U0LCR = 0x83;
Fdiv = (Fpclk / 16) / UART_BPS;
U0DLM = Fdiv / 256;
U0LLM = Fdiv % 256;
U0LCR = 0x03;
}
设置引脚连接模块
将对应IO连接到
UART0
设置串口波特率
设置串口工作模式
发送或接收数据
检查串口状态字或
等待串口中断
周立功单片机
• UART0应用示例——收发数据
void UART0_SendByte(uint8 data)
{
U0THR = data;
while((U0LSR & 0x40) == 0);
}
uint8 UART0_RcvByte(void)
{
uint8 rcv_data;
while((U0LSR & 0x01) == 0);
rcv_data = U0RBR;
return(rcv_data);
}
查询方式发送一字节数据:
查询方式接收一字节数据:
将要发送的一字节数据写入U0THR
等待数据发送完毕
等待数据到达
从U0RBR中读出接收的数据
返回接收的数据
周立功单片机
第5章 目录
�1.简介
�2.引脚配置
�3.存储器寻址
�4.系统控制模块
�5.存储器加速模块
�6.外部存储器控制器
�7.引脚连接模块
�8. 向量中断控制器
�
�
�
�接口
�接口
�14.定时器0/1
�15.脉宽调制器(PWM)
�
�17.实时时钟
�18.看门狗
周立功单片机
UART1
• 特性
UART1与UART0基本功能相同,但是增加了一个
调制解调器(Modem)接口。所以UART1具有UART0的
所有特性。
�16字节接收FIFO和16字节发送FIFO;
�寄存器位置符合16C550工业标准;
�接收FIFO触发点可设置为1、4、8或14字节;
�内置波特率发生器。
周立功单片机
UART1具有一个标准的Modem接口,这些引脚为:
串行输出,发送数据输出TxD1
清除发送,指示外部modem的接收是否已经准备就绪。低电平有
效,表示UART1数据可通过TxD1发送。输入CTS1
数据载波检测,指示外部modem是否已经与UART1建立了通信连
接。低电平有效,表示可以进行数据交换。输入DCD1
数据设备就绪,指示外部modem是否准备建立与UART1的连接,
低电平有效。输入DSR1
数据终端就绪,有效低电平指示UART1准备建立与外部modem的
连接。输出DTR1
铃响指示,指示modem检测到电话的响铃信号,低电平有效。输入RI1
请求发送,指示UART1打算向外部modem发送数据,低电平有效。输出RTS1
串行输入,接收数据输入RxD1
描述类型引脚名称
• 使用UART1通信
周立功单片机
• 使用UART1通信
LPC2000
LPC2000
LPC2000
LPC2000
PC机串口
RS232
电平转换
TxD1
RxD1
TxD0
RxD0
RTS
CTS
DSR1
DTR1
DCD1
RI1
RTS
CTS
DSR1
DTR1
DCD1
RI1
通过PINSEL0寄存器设置来决定是否使用UART1的
Modem接口,当使用Modem接口时,需要一个RS232转
换器将信号转换为RS232电平后,才能与Modem连接。
如果不使用Modem接口功能,UART1与UART0的操作
是一样,那么其它的接口可作为GPIO使用。
周立功单片机
UART0内部结构
UART1的结构与UART0类似,在其基础上增加
了控制MODEM接口的寄存器。
• UART1内部结构示意图
U0THR U0TSR
TxD0
U0RBR U0RSR
RxD0
U0LCR U0LSR
U0IIR U0IER
VPB
接口 U0FCR
与CPU内
核相连
U0DLM U0DLL
U1THR U1TSR
TxD0
U1RBR U1RSR
RxD0
U1LCR U1LSR
U1IIR U1IER
VPB
接口 U1FCR
与CPU内
核相连
U1DLM U1DLL
MODEM
U1MSR
U1MCR
CTS
DSR
RI
DCD
DTR
RTS
周立功单片机
UART1
Delta
DSR
RTS
使能
THRE
中断
1
Delta
DCD
0
使能
Mode
m中断
3
RI
0
0
使能Rx
数据可
用中断
使能Rx
线状态
中断
000U1IER
DTR0回送00U1MCR
后沿RI
2
CTS
4
DSR
56
Delta
CTS
DCDU1MSR
07位
UART1包含12个8位寄存器,其中大部分寄存器与
UART0类似,所以仅介绍不同之处。
• UART1寄存器描述
周立功单片机
使能
THRE
中断
1
使能
Mode
m中断
3
0
使能Rx
数据可
用中断
使能Rx
线状态
中断
000U1IER
2456 07位
使能Modem中断:当该位置位时,允许Modem中断。
Modem中断为最低优先级中断,只要在Modem输入引脚DCD、DSR或
CTS上发生任何状态变化,该中断就会激活。此外,Modem输入口RI上出现
由低到高的电平跳变会产生一个Modem中断。Modem中断源可通过检查
U1MSR[3:0]得到。读取U1MSR将清除Modem中断。
Mdoem中断在U0IIR中的标志为0x00。
UART1
——中断使能寄存器• UART1寄存器描述
周立功单片机
UART1
——Modem控制寄存器• UART1寄存器描述
用户软件不要向该位写入1
0:禁止modem回写模式
1:使能modem回写模式
modem回写模式提供了一个执行回写测试的诊断机制。
用户软件不要向该位写入1
选择Modem输出引脚RTS。该位在回写模式激活时读出为0。
选择Modem输出引脚DTR。该位在回写模式激活时读出为0。
功能描述
保留3 : 2
RTS控制1
DTR控制0
回写模式4
保留7 : 5
功能位
该寄存器使能Modem的回写模式,并控制Modem
的输出信号。
周立功单片机
UART1
——回写模式• UART1寄存器描述
在Modem回写模式下,发送器输出的串行数据在内
部连接到接收器的串行输入端。输入脚RxD1对回写模式
无影响,输出脚TxD1保持总为1的状态。 4个modem输
入(CTS, DSR, RI和DCD)与外部断开,并在内部与4个
modem输入连接。这样连接的结果是U1MSR的高4位由
U1MCR的低4位驱动。这样在回写模式下,写U1MCR的
低4位就可产生modem状态中断。
周立功单片机
反映输入信号CTS的补码。回写模式下该位连接U1MCR的bit1。CTS4
检测到DCD状态发生变化时,该位置位。读取U1MSR时清零。Delta DCD3
反映输入信号RI的补码。回写模式下该位连接U1MCR的bit2。RI6
反映输入信号DSR的补码。回写模式下该位连接U1MCR的bit0。DSR5
反映输入信号DCD的补码。回写模式下该位连接U1MCR的bit1。
检测到RI状态发生变化时,该位置位。读取U1MSR时清零。
检测到DSR状态发生变化时,该位置位。读取U1MSR时清零。
检测到CTS状态发生变化时,该位置位。读取U1MSR时清零。
功能描述
后沿 RI2
Delta DSR1
Delta CTS0
DCD7
功能位
——Modem状态寄存器• UART1寄存器描述
该寄存器为只读,它反映Modem输入信号的状态
信息。需要注意的是,Mdoem信号对UART1的操作没
有直接影响,Modem信号的操作是通过软件来实现的。
周立功单片机
第5章 目录
�1.简介
�2.引脚配置
�3.存储器寻址
�4.系统控制模块
�5.存储器加速模块
�6.外部存储器控制器
�7.引脚连接模块
�8. 向量中断控制器
�
�
�
�接口
�接口
�14.定时器0/1
�15.脉宽调制器(PWM)
�
�17.实时时钟
�18.看门狗
周立功单片机
I2C接口
• 特性
LPC2000系列微控制器具有一到两个标准的I2C接
口,它具有如下特性:
�可配置为主机、从机或主/从机;
�可编程时钟可实现通讯速率控制;
�主机从机之间双向数据传输;
�同时发送的主机之间进行仲裁,避免了总线数据
的冲突。
周立功单片机
I2C接口
• I2C简介
I2C接口是Philips推出的一种串行总线方式,用于
IC器件之间的通信。它通过SDA(串行数据线)和SCL
(串行时钟线)两根线在连到总线上的器件之间传送
信息,并通过软件寻址识别每个器件,而不需要片选
线。
I2C接口的标准传输速率为100Kbit/s,最高传输速
率可达400Kbit/s。
周立功单片机
I2C接口
• I2C简介——电气连接
I2C总线接口均为开漏或开集电极输出,因此需要
为总线增加上拉电阻Rp。
Rp Rp
VDD
SCL
SDA
SDA出
SDA入SCL入
SCL出
SCL
SDA
器件1 器件2
I2C BUS
总线速率越高,总线上拉电阻
就越小,100Kbit/s总线速率,
通常使用欧姆的上拉电阻
周立功单片机
• I2C简介——总线时序
在数据传送过程中,必须确认数据传送的开始和
结束,这通过起始和结束信号识别。
起始信号 结束信号
SDA
SCL
SSSS PPPP
SSSS 从器件地址 R/WR/WR/WR/W …………
第一字节
发送起始信号后传送的第一字节数据具有特别的意
义,其中前七位为从机地址,最后一位为读写方向位
(0表示写,1表示读)。
周立功单片机
• I2C简介——总线时序
I2C总线数据传送时,每传送一个字节数据后都必
须有应答信号(A)。主控器接收数据时,如果要结束
通信时,将在停止位之前发送非应答信号( )。
__
A
SDA
SCL
应答信号 非应答信号
AAAA AAAA
周立功单片机
• I2C简介——总线时序
LPC2000在I2C通信中可以配置为主控器也可以作
为被控器,那么它就具有4种操作模式:主发送模式、
主接收模式、从发送模式和从接收模式。
SSSS 从器件地址 WWWW AAAA 数据 AAAA 数据… A/ A/ A/ A/ AAAA PPPP
主发送模式:
SSSS 从器件地址 RRRR AAAA 数据 AAAA 数据… AAAA PPPP
主接收模式:
SSSS 从器件地址 WWWW AAAA 数据 AAAA 数据… A/ A/ A/ A/ AAAA P/RSP/RSP/RSP/RS
从发送模式:
SSSS 从器件地址 RRRR AAAA 数据 AAAA 数据… AAAA PPPP
从接收模式:
主机到从机
主机到从机
A = 应答(SDA为低)
A = 非应答(SDA为高)
S = 起始信号
P = 停止信号
RS = 重复起始信号
周立功单片机
I2C接口
• 寄存器描述
I2C接口包含7个寄存器。
0xE001C01
8
NA只清零I2C控制清零寄存器 I2CONCLR
0xE001C01
4
0x04读/写SCL占空比寄存器低半字 I2SCLL
0xE001C01
0
0x04读/写SCL占空比寄存器高半字I2SCLH
0xE001C00
C
0读/写I2C从地址寄存器 I2ADR
0xE001C00
8
0读/写I2C数据寄存器 I2DAT
0xE001C00
4
0xF8只读I2C状态寄存器 I2STAT
0xE001C00
0
0读/置位I2C控制置位寄存器I2CONSET
地址复位值访问描述名称
周立功单片机
• 寄存器描述——I2C控制置位寄存器
I2CONSET寄存器用于置位I2C通信的相关标志
位,该寄存器只能对某位置位,而不能清零,清零通
过I2CONCLR寄存器完成。
NA用户程序不要向该位写入1保留7
0I2C接口使能I2EN6
0起始标志STA5
0停止标志STO4
0I2C中断标志SI3
0应答标志AA2
NA用户程序不要向这些位写入1保留1:0
复位值描述功能位
周立功单片机
• 寄存器描述——I2C控制置位寄存器
NA用户程序不要向该位写入1保留7
0I2C接口使能I2EN6
0起始标志STA5
0停止标志STO4
0I2C中断标志SI3
0应答标志AA2
NA用户程序不要向这些位写入1保留1 :
0
复位值描述功能位
保留AASISTOSTAI2EN保留功能
1 : 0234567位
AA:为声明应答标志。
当该位置位时,在SCL线的应答时钟脉冲内,出现下面的任意
条件之一将产生一个应答信号(SDA线为低电平):
•接收到从地址寄存器中的地址。
•当I2ADR中的通用调用位(GC)置位时,接收到通用调用地址。
•当I2C接口处于主接收模式时,接收到一个数据字节。
•当I2C接口处于可寻址的从接收模式时,接收到一个数据字节。
向I2CONCLR寄存器中的AAC位写入1会使AA位清零。当AA为零
时,在SCL线的应答时钟脉冲内,出现下列情况将返回一个非应答
信号(SDA线为高电平):
•当I2C接口处于主接收模式时,接收到一个数据字节。
•当I2C接口处于可寻址的从接收模式时,接收到一个数据字节。
周立功单片机
• 寄存器描述——I2C控制置位寄存器
保留AASISTOSTAI2EN保留功能
1 : 0234567位
SI:为I2C中断标志。
当进入25种可能的I2C状态中的任何一个后,该位置位。通
常,I2C中断只在空闲的从器件中用于指示一个起始条件,或在一
个空闲的主器件(如果它等待使用I2C总线)中指示一个停止条件。
向I2CONCLR寄存器中的SIC位写入1使SI位清零。
周立功单片机
• 寄存器描述——I2C控制置位寄存器
保留AASISTOSTAI2EN保留功能
1 : 0234567位
STO:为停止标志。
当STO为1时,在主模式中,向I2C总线发送一个停止条件或在
从模式中使总线从错误状态中恢复。当总线检测到停止条件时,
STO自动清零。
在从模式中,置位STO位可从错误状态中恢复。这种情况下不
向总线发送停止条件。硬件的表现就好像是接收到一个停止条件并
切换到不可寻址的从接收模式。STO标志由硬件自动清零。
周立功单片机
• 寄存器描述——I2C控制置位寄存器
保留AASISTOSTAI2EN保留功能
1 : 0234567位
STA:为起始标志。
当STA=1时,I2C接口进入主模式并发送一个起始条件,如果已
经处于主模式,则发送一个重复起始条件。
STA可在任何时候置位,当I2C接口处于可寻址的从模式时,
STA也可以置位。
周立功单片机
• 寄存器描述——I2C控制置位寄存器
保留AASISTOSTAI2EN保留功能
1 : 0234567位
I2EN:为I2C接口使能。
当该位置位时,使能I2C接口。向I2CONCLR寄存器中的I2ENC
位写入1将使I2EN位清零。当I2EN位为0时,I2C功能被禁止。
周立功单片机
• 寄存器描述——I2C控制清零寄存器
I2CONCLR寄存器与I2CONSET寄存器的功能相
反,它用于清零I2C通信的相关标志位,该寄存器只能
对某位清零,而不能置位。
NA用户程序不要向该位写入1保留7
NAI2C接口使能I2EN6
NA起始标志STA5
NA停止标志STO4
NAI2C中断标志SI3
NA应答标志AA2
NA用户程序不要向这些位写入1保留1:0
复位值描述功能位
周立功单片机
• 寄存器描述——I2C状态寄存器
I2STAT寄存器包含了I2C接口的状态代码,它是一
个只读寄存器。一共有26种可能存在的状态代码。当
代码为0xF8时,无可用的相关信息,SI位不会置位。
所有其它25种状态代码都对应一个已定义的I2C状态。
当进入其中一种状态时,SI位将置位。
I2C处理程序就是根据该寄存器反映的状态来进行
相应的处理。
1状态位状态7 :
3
0这3个位总是为0状态2 :
0
复位值描述功能位
周立功单片机
• 寄存器描述——I2C数据寄存器
I2DAT寄存器包含要发送或刚接收的数据。当它
没有处理字节的移位时,CPU可对其进行读写。该寄
存器只能在SI置位时访问。在SI置位期间,I2DAT中的
数据保持稳定。I2DAT中的数据移位总是从右至左进
行:第一个发送的位是MSB(位7),在接收字节时,
第一个接收到的位存放在I2DAT的MSB。
0发送/接收数据位数据7 :
0
复位值描述功能位
周立功单片机
• 寄存器描述——I2C从地址寄存器
I2ADR寄存器只能在I2C设置为从模式时才能使用。
在主模式中,该寄存器无效。I2ADR的LSB为通用调
用位。当该位置位时,通用调用位(0x00)被识别
(即可以对广播地址0x00作出响应)。
0通用调用位GC0
0从模式地址地址7 :
1
复位值描述功能位
周立功单片机
• 寄存器描述——I2C占空比寄存器
I2SCLH、I2SCLL寄存器用于控制I2C通信的波特
率。其中I2SCLH定义SCL高电平所保持的PCLK周期
数,而I2SCLL定义SCL低电平所保持的PCLK周期数。
那么位频率(即总线速率)由下面的公式得出:
位频率 = Fpclk / (I2SCLH + I2SCLL)
0x04SCL高电平周期占用PCLK周期数计数值I2SCLH
0x04SCL低电平周期占用PCLK周期数计数值I2SCLL
复位值描述功能寄存器
I2SCLL I2SCLH
周立功单片机
I2C接口
• 使用I2C接口的注意要点
�I2C接口的引脚为开漏输出,必须在I2C总线上接上拉
电阻。通信速率越快,电阻值越小;
�总线上各器件的地址不能冲突;
�编程时需要仔细处理每个状态,注意各状态之间的转
移关系。
周立功单片机
I2C接口
• I2C应用示例
LPC2000对于I2C通信的处理是基于状态标志进行
的,不同的模式之间具有相通的分析方法,这里仅介
绍常用的主发送和主接收模式。
周立功单片机
• I2C应用示例——主模式设置
设置引脚连接模块
(PINSEL0)
设置通信波特率
(I2SCLH、I2SCLL)
使能主I2C
(I2CONSET)
设置中断向量
(VICxxx)
主模式初始化流程
周立功单片机
• I2C应用示例——主模式设置
设置引脚连接模块
(PINSEL0)
设置通信波特率
(I2SCLH、I2SCLL)
使能主I2C
(I2CONSET)
设置中断向量
(VICxxx)
主模式初始化流程
设置引脚连接模块
(PINSEL0)
设置通信波特率
(I2SCLH、I2SCLL)
使能主I2C
(I2CONSET)
设置中断向量
(VICxxx)
主模式初始化流程 Void I2C_init(uint32 fi2c)
{
if(fi2c > 400000)
fi2c = 400000;
PINSEL0 = (PINSEL0 & 0xFFFFFF0F) | 0x05;
I2SCLH = (Fpclk / fi2c + 1) / 2;
I2SCLL = (Fpclk / fi2c) / 2;
I2CONCLR = 0x2C;
I2CONSET = 0x40;
VICIntSelect = 0x00000000;
VICVectCntl0 = 0x29;
VICVectAddr0 = (int)IRQ_I2C;
VICIntEnable = 0x0200;
}
初始化代码
传入参数为I2C时钟频率
过滤传入参数,最高
400K时钟频率
周立功单片机
Rp Rp
VDD
SCL
SDA
SDA出
SDA入SCL入
SCL出
SCL
SDA
器件1 器件2
I2C BUS
• I2C应用示例
LPC2000在该模式下作为主控器,向从机发送数
据。数据流向如下图所示:
——主机发送
LPC2000
LPC2000
LPC2000
LPC2000
(主)
周立功单片机
• I2C应用示例
主模式数据发送的时序格式
——主机发送
SSSS 从器件地址 WWWW AAAA 数据 AAAA 数据… A/ A/ A/ A/ AAAA PPPP
起始位,用于指
示传输的开始。
结束位,用于指
示传输的结束。
第一字节的前七
位包含接收器件
的从地址,第8位
表示为写操作。
每发送完一个字节数
据,接收数据的器件
就发送一个应答位
每发送完一个字节数
据,接收数据的器件
就发送一个应答位
每发送完一个字节数
据,接收数据的器件
就发送一个应答位
每发送完一个字节数
据,接收数据的器件
就发送一个应答位
周立功单片机
• I2C应用示例
主模式数据发送的时序格式
——主机发送
SSSS 从器件地址 WWWW AAAA 数据 AAAA 数据… A/ A/ A/ A/ AAAA PPPP
(1) (2) (3) (3) (4)
通过软件置位STA进入I2C主发送模式,I2C逻辑在总线空闲后立
即发送一个起始信号;
在起始信号发送结束后,SI置位。将从机地址和写操作位装入
I2DAT,然后清零SI,将第一字节数据发出;
当从机地址和W位发送结束并收到应答位(A)后,SI位再次置位。
此时将要发送的数据装入I2DAT,开始发送数据;
在数据正确发送后,SI置位。此时如果要结束本次操作,那么置
位STO位,发送结束信号。
周立功单片机
• I2C应用示例
主模式数据发送的时序格式
——主机发送
SSSS 从器件地址 WWWW AAAA 数据 AAAA 数据… A/ A/ A/ A/ AAAA PPPP
0x08 0x18 0x28 0x28
0x30正确的状态号
在通信过程中,随着通信阶段的不同,I2STAT寄存
器中的状态号也相应的变化,并引起中断。在中断服务
程序中,根据当前的状态号来决定下一步的处理。如果
当前的状态号不符合正常操作的流程,那么就要作出相
应的错误处理,比如重新启动总线等。
0x20 0x30
0x38错误的状态号
周立功单片机
你 要 发
送数据
调用函数
ISendStr()
ISendStr()
I2C中断
IRQ_I2C()
设置I2C中断处理
所需的全局变量
(如从机地址)
清除STA、SI和
AA标志位
置位STA,启动
I2C总线
读取I2C操作完成
标志I2C_end
判断操作是否正
确,然后返回
I2C_end=1?
Y
N
读取I2C状态码
(即I2CSTAT)
根据状态码进行
相应的处理 (状
态码08H、18H、
20H 、 28H 、
38H)
按全局变量的设
置进行数据操作
及设置软件标志
清除中断逻辑,
然后中断返回
主模式数据发送流程图
周立功单片机
Rp Rp
VDD
SCL
SDA
SDA出
SDA入SCL入
SCL出
SCL
SDA
器件1 器件2
I2C BUS
• I2C应用示例
LPC2000在该模式下作为主控器,接收从机发出
的数据。数据流向如下图所示:
——主机接收
LPC2000
LPC2000
LPC2000
LPC2000
(主)
周立功单片机
SSSS 从器件地址 RRRR AAAA 数据 AAAA 数据… AAAA PPPP
主接收模式:
• I2C应用示例
主模式数据接收的时序格式
——主机接收
起始位,用于指
示传输的开始。
结束位,用于指
示传输的结束。
第一字节的前七位
包含接收器件的从
地址,第8位为1,
表示读操作。
每接收完一个字节数据,就发
送一个应答位。在接收最后一
个字节数据后,发送非应答
位,通知从机停止发送数据。
周立功单片机
• I2C应用示例
主模式数据接收的时序格式
——主机接收
(1) (2) (3) (4) (4)
通过软件置位STA进入I2C主发送模式,I2C逻辑在总线空闲后立
即发送一个起始信号;
在起始信号发送结束后,SI置位。将从机地址和读操作位装入
I2DAT,然后清零SI,将第一字节数据发出;
当从机地址和R位发送结束并收到应答位(A)后,SI位再次置位。
此时设置AA位,然后清零SI位,开始接收数据;
每接收到一字节数据,SI位再次置位,此时可以再次接收数据,
或者置位STO结束总线。
SSSS 从器件地址 RRRR AAAA 数据 AAAA 数据… AAAA PPPP
主接收模式:
周立功单片机
0x08 0x40 0x50 0x50
0x58正确的状态号
在通信过程中,随着通信阶段的不同,I2STAT寄存
器中的状态号也相应的变化,并引起中断。在中断服务
程序中,根据当前的状态号来决定下一步的处理。如果
当前的状态号不符合正常操作的流程,那么就要作出相
应的错误处理,比如重新启动总线等。
0x38 0x58
0x48错误的状态号
• I2C应用示例
主模式数据接收的时序格式
SSSS 从器件地址 RRRR AAAA 数据 AAAA 数据… AAAA PPPP
主接收模式:
——主机接收
周立功单片机
你 要 发
送数据
调用函数
ISendStr()
ISendStr()
I2C中断
IRQ_I2C()
设置 I2C 中断处
理所需的全局变
量(如从机地址)
清除STA、SI和
AA标志位
置位STA,启动
I2C总线
读取I2C操作完成
标志I2C_end
判断操作是否正
确,然后返回
I2C_end=1?
Y
N
读取I2C状态码
(即I2CSTAT)
根据状态码进
行相应的处理
(状态码 08H、
38H 、 40H 、
48H 、 50H 、
58H)
按全局变量的设
置进行数据操作
及设置软件标志
清除中断逻辑,
然后中断返回
主模式数据接收流程图
周立功单片机
第5章 目录
�1.简介
�2.引脚配置
�3.存储器寻址
�4.系统控制模块
�5.存储器加速模块
�6.外部存储器控制器
�7.引脚连接模块
�8. 向量中断控制器
�
�
�
�接口
�接口
�14.定时器0/1
�15.脉宽调制器(PWM)
�
�17.实时时钟
�18.看门狗
周立功单片机
SPI接口
• 特性
大部分LPC2000系列微控制器具有两个硬件SPI接
口(LPC2104/LPC2105/LPC2106只有一个),它们具
有如下特性:
�完全独立的SPI控制器;
�遵循同步串行接口(SPI)规范;
�全双工数据通信;
�可配置为SPI主机或从机;
�最大数据位速率为外设时钟Fpclk的1/8。
周立功单片机
SPI接口
• SPI简介
SPI是一种全双工的同步串行接口,一个SPI总线
可以连接多个主机和多个从机。在同一时刻只允许一
个主机操作总线,并且同时只能和一个从机通信。
串行时钟由主机产生,当主机发送一字节数据
(通过MOSI)的同时,从机返回一字节数据(通过
MISO)。
周立功单片机
使用SPI通信需要4个引脚,分别为:
从机选择,SPI从机选择信号是一个低有效信号,用于指示被
选择参与数据传输的从机。每个从机都有各自特定的从机选
择输入信号。
输入SSEL
主入从出,MISO信号是一个单向的信号,它将数据由从机传
输到主机。输入/输出MISO
主出从入,MOSI信号是一个单向的信号,它将数据从主机传
输到从机。输入/输出MOSI
串行时钟,用于同步SPI接口间数据传输的时钟信号。该时钟
信号总是由主机输出。输入/输出SCK
描述类型引脚名称
• SPI电气连接
SPI主机
LPC2000
LPC2000
LPC2000
LPC2000
SPI从机1
SPI从机2SSEL
SPI BUS
nCS
nCS
作SPI主机
时,SSEL要
接上拉电阻
周立功单片机
时钟相位为
1
时钟前沿数
据输出
时钟后沿数
据采样
时钟信号
极性0
极性1
从机选择
时钟相位为
0
时钟前沿数
据采样
时钟后沿数
据输出 B it 1
1 2 3 4 5 6 7 8
B i t 1 Bi t 2 Bit 3 Bi t 4 Bi t 5 Bit 6 Bi t 7 Bi t 8
B it 1 Bi t 2 Bit 3 Bi t 4 Bi t 5 Bi t 6 Bi t 7 Bit 8
B it 1 Bi t 2 Bi t 3 Bit 4 Bit 5 Bi t 6 Bi t 7 Bit 8
1 2 3 4 5 6 7 8
SCK (CPOL = 0)
SCK (CPOL = 1 )
S S E L
CP HA = 0
C y c le # CP HA = 0
MOSI (CPHA = 0)
MISO (CPHA = 0)
CP HA = 1
C y c le # C P H A = 1
MOSI (CPHA = 1)
MISO (CPHA = 1)
B it 2 Bi t 3 Bi t 4 Bi t 5 Bit 6 Bit 7 Bi t 8
• SPI传输时序
时钟前沿输出
时钟后沿采样
时钟前沿采样
时钟后沿输出
周立功单片机
• SPI工作模式
LPC2000在SPI通信中可作为从机也可以作为主
机,这取决于硬件设计和软件设置。
当器件作为主机时,使用一个IO引脚拉低相应从
机的选择引脚(SSEL),传输的起始由主机发送数据来
启动,时钟(SCK)信号由主机产生。通过MOSI发送数
据,同时通过MISO引脚接收从机发出的数据。
当器件作为从机时,传输在从机选择引脚(SSEL)
被主机拉低后开始,接收主机输出的时钟信号,在读
取主机数据的同时通过MISO引脚输出数据。
周立功单片机
• SPI接口内部结构
SCK_in
SCK_out
SS_in
SPI移位寄存器
SPI状态寄存器
SPI时钟发生器
&检测器
输出使能逻辑
SPI
寄存器接口
SPI中断
VPB总线
SPI总线
SCK_out_en
MOSI_out_en
MISO_out_en
周立功单片机
• SPI寄存器描述
S0SPINTS0SPINT0读写SPI中断标志寄存器。该寄存器包含SPI接口的中断标志。SPINT
S0SPCC
R
S0SPCC
R
0读写SPI时钟计数寄存器。该寄存器控制主机SCK的频率。
SPCC
R
S1SPDRS0SPDR0读写
SPI数据寄存器。该双向寄存
器为SPI提供发送和接收的数
据。发送数据通过写该寄存器
提供。SPI接收的数据可以从
该寄存器读出。
SPDR
S1SPSRS0SPSR0只读SPI状态寄存器。该寄存器显示SPI的状态。SPSR
S1SPCRS0SPCR0读写SPI控制寄存器。该寄存器控制SPI的操作模式。SPCR
SPI1名称SPI0名称复位值访问描述名称
周立功单片机
• SPI寄存器描述——SPI控制寄存器
保留CPHACPOLMSTRLSBFSPIE功能
2 : 034567位
SPCR寄存器包含一些可编程位来控制SPI功能模
块的功能,该寄存器必须在数据传输之前进行设定。
周立功单片机
• SPI寄存器描述——SPI控制寄存器
保留CPHACPOLMSTRLSBFSPIE功能
2 : 034567位
CPHA:时钟相位控制。
该位决定SPI传输时数据和时钟的关系,并控制从机传
输的起始和结束。当该位为:
1:时钟前沿数据输出,后沿数据采样;
0:时钟前沿数据采样,后沿数据输出;
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
SCK (CPOL = 0)
SCK (CPOL = 1 )
C y c le # CPHA = 0
C y c le # C P H A = 1
周立功单片机
• SPI寄存器描述——SPI控制寄存器
保留CPHACPOLMSTRLSBFSPIE功能
2 : 034567位
CPOL:时钟极性控制。
1:SCK为低有效;
0:SCK为高有效;
SCK (CPOL = 0)
SCK (CPOL = 1)
周立功单片机
• SPI寄存器描述——SPI控制寄存器
保留CPHACPOLMSTRLSBFSPIE功能
2 : 034567位
CPOL:主模式控制。
1:SPI处于主模式;
0:SPI处于从模式;
周立功单片机
• SPI寄存器描述——SPI控制寄存器
保留CPHACPOLMSTRLSBFSPIE功能
2 : 034567位
LSBF:字节移动方向控制。
1:每字节数据从低位(LSB)开始传输;
0:每字节数据从高位(MSB)开始传输;
B it 7 Bi t 6 Bit 5 Bi t 4 Bi t 3 Bi t 2 Bi t 1 Bit 0LSBF = 1
B it 0 Bi t 1 Bit 2 Bi t 3 Bi t 4 Bi t 5 Bi t 6 Bit 7LSBF = 0
S C K
周立功单片机
• SPI寄存器描述——SPI控制寄存器
保留CPHACPOLMSTRLSBFSPIE功能
2 : 034567位
SPIE:SPI中断使能。
1:每次SPIF或MODF置位时都会产生硬件中断;
0:SPI中断被禁止;
周立功单片机
• SPI寄存器描述——SPI状态寄存器
SPSR寄存器为只读寄存器,用于监视SPI功能模
块的状态,包括一般性功能和异常状况。
0
SPI传输完成标志。为1时表示一次SPI数据传输完成。当第一
次
读取该寄存器时,该位清零。然后才能访问SPI数据寄存器。
注:SPIF不是SPI中断标志。中断标志位于SPINT寄存器中。
SPIF7
0
写冲突。为1时表示发生了写冲突。先通过读取该寄存器清零
WCOL位,再访问SPI数据寄存器。 WCOL6
0
读溢出。为1时表示发生了读溢出。当读取该寄存器时,该位
清零。 ROVR5
0
模式错误。为1时表示发生了模式错误。先通过读取该寄存器
清零MODF位,再写SPI控制寄存器。MODF4
0从机中止标志。为1时表示发生了从机中止。读取该位清零。ABRT3
NA用户程序不要向这些保留位写入1。保留2 :0
复位值描述功能SPSR
周立功单片机
• SPI寄存器描述——SPI状态寄存器
�读溢出:当SPI功能模块内部读缓冲区包含没有读出的数据,而新
的传输已经完成,就会发生读溢出。如果SPIF位置位 (读缓冲区已
满),新接收到的数据将会丢失,而状态寄存器的读溢出 (ROVR)位
将置位。
�写冲突:在SPI数据传输过程当中不应向SPI数据寄存器写入数据。
不能向SPI数据寄存器写入数据的时间从传输启动时开始,直到
SPIF置位时读取状态寄存器为止。如果在这段时间内写SPI数据寄
存器,写入的数据将会丢失,状态寄存器中的写冲突位(WCOL)置
位。
�模式错误:SSEL信号在SPI功能模块为主机时必须无效,不能用作
GPIO。当SPI功能模块为主机时,如果SSEL信号被激活(将SSEL变
为低电平),表示有另外一个主机将该器件选择为从机。这种状态称
为模式错误。
�从机中止:如果SSEL信号在传输结束之前变为高电平,从传输将被
认为中止。此时,正在处理的发送或接收数据都将丢失,状态寄存器
的从机中止(ABRT)位置位。
周立功单片机
• SPI寄存器描述——SPI数据寄存器
SPDR寄存器为SPI提供数据的发送和接收。处于
主模式时,向该寄存器写入数据,将启动SPI数据传输。
从数据传输开始到SPIF状态位置位并且没有读取状态
寄存器的这段时间内不能对该寄存器执行写操作。
0SPI双向数据数据7 : 0
复位值描述功能SPD
R
周立功单片机
• SPI寄存器描述——SPI时钟计数寄存器
作为主机时,SPCCR寄存器控制SCK的频率。寄
存器的值为一位SCK时钟所占用的PCLK周期数。该寄
存器的值必须为偶数,并且必须不小于8。如果寄存器
的值不符合以上条件,可能会导致产生不可预测的动
作。
SPI速率 = Fpclk / SPCCR
0设定SPI时钟计数值计数值7 : 0
复位值描述功能SPCC
R
周立功单片机
• SPI寄存器描述——SPI中断寄存器
该寄存器包含SPI接口的中断标志。
0
SPI中断标志。向该位写入1清零。
注:当SPIE位置一,并且SPIF和WCOL位
种至少有一位为1时,该位置位。但是只有
当SPI中断位置位并且SPI中断在VIC种被使
能,SPI中断才能有中毒处理软件处理。
SPI中断0
NA用户程序不要向这些位写入1保留7 : 1
复位值描述功能SPCC
R
周立功单片机
SPI接口
• 使用SPI接口的注意要点
�作主机时,SSEL引脚必须接上拉电阻,不能作为IO口
使用;
�作主机时,在发送一字节数据的同时接收一字节数据;
�SPI时钟分频值必须大于或等于8;
�数据寄存器与内部移位寄存器之间没有缓冲区,写
SPDR会使数据直接进入移位寄存器。因此数据只能在上
一次数据发送完成后写入SPDR寄存器。
周立功单片机
• SPI应用示例——作为主机
操作流程
设置SPI时钟速率
(SPCCR)
设置为SPI主机
(SPCR)
选择从机
发送一字节数据
启动SPI数据传输
等待数据发送结束
(SPIF)
读出从机发送的
数据或释放从机
周立功单片机
• SPI应用示例——作为主机
操作流程
设置SPI时钟速率
(SPCCR)
设置为SPI主机
(SPCR)
选择从机
发送一字节数据
启动SPI数据传输
等待数据发送结束
(SPIF)
读出从机发送的
数据或释放从机
操作流程
设置SPI时钟速率
(SPCCR)
设置为SPI主机
(SPCR)
选择从机
发送一字节数据
启动SPI数据传输
等待数据发送结束
(SPIF)
读出从机发送的
数据或释放从机
SPI初始化代码:
#define MSTR (1 << 5)
#define CPOL (1 << 4)
#define CPHA (1 << 3)
#define LSBF (1 << 6)
#define SPI_MODE (MSTR | CPOL)
void MSpiIni(uint8 fdiv)
{
if(fdiv < 8)
fdiv = 8;
S0PCCR = fdiv & 0xFE;
S0PCR = SPI_MODE;
}
过滤分频值,如
果小于8为非法
周立功单片机
• SPI应用示例——作为主机
操作流程
设置SPI时钟速率
(SPCCR)
设置为SPI主机
(SPCR)
选择从机
发送一字节数据
启动SPI数据传输
等待数据发送结束
(SPIF)
读出从机发送的
数据或释放从机
SPI主机发送和接收程序:
#define MSTR (1 << 5)
#define CPOL (1 << 4)
#define CPHA (1 << 3)
#define LSBF (1 << 6)
#define SPI_MODE (MSTR | CPOL)
uint8 MSendData(uint8 data)
{
IO0CLR = HC595_CS;
S0PDR = data;
while(0 == (S0PSR & 0x80));
IO0SET = HC595_CS;
return(S0PDR);
}
周立功单片机
• SPI应用示例——作为从机
操作流程
设置为SPI从机
(SPCR)
将要发送的数据
放入SPDR
等待数据发送结束
(SPIF)
从SPDR中读出接
收的数据
周立功单片机
• SPI应用示例——作为从机
操作流程
设置为SPI从机
(SPCR)
将要发送的数据
放入SPDR
等待数据发送结束
(SPIF)
从SPDR中读出接
收的数据
操作流程
设置为SPI从机
(SPCR)
将要发送的数据
放入SPDR
等待数据发送结束
(SPIF)
从SPDR中读出接
收的数据
SPI初始化代码:
;初始化从机
void SSpiIni(uint8 fdiv)
{
S0PCR = (1 << 4);
}
;收发一字节数据
uint8 SSwapData(uint8 data)
{
S0PDR = data;
while(0 == (S0PSR & 0x80));
return(S0PDR);
}
周立功单片机
• SPI应用示例——作为从机
操作流程
设置为SPI从机
(SPCR)
将要发送的数据
放入SPDR
等待数据发送结束
(SPIF)
从SPDR中读出接
收的数据
SPI初始化代码:
void SSpiIni(uint8 fdiv)
{
S0PCR = (1 << 4);
}
uint8 SSwapData(uint8 data)
{
S0PDR = data;
while(0 == (S0PSR & 0x80));
return(S0PDR);
}
周立功单片机
周立功单片机
定时器0和定时器1
周立功单片机
第5章 目录
�1.简介
�2.引脚配置
�3.存储器寻址
�4.系统控制模块
�5.存储器加速模块
�6.外部存储器控制器
�7.引脚连接模块
�8. 向量中断控制器
�
�
�
�接口
�接口
�14.定时器0/1
�15.脉宽调制器(PWM)
�
�17.实时时钟
�18.看门狗
周立功单片机
定时器0/1
• 特性
LPC2000系列“微控制器”具有两个功能强大的定
时器,它们具有以下特性:
�具有32位可编程预分频器;
�多达4路捕获通道,可设置被捕获信号的特征;
�4个32位匹配寄存器,可设置匹配发生后的动作;
�4个对应于匹配寄存器的外部输出,可设置匹配输
出的信号特征。
周立功单片机
定时器0/1
• 应用
LPC2000
LPC2000
LPC2000
LPC2000
CAP MAT
捕获外部信号
用于对内部事件进行
计数的间隔定时器,
或着产生系统节拍
匹配输出
周立功单片机
捕获信号,用来捕获管脚的跳变,可配置为将定时器
值装入一个捕获寄存器,并可选择产生一个中断。可
选择多个管脚用作捕获功能,而且,假设如果有2个
管脚被选择并行提供功能,它们的输入将进
行逻辑或,所得结果用作一个捕获输入。
输入
~
~
管脚描述管脚方向管脚名称
• 定时器引脚描述
信号过滤
捕获控制寄存器
Tx定时器
捕获寄存器
多个引脚作为捕
获功能时,对输
入信号相或处理 如果输入信号满足设定的要求,
将触发捕获动作
周立功单片机
外部匹配输出0/1。当匹配寄存器0/1(MR3:0)等于
定时器计数器(TC)时,该输出可翻转、变为低电
平、变为高电平或不变。外部匹配寄存器(EMR)
控制该输出的功能。可选择多个管脚并行用作匹配输
出功能。例如,同时选择2个管脚并行提供功
能。
输出
~
~
管脚描述管脚方向管脚名称
• 定时器引脚描述
信号输出
匹配控制寄存器
Tx定时器
匹配寄存器
=
当定时器值等于预设
的匹配值时,从引脚
输出特定的信号信号输出 =
周立功单片机
定时器0/1
• 寄存器描述
LPC2000微控制器中与定时器相关的寄存器数量
较多,但可以分为三类:
▪基本功能相关寄存器;
▪匹配功能相关寄存器;
▪捕获功能相关寄存器;
周立功单片机
• 寄存器描述——基本功能寄存器
0读写中断标志寄存器。读该寄存器识别中断源,写该寄存器清除中断标志。IR
0读写预分频计数器。为32位计数器,计数频率为PCLK,当计数值等于预分频计数器的值时,TC计数器加一。PC
0读写预分频控制寄存器。用于设定预分频值,为32位寄存器。PR
0读写定时器计数器。为32位计数器,计数频率为PCLK经过预分频计数器后频率值。TC
0读写定时器控制寄存器。控制定时器计数器功能(禁止或复位)。TCR
复位值访问描述名称
预分频计数器
TxPC
定时器计数器
TxTC
预分频寄存器
TxPR
定时器控制
TxTCR
中断标志寄存器
TxIR
Fpclk
周立功单片机
• 寄存器描述——基本功能寄存器
预分频计数器
TxPC
定时器计数器
TxTC
预分频寄存器
TxPR
定时器控制
TxTCR
中断标志寄存器
TxIR
Fpclk
预分频计数器
TxPC
定时器计数器
TxTC
预分频寄存器
TxPR
定时器控制
TxTCR
中断标志寄存器
TxIR
Fpclk
TxPR
TxPR寄存器为32为寄存器,该寄存器指定了预分
频计数器的最大值。
预分频值功能
31 : 0位
周立功单片机
• 寄存器描述——基本功能寄存器
预分频计数器
TxPC
定时器计数器
TxTC
预分频寄存器
TxPR
定时器控制
TxTCR
中断标志寄存器
TxIR
Fpclk
TxPR
TxPC
TxPC寄存器为32为寄存器。预分频计数器每个
pclk周期加1。当其到达预分频寄存器中保存的值时,
定时器计数器加1,预分频计数器在下个pclk周期复位。
这样,当PR=0时,定时器计数器每个pclk周期加1,当
PR=1时,定时器计数器每2个pclk周期加1。
0
复位值
计数值功能
31 : 0位
周立功单片机
• 寄存器描述——基本功能寄存器
预分频计数器
TxPC
定时器计数器
TxTC
预分频寄存器
TxPR
定时器控制
TxTCR
中断标志寄存器
TxIR
Fpclk
TxPR
定时器控制寄存器TCR用于控制定时器计数器的
操作。
0
0
复位值
为1时定时器计数器和预分频计数器在PCLK
的下一个上升沿同步复位。计数器在TCR的
bit1恢复为0之前保持复位状态。
1:定时器计数器和预分频计数器使能计数;
0:定时器计数器和预分频计数器停止计数。
描述
计数器复位1
计数器使能0
功能TCR
TxTCR
周立功单片机
• 寄存器描述——基本功能寄存器
预分频计数器
TxPC
定时器计数器
TxTC
预分频寄存器
TxPR
定时器控制
TxTCR
中断标志寄存器
TxIR
Fpclk
TxPR
当预分频计数器到达计数的上限时,定时器计数
器寄存器(TxTC)加1。TC从0x00000000计数一直到
0xFFFFFFFF,然后翻转至0,除非中途被复位。计数
值翻转不会引起中断。
TxTC
0
复位值
计数值功能
31 : 0位
周立功单片机
• 寄存器描述——基本功能寄存器
预分频计数器
TxPC
定时器计数器
TxTC
预分频寄存器
TxPR
定时器控制
TxTCR
中断标志寄存器
TxIR
Fpclk
TxPR
中断寄存器包含4个位用于匹配中断,另外4个位
用于捕获中断。如果有中断产生,IR中的对应位会置
位。向对应的IR位写入1会复位中断,写入0无效。
CR3中断
CR2中断
CR1中断
CR0中断
功能
匹配0中断
匹配0中断
匹配0中断
匹配0中断
描述
7
6
5
4
位
捕获0中断MR0中断0
捕获1中断MR1中断1
捕获2中断MR2中断2
捕获0中断
描述
MR3中
断3
功能位
TxIR
周立功单片机
• 寄存器描述——匹配功能寄存器
0读写匹配寄存器3,通过MCR寄存器可以设置匹配发生时的动作MR3
0读写外部匹配寄存器,EMR控制外部匹配管脚~
0读写匹配寄存器2,通过MCR寄存器可以设置匹配发生时的动作MR2
0读写匹配寄存器1,通过MCR寄存器可以设置匹配发生时的动作MR1
0读写匹配寄存器0,通过MCR寄存器可以设置匹配发生时的动作MR0
0读写匹配控制寄存器,用于控制在匹配时是否产生中断或复位TCMCR
复位值访问描述名称
匹配控制
MCR
匹配值
MR0~MR3
匹配输出
EMR
定时器计数器
TC
周立功单片机
• 寄存器描述——匹配功能寄存器
匹配控制
MCR
匹配值
MR0~MR3
匹配输出
EMR
定时器计数器
TC
匹配控制
MCR
匹配值
MR0~MR3
匹配输出
EMR
定时器计数器
TCMCR
匹配控制寄存器用于控制在发生匹配时所执行的操作。
0MR311 : 9
0MR28 : 6
0
与匹配0(MR0)对应位功能相同(略)
MR15 : 3
0
为1时,MR0与TC值的匹配将清零TCR的bit0位,使TC
和PC停止。为0时该特性被禁止。
停止
(MR0)
2
0为1时,MR0与TC值的匹配将使TC复位。为0时禁止。复位
(MR0)
1
0为1时,MR0与TC值的匹配将产生中断。为0时禁止。中断
(MR0)
0
复位值描述功能位
周立功单片机
• 寄存器描述——匹配功能寄存器
匹配控制
MCR
匹配值
MR0~MR3
匹配输出
EMR
定时器计数器
TC
匹配寄存器(MR0~MR3)值与定时器计数值相比
较,当两个值相等时自动触发在MCR寄存器中设置的动
作。
MR0~MR3
0
复位值
匹配值功能
31 : 0位
周立功单片机
• 寄存器描述——匹配功能寄存器
匹配控制
MCR
匹配值
MR0~MR3
匹配输出
EMR
定时器计数器
TC
外部匹配寄存器提供外部匹配管脚~
(n为0或1)的控制和状态。
EMR
周立功单片机
• 寄存器描述——匹配功能寄存器
匹配控制
MCR
匹配值
MR0~MR3
匹配输出
EMR
定时器计数器
TC
EMR
0外部匹配控制
2
9 : 8
0外部匹配控制
3
11 :
10
0外部匹配控制
1
7 : 6
0决定相应外部匹配的功能。
00:不执行任何动作;
01:将对应的外部匹配输出设置为0;
10:将对应的外部匹配输出设置为1;
11:使对应的外部匹配输出翻转。
外部匹配控制
0
5 : 4
0外部匹配33
0外部匹配22
0外部匹配11
0
反映相应外部匹配的状态,而不管是否连接到
管脚。发生匹配时该位的动作由EMR中相应的
控制位决定。
外部匹配00
复位值描述功能位
周立功单片机
• 寄存器描述——捕获功能寄存器
0只读功能同上。CR3
0只读功能同上。CR3
0只读功能同上。CR1
0只读捕获寄存器0,在捕获0引脚上产生捕获时间时,CR0装载TC的值。CR0
0读写捕获控制寄存器,用于设置捕获信号的触发特征,以及捕获发生时是否产生中断。CCR
复位值访问描述名称
捕获控制
CCR
捕获寄存器
CR0~CR3
定时器计数器
TC
周立功单片机
• 寄存器描述——捕获功能寄存器
捕获控制
CCR
捕获寄存器
CR0~CR3
定时器计数器
TC
捕获控制
CCR
捕获寄存器
CR0~CR3
定时器计数器
TC
CCR
在发生捕获事件时,捕获控制寄存器用于控制是否
将定时器计数值装入寄存器。同时还可以设置被捕获信
号的特征。
周立功单片机
• 寄存器描述——捕获功能寄存器
捕获控制
CCR
捕获寄存器
CR0~CR3
定时器计数器
TC
CCR
0与对应位功能相同(略) : 9
0与对应位功能相同(略) : 6
0与对应位功能相同(略) : 3
0
为1时,的捕获事件将产生一个中断。为0时
该特性被禁止。
事件中断
2
0
为1时,引脚上1到0的跳变将导致TC的内容
装入CR0。为0时,该特性被禁止。
下降沿捕获
1
0
为1时,引脚上0到1的跳变将导致TC的内容
装入CR0。为0时,该特性被禁止。
上升沿捕获
0
复位值描述功能位
周立功单片机
• 寄存器描述——捕获功能寄存器
捕获控制
CCR
捕获寄存器
CR0~CR3
定时器计数器
TC
每个捕获寄存器都与一个或几个器件管脚相关联。
当管脚发生特定的事件时,可将定时器计数值装入该寄
存器。捕获控制寄存器的设定决定捕获功能是否使能,
以及捕获事件在管脚的上升沿、下降沿或是双边沿发生。
CR0~CR3
0
复位值
捕获值功能
31 : 0位
周立功单片机
定时器0/1
• 使用定时器的注意要点
�定时计数器(TC)本身不能产生中断,只有与匹配寄存
器发生匹配后才能引起中断事件;
�在定时器匹配发生后,可以不停止定时器工作,而动
态修改匹配寄存器的值;
�定时器使用匹配功能的同时,还可以使用捕获功能,
而不必分时使用;
�定时器计数时钟频率 = Fpclk / (PR+1)
周立功单片机
• 定时器操作示例
定时器设置为匹配时复位计数器并产生中断。预分
频设置为2,匹配寄存器设置为6。在发生匹配的定时器
周期结束时,定时器计数值复位。这样就使匹配值具有
完整长度的周期。
0 1 2 0 1 2 0 1 2 0 1 2 0 1
4 5 6 0 1
P C L K
预分频计数器
定时器计数器
T C复 位
中 断
PR=2, MRx=6, 匹配时使能中断和复位
预分频计数器计
数频率为PCLK
定时器计数器计
数频率为PCLK/3
最后一个周期复
位定时器计数器
产生匹配中断
周立功单片机
• 定时器操作示例
操作流程
计算定时器的
计数频率
设置匹配值及
工作模式
设置捕获方式
设置定时器中断
VIC
启动定时器
TCR
周立功单片机
• 定时器操作示例 ——定时器0初始化
操作流程
计算定时器的
计数频率
设置匹配值及
工作模式
设置捕获方式
设置定时器中断
VIC
启动定时器
TCR
操作流程
计算定时器的
计数频率
设置匹配值及
工作模式
设置捕获方式
设置定时器中断
VIC
启动定时器
TCR
Void Time0Init(void)
{
T0TC = 0;
T0PR = 0;
T0MCR = 0x03;
T0MR0 = Fpclk / 10;
T0TCR = 0x01;
}
C代码:
定时器设置为0
设置预分频值
设置匹配模式,复位并中断
设置匹配值,
启动定时器0
周立功单片机
LPC2000
LPC2000
LPC2000
LPC2000
• 定时器操作示例 ——用定时器测量脉冲宽度
...
T0TC = 0;
T0PR = 0;
while((IO0PIN & 0x01) != 0);
T0TCR = 0x01;
while((IO0PIN & 0x01) == 0);
T0TCR = 0x00;
time = T0TC;
...
C代码:
定时器设置为0
设置预分频值
等待引脚电平变低
启动定时器0
等待引脚电平变高
关闭定时器0
读取定时器值,即为脉宽
tttt
VVVV
time
周立功单片机
• 定时器操作示例 ——匹配输出
Void MATOut(void)
{
PINSEL0 = 0x00000800;
T0TC = 0;
T0PR = 0;
T0MCR = 0x01;
T0EMR = 0xC0;
T0MR1 = 5000;
T0TCR = 0x01;
}
C代码:
定时器设置为0
设置预分频值
设置匹配后复位TC
设置匹配后输出翻转
输出频率周期控制
启动定时器0
设置引脚连接模块
将引脚设置为输出50%的方波,程序设置了
MR1匹配后复位定时器,并且输出电平翻转。
周立功单片机
• 定时器操作示例 ——定时器捕获
Void TimeCAP(void)
{
PINSEL0 = 0x20;
T0PR = 0;
T0CCR = 0x02;
T0TC = 0;
T0TCR = 0x01;
}
C代码:
设置预分频值为0
设置为下降沿捕获
清零TC
启动定时器
设置引脚连接模块
示例使用定时器对引脚的信号进行捕获,并设
置为下降沿捕获。当有捕获事件产生时自动把定时器的
当前值装载到T0CR0寄存器中。
周立功单片机
第5章 目录
�1.简介
�2.引脚配置
�3.存储器寻址
�4.系统控制模块
�5.存储器加速模块
�6.外部存储器控制器
�7.引脚连接模块
�8. 向量中断控制器
�
�
�
�接口
�接口
�14.定时器0/1
�15.脉宽调制器(PWM)
�
�17.实时时钟
�18.看门狗
周立功单片机
脉宽调制器
• 特性
LPC2000系列微控制器的脉宽调制器建立在独立
的32位标准定时器之上,具有如下特性:
�带可编程32位预分频的32位定时器/计数器;
�7个匹配寄存器,可实现6个单边沿控制或3个双边
沿控制PWM输出,或两者的混合输出;
�脉冲周期和宽度可以是任何的定时器计数值;
�匹配寄存器更新与脉冲输出同步,防止产生错误
脉冲。
选讲内容选讲内容选讲内容选讲内容
周立功单片机
脉宽调制器
• PWM简介
LPC2000的PWM基于标准的定时器模块,具有定
时器的所有特性,它是定时器功能中匹配事件的功能
扩展。使用PWM功能,可以在指定引脚输出需要的波
形。输出波形可分为两类:
▪单边沿输出;
▪双边沿输出。
周立功单片机
脉宽调制器
• PWM简介
使用两个匹配寄存器就可以实现单边沿控制的
PWM输出。其中一个匹配寄存器(PWMMR0)控制
PWM周期,另一个匹配寄存器控制PWM边沿的位
置,即占空比。PWMMR0是所有PWM输出共用的,
所以每增加一路PWM输出,实际上只要增加一个控制
占空比的匹配寄存器。当PWMMR0发生匹配时,输出
都会变成高电平。
——单边沿输出
周立功单片机
脉宽调制器
• PWM简介 ——单边沿输出
T
T
T
T
PWMMR0控
制PWM周期
其它匹配寄存器
控制边沿位置
其它匹配寄存器
控制边沿位置
不同占空比的单边沿控制PWM输出
所有单边沿输出在周
期开始时都为高电
平,并在匹配发生前
一直保持高电平
周立功单片机
脉宽调制器
• PWM简介
实现双边沿输出需要3个匹配寄存器进行控制。其
中PWMMR0用于控制PWM周期,其它两个匹配寄存
器分别控制PWM输出的前沿和后沿的位置。与单边沿
输出一样,PWMMR0是所有输出共用的,所以每增加
一路双边沿输出,需要增加两个匹配控制寄存器。
——双边沿输出
周立功单片机
脉宽调制器
• PWM简介
T
T
T
T
双边沿控制PWM输出正负脉冲
PWMMR0控
制PWM周期
其它匹配寄存器
控制边沿位置
其它匹配寄存器
控制边沿位置
——双边沿输出
周立功单片机
脉宽调制器
• PWM简介 ——PWM输出触发关系
匹配6匹配5匹配6匹配06
匹配5匹配4匹配5匹配05
匹配4匹配3匹配4匹配04
匹配3匹配2匹配3匹配03
匹配2匹配1匹配2匹配02
匹配1匹配0匹配1匹配01
复位置位复位置位
双边沿PWM (PWMSELn =
1)
单边沿PWM (PWMSELn =
0)PWM通道
举例说明:使用PWM通道5输出时。
如果为单边沿输出,那么匹配0事件置位输出引脚,匹配5事件复位输出引脚。
如果为双边沿输出,那么匹配4事件置位输出引脚,匹配5事件复位输出引脚。
匹配5匹配4匹配5匹配05
周立功单片机
脉宽调制器
• PWM引脚描述
一共有6个PWM输出通道输出PWM6
一共有6个PWM输出通道输出PWM5
一共有6个PWM输出通道输出PWM4
一共有6个PWM输出通道输出PWM3
一共有6个PWM输出通道输出PWM2
一共有6个PWM输出通道输出PWM1
管脚描述管脚方向管脚名称
周立功单片机
脉宽调制器
• PWM寄存器描述
PWM模块的控制寄存器数量较多,但是因为它是
建立在标准定时器的基础上,所以一部分寄存器功能与
定时器功能类似。所有寄存器大致可以分为两类:
▪基本功能寄存器
▪匹配控制寄存器
周立功单片机
• PWM寄存器描述 ——基本功能寄存器
读写PWM中断标志寄存器。读该寄存器识别中断源,写该寄存器清除中断标志。PWMIR
读写PWM预分频计数器。为32位计数器,计数频率为PCLK,当计数值等于预分频计数器的值时,TC计数器加一。PWMPC
读写PWM预分频控制寄存器。用于设定预分频值,为32位寄存器。PWMPR
读写PWM定时器计数器。为32位计数器,计数频率为PCLK经过预分频计数器后的频率值。PWMTC
读写PWM定时器控制寄存器。控制PWM定时器计数器功能(禁止或复位)。
PWMTC
R
访问描述名称
预分频计数器
PWMPC
定时器计数器
PWMTC
预分频寄存器
PWMPR
定时器控制
PWMTCR
中断标志寄存器
PWMIR
Fpclk
大部分寄存器的功能与
定时器部件相同,所以
仅介绍与之不同的地方
周立功单片机
预分频计数器
PWMPC
定时器计数器
PWMTC
预分频寄存器
PWMPR
定时器控制
PWMTCR
中断标志寄存器
PWMIR
Fpclk
预分频计数器
PWMPC
定时器计数器
PWMTC
预分频寄存器
PWMPR
定时器控制
PWMTCR
中断标志寄存器
PWMIR
Fpclk
PWM定时器控制寄存器TCR用于控制定时器计数
器的操作。
0
为1时,定时器计数器和预分频计数器在
PCLK的下一个上升沿同步复位。计数器在
TCR的bit1恢复为0之前保持复位状态。
计数器复位1
NA用户程序不要向该位写入1保留2
0
0
复位值
为1时,PWM模式使能。为0时, PWM禁止
1:定时器计数器和预分频计数器使能计数;
0:定时器计数器和预分频计数器停止计数。
描述
PWM使能3
计数器使能0
功能TCR
PWMTCR
• PWM寄存器描述 ——基本功能寄存器
周立功单片机
预分频计数器
PWMPC
定时器计数器
PWMTC
预分频寄存器
PWMPR
定时器控制
PWMTCR
中断标志寄存器
PWMIR
Fpclk
• 寄存器描述——基本功能寄存器
中断寄存器包含11个位。其中7个位用于匹配中
断,其它的位保留。中断发生时,对应位将被置一。
向对应的IR位写入1会复位中断,写入0无效。
匹配6中断PWMMR610匹配3中断PWMMR03
PWMMR5
PWMMR4
—
功能
匹配2中断
匹配1中断
匹配0中断
描述
9
8
4:7
位
保留PWMMR00
匹配4中断PWMMR01
匹配5中断PWMMR02
描述功能位
PWMIR
周立功单片机
• PWM寄存器描述 ——匹配功能寄存器
读写PWM锁存使能寄存器。使能新的PWM匹配值有效。PWMLER
读写PWM控制寄存器。使能PWM输出并选择PWM通道类型为单边沿或双边沿控制。PWMPCR
读写
PWM匹配定时器。每个寄存器对应于一个匹配值。除MR0和TC匹
配会置位所有单边沿模式下的PWM输出外,其它的匹配事件将清
零相应的单边沿或双边沿PWM输出。在双边沿模式下,匹配事件
还将置位下一个相邻的PWM输出。比如PWM2发生匹配,会清零
PWM2输出,如果在双边沿模式下还将置位PWM3输出。
PWMMR
0~
PWMMR6
读写PWM匹配控制寄存器。用于控制匹配时是否产生中断或复位TC。PWMMCR
访问描述名称
锁存使能
PWMLER
定时器计数器
PWMTC
PWM控制
PWMPCR
匹配控制
PWMMCR
映像寄存器匹配寄存器
PWMMRx
PWM输出
周立功单片机
锁存使能
PWMLER
定时器计数器
PWMTC
PWM控制
PWMPCR
匹配控制
PWMMCR
映像寄存器匹配寄存器
PWMMRx
PWM输出
• PWM寄存器描述 ——匹配功能寄存器
锁存使能
PWMLER
定时器计数器
PWMTC
PWM控制
PWMPCR
匹配控制
PWMMCR
映像寄存器匹配寄存器
PWMMRx
PWM输出
PWMMCR
0功能与PWMMR0相同(略)PWMMR1~64:2
0
0
为1时,PWMMR0与PWMTC值的匹配时将产生停
止,该中断被禁止。
停止
(PWMMR0)
2
0
为1时,PWMMR0与PWMTC值的匹配时将产生复
位,该中断被禁止。
复位
(PWMMR0)
1
0
为1时,PWMMR0与PWMTC值的匹配时将产生中
断,该中断被禁止。
中断
(PWMMR0)
0
复位值描述功能位
周立功单片机
• PWM寄存器描述 ——匹配功能寄存器
锁存使能
PWMLER
定时器计数器
PWMTC
PWM控制
PWMPCR
匹配控制
PWMMCR
映像寄存器匹配寄存器
PWMMRx
PWM输出
PWMMRx
PWM匹配寄存器值连续与PWM定时器计数值相
比较。当这两个值相等时自动触发相应动作。这些动
作包括产生中断、复位PWM定时器计数器或停止定时
器。
0
复位值
设定的匹配值功能
31 : 0位
周立功单片机
• PWM寄存器描述 ——匹配功能寄存器
锁存使能
PWMLER
定时器计数器
PWMTC
PWM控制
PWMPCR
匹配控制
PWMMCR
映像寄存器匹配寄存器
PWMMRx
PWM输出
PWM锁存使能寄存器用于控制PWM匹配寄存器
的更新。
在产生PWM时,为了保证一个周期的完整,在更
改PWM匹配寄存器之后,并不能立即生效。而是在
MR0发生匹配并且PWMLER中的相应位置位时才能使
修改值生效。
PWMLER
周立功单片机
• PWM寄存器描述 ——匹配功能寄存器
锁存使能
PWMLER
定时器计数器
PWMTC
PWM控制
PWMPCR
匹配控制
PWMMCR
映像寄存器匹配寄存器
PWMMRx
PWM输出
PWMLER
NA用户程序不要向该位写入1。保留7
0功能同上,只是分别对应匹配1到匹配6。
使能
PWM匹配
1~6锁存
6 : 1
0
该位置位后,写入PWM匹配寄存器0(PWMMR0)的值
才能在MR0发生匹配事件后生效。
使能PWM
匹配0锁存0
复位值描述功能位
周立功单片机
• PWM寄存器描述 ——匹配功能寄存器
锁存使能
PWMLER
定时器计数器
PWMTC
PWM控制
PWMPCR
匹配控制
PWMMCR
映像寄存器匹配寄存器
PWMMRx
PWM输出
PWMPCR
PWM匹配控制寄存器用于使能并选择每个PWM
通道的类型。
周立功单片机
• PWM寄存器描述 ——匹配功能寄存器
NA用户程序不要向这些位写入1。保留15
0为1时,使能PWM6输出;为0时禁止。PWMENA614
0为1时,使能PWM5输出;为0时禁止。PWMENA513
0为1时,使能PWM4输出;为0时禁止。PWMENA412
0为1时,使能PWM3输出;为0时禁止。PWMENA311
0为1时,使能PWM2输出;为0时禁止。PWMENA210
0为1时,使能PWM1输出;为0时禁止。PWMENA19
NA用户程序不要向这些位写入1。保留8 : 7
0功能同上,控制PWM6通道的输出模式。PWMSEL66
0功能同上,控制PWM5通道的输出模式。PWMSEL55
0功能同上,控制PWM4通道的输出模式。PWMSEL44
0功能同上,控制PWM3通道的输出模式。PWMSEL33
0
为0时,PWM2通道选择单边沿控制模式。为1选择
双边沿模式。PWMSEL22
NA用户程序不要向这些位写入1。保留1 : 0
复位值描述功能PWMPCR位
周立功单片机
脉宽调制器
• 使用PWM的注意要点
▪修改匹配寄存器之后,必须设置锁存使能寄存器中
的相应位,否则匹配寄存器的值不能生效;
▪修改匹配寄存器时,不需要停止PWM定时器,以免
产生无完整的PWM波形;
▪不使用PWM功能时,可将该部件作为一个标准的32
位定时器使用;
▪PWMTC计数频率= Fpclk / (PWMPR+1)
周立功单片机
• PWM使用示例
操作流程
连接PWM输出
功能引脚
设置预分频值
设置匹配值
设置PWM
输出方式
启动PWM定时器
周立功单片机
• PWM使用示例
Void PWM1Out(uint16 FREQ)
{
PINSEL0 &= 0xFFFFFFFC;
PINSEL0 |= 0x00000002;
PWMPCR = 0x200;
PWMMCR = 0x02;
PWMPR = 0x00;
PWMMR0 = Fpclk / FREQ;
PWMMR1 = PWMMR0 / 2;
PWMLER = 0x03;
PWMTCR = 0x09;
}
PWM1输出50%占空比方波
输出频率,单位Hz
设置引脚连接模块
连接PWM1输出
使能PWM1输出
MR0匹配后复位定时器
设置预分频值为0
设置PWM周期
设置占空比为50%
使能PWM匹配锁存
使能PWM,启动定时器
——单边沿输出
周立功单片机
• PWM使用示例
Void PWM2Out(uint16 FREQ)
{
PINSEL0 &= 0xFFFF3FFF;
PINSEL0 |= 0x00008000;
PWMPCR = 0x404;
PWMMCR = 0x02;
PWMPR = 0x00;
PWMMR0 = Fpclk / FREQ;
PWMMR1 = PWMMR0 / 5;
PWMMR2 = PWMMR1 * 2;
PWMLER = 0x07;
PWMTCR = 0x09;
}
PWM2双边沿控制输出
输出频率,单位Hz
设置引脚连接模块连
接PWM1输出
设置PWM2双边沿输出
MR0匹配后复位定时器
设置预分频值为0
设置PWM周期
设置前沿在周期的1/5处
设置后沿在周期的2/5处
使能PWM匹配锁存
使能PWM,启动定时器
——双边沿输出
周立功单片机
第5章 目录
�1.简介
�2.引脚配置
�3.存储器寻址
�4.系统控制模块
�5.存储器加速模块
�6.外部存储器控制器
�7.引脚连接模块
�8. 向量中断控制器
�
�
�
�接口
�接口
�14.定时器0/1
�15.脉宽调制器(PWM)
�
�17.实时时钟
�18.看门狗
周立功单片机
A/D转换器
• 特性
LPC2114/2124具有一个AD转换器,LPC2200系列
具有两个AD转换器,它们具有如下特性:
�10位逐次逼近式模式转换器;
�测量范围:0~;
�10位转换事件>=;
�可设置AD转换触发方式;
�具有掉电模式。
周立功单片机
A/D转换器
• A/D转换器描述
A/D转换器的基本时钟由VPB时钟提供。可编程
分频器可将时钟调整至逐步逼近转换所需的
(最大)。如要要得到10位精度的结果,需要11个
A/D转换时钟。
A/D转换器的参考电压来自V3A和VSSA引脚。
周立功单片机
A/D转换器
• A/D转换器描述
模拟电源和地。它们分别与标称的V3和VSSD的电压相
同,但为了降低噪声和出错几率,两者应当隔离。转换
器的VrefP和VrefN信号在内部与这两个电源信号相连。
电源V3A,VSSA
模拟输入。A/D转换器单元可分时测量这8个引脚上的输
入信号电压。即使这些引脚设置为GPIO功能,仍可以使
用A/D转换器部件。
输入AIN7~AIN0
引脚描述类型引脚名称
A/D引脚描述
周立功单片机
A/D转换器
• A/D转换器内部结构
…
ADDR
A/D
转换控制电路
A/D数据寄存器
ADCR
A/D控制寄存器 Fpclk
AD转换时钟
VIC
AIN0
AIN1
AIN7
…
周立功单片机
• A/D转换器寄存器描述
…
ADDR
A/D
转换控制电路
A/D数据寄存器
ADCR
A/D控制寄存器 Fpclk
AD转换时钟
VIC
AIN0
AIN1
AIN7
…
…
ADDR
A/D
转换控制电路
A/D数据寄存器
ADCR
A/D控制寄存器 Fpclk
AD转换时钟
VIC
AIN0
AIN1
AIN7
…
NA读写
A/D数据寄存器。该寄存器包含ADC的结束标
志位和10位的转换结果(当结束标志位为1
时,转换结果才是有效的)。
ADDR
0x000000
1读写
A/D控制寄存器。A/D转换开始前,必须设置
ADCR寄存器来选择工作模式。ADCR
复位值访问描述名称
周立功单片机
• A/D转换器寄存器描述
…
ADDR
A/D
转换控制电路
A/D数据寄存器
ADCR
A/D控制寄存器 Fpclk
AD转换时钟
VIC
AIN0
AIN1
AIN7
…
ADCR
SELCLKDIVBURSTCLKSPDN
TEST1:
0
STARTEDGE功能
7:015:81619:172123:2226:2427位
——控制寄存器
SEL:从AIN3~AIN0(LPC2114/2124)或AIN7~AIN0(LPC2212/2214)中选择采
样和转换输入引脚。Bit0控制AIN0,bit1控制AIN1,依此类推。
1:对应输入端被选中; 0:对应输入端未选中;
注意:软件模式下只能置位其中一位,硬件模式下可以是任意组合。
周立功单片机
• A/D转换器寄存器描述
…
ADDR
A/D
转换控制电路
A/D数据寄存器
ADCR
A/D控制寄存器 Fpclk
AD转换时钟
VIC
AIN0
AIN1
AIN7
…
ADCR
SELCLKDIVBURSTCLKSPDN
TEST1:
0
STARTEDGE功能
7:015:81619:172123:2226:2427位
——控制寄存器
01234567
00000000
位
值
AIN0AIN1AIN2AIN3AIN4AIN5AIN6AIN7
周立功单片机
• A/D转换器寄存器描述
…
ADDR
A/D
转换控制电路
A/D数据寄存器
ADCR
A/D控制寄存器 Fpclk
AD转换时钟
VIC
AIN0
AIN1
AIN7
…
ADCR
SELCLKDIVBURSTCLKSPDN
TEST1:
0
STARTEDGE功能
7:015:81619:172123:2226:2427位
——控制寄存器
CLKDIV:将VPB时钟(PCLK)进行分频,得到AD转换时钟。分频后的时钟
必须小于或等于。通常将CLKDIV编程为允许的最小值,以获得
或稍低于的时钟。
A/D转换器时钟 = PCLK / ( CLKDIV + 1)
周立功单片机
• A/D转换器寄存器描述
…
ADDR
A/D
转换控制电路
A/D数据寄存器
ADCR
A/D控制寄存器 Fpclk
AD转换时钟
VIC
AIN0
AIN1
AIN7
…
ADCR
SELCLKDIVBURSTCLKSPDN
TEST1:
0
STARTEDGE功能
7:015:81619:172123:2226:2427位
——控制寄存器
BURST:BURST/软件方式控制。当该位为0时,选择软件方式启动AD转换,
需要11个时钟才能完成。当该位为1时,选择BURST(突发)模式启动AD转
换,所需时钟数由CLK字段控制。
BURST模式下,对所有在SEL字段中置1的位对应的输入端进行转换,首
先转换的是最低有效位。然后是更高的位。如此周而复始,直至该位清零。
周立功单片机
• A/D转换器寄存器描述
…
ADDR
A/D
转换控制电路
A/D数据寄存器
ADCR
A/D控制寄存器 Fpclk
AD转换时钟
VIC
AIN0
AIN1
AIN7
…
ADCR
SELCLKDIVBURSTCLKSPDN
TEST1:
0
STARTEDGE功能
7:015:81619:172123:2226:2427位
——控制寄存器
01234567
00110110
位
值
AIN0AIN1AIN2AIN3AIN4AIN5AIN6AIN7
首先转换最
低有效位再转换更高
的有效位
AIN2AIN3AIN5AIN6
周立功单片机
• A/D转换器寄存器描述
…
ADDR
A/D
转换控制电路
A/D数据寄存器
ADCR
A/D控制寄存器 Fpclk
AD转换时钟
VIC
AIN0
AIN1
AIN7
…
ADCR
SELCLKDIVBURSTCLKSPDN
TEST1:
0
STARTEDGE功能
7:015:81619:172123:2226:2427位
——控制寄存器
CLKS:控制BURST模式下每次转换需要使用的时钟数和所得ADDR转换结果的
LS位中可确保精度的位的数目,CLKS可在11个时钟(10位)~4个时钟(3
位)之间选择:000=11个时钟/10位,001=10个时钟/9位,…111=4个时钟
/3位。
周立功单片机
• A/D转换器寄存器描述
…
ADDR
A/D
转换控制电路
A/D数据寄存器
ADCR
A/D控制寄存器 Fpclk
AD转换时钟
VIC
AIN0
AIN1
AIN7
…
ADCR
SELCLKDIVBURSTCLKSPDN
TEST1:
0
STARTEDGE功能
7:015:81619:172123:2226:2427位
——控制寄存器
PDN:控制AD部件是否工作。
1:A/D转换器处于正常工作模式; 0:A/D转换器处于掉电模式;
周立功单片机
• A/D转换器寄存器描述
…
ADDR
A/D
转换控制电路
A/D数据寄存器
ADCR
A/D控制寄存器 Fpclk
AD转换时钟
VIC
AIN0
AIN1
AIN7
…
ADCR
SELCLKDIVBURSTCLKSPDN
TEST1:
0
STARTEDGE功能
7:015:81619:172123:2226:2427位
——控制寄存器
TEST1:0:器件测试控制位。
00:正常模式; 01:数字测试模式;
10:DAC测试模式; 11:一次转换测试模式;
周立功单片机
• A/D转换器寄存器描述
…
ADDR
A/D
转换控制电路
A/D数据寄存器
ADCR
A/D控制寄存器 Fpclk
AD转换时钟
VIC
AIN0
AIN1
AIN7
…
ADCR
SELCLKDIVBURSTCLKSPDN
TEST1:
0
STARTEDGE功能
7:015:81619:172123:2226:2427位
——控制寄存器
START:该字段用于控制AD转换的启动方式,该字段只有在BURST为0时有效。
000:不启动; 001:立即启动转换;
010:引脚出现预置的电平时,启动AD转换。以下值也具有相同特性;
011:引脚; 100:引脚; 101:引脚;
110:引脚; 111:引脚;
周立功单片机
• A/D转换器寄存器描述
…
ADDR
A/D
转换控制电路
A/D数据寄存器
ADCR
A/D控制寄存器 Fpclk
AD转换时钟
VIC
AIN0
AIN1
AIN7
…
ADCR
SELCLKDIVBURSTCLKSPDN
TEST1:
0
STARTEDGE功能
7:015:81619:172123:2226:2427位
——控制寄存器
EDGE:当START字段的值为010~111时,该位的设置有效。
0:在所选CAP/MAT信号的下降沿启动转换
1:在所选CAP/MAT信号的上升沿启动转换
周立功单片机
• A/D转换器寄存器描述
…
ADDR
A/D
转换控制电路
A/D数据寄存器
ADCR
A/D控制寄存器 Fpclk
AD转换时钟
VIC
AIN0
AIN1
AIN7
…
0V/VddA0CHN0
OVERU
N
DONE功能
5:015:623:1626:2429:273031位
——数据寄存器
0:这些位读出时为0。用于未来扩展功能更强大的AD转换器。
ADDR
周立功单片机
• A/D转换器寄存器描述
…
ADDR
A/D
转换控制电路
A/D数据寄存器
ADCR
A/D控制寄存器 Fpclk
AD转换时钟
VIC
AIN0
AIN1
AIN7
…
0V/VddA0CHN0
OVERU
N
DONE功能
5:015:623:1626:2429:273031位
——数据寄存器
V/VddA:当DONE位为1时,该字段包含对SEL字段选中的Ain脚的
转换结果,为一个二进制数。
转换结果为0时,表示Ain引脚电平小于、等于或接近于VSSA。为
0x3FF时,表示Ain引脚电平等于、大于或接近于VddA。输入电压计
算公式为:
Vin = 结果×(VSSA / 0x3FF)
ADDR
周立功单片机
• A/D转换器寄存器描述
…
ADDR
A/D
转换控制电路
A/D数据寄存器
ADCR
A/D控制寄存器 Fpclk
AD转换时钟
VIC
AIN0
AIN1
AIN7
…
0V/VddA0CHN0
OVERU
N
DONE功能
5:015:623:1626:2429:273031位
——数据寄存器
0:这些位读出时为0。它们允许连续A/D值的累加,而不需要屏蔽处
理,使得至少有256个值不会溢出到CHN字段。
ADDR
周立功单片机
• A/D转换器寄存器描述
…
ADDR
A/D
转换控制电路
A/D数据寄存器
ADCR
A/D控制寄存器 Fpclk
AD转换时钟
VIC
AIN0
AIN1
AIN7
…
0V/VddA0CHN0
OVERU
N
DONE功能
5:015:623:1626:2429:273031位
——数据寄存器
CHN:该字段包含的是LS位的转换通道。
ADDR
周立功单片机
• A/D转换器寄存器描述
…
ADDR
A/D
转换控制电路
A/D数据寄存器
ADCR
A/D控制寄存器 Fpclk
AD转换时钟
VIC
AIN0
AIN1
AIN7
…
0V/VddA0CHN0
OVERU
N
DONE功能
5:015:623:1626:2429:273031位
——数据寄存器
0:这些位读出为0。用于未来CHN字段的扩展,使之兼容更多通道的
转换值。
ADDR
周立功单片机
• A/D转换器寄存器描述
…
ADDR
A/D
转换控制电路
A/D数据寄存器
ADCR
A/D控制寄存器 Fpclk
AD转换时钟
VIC
AIN0
AIN1
AIN7
…
0V/VddA0CHN0
OVERU
N
DONE功能
5:015:623:1626:2429:273031位
——数据寄存器
OVERUN:在BURST模式下,如果在转换产生最低位之前,以前转换
的结果丢失或被覆盖,该位将置位。读ADDR寄存器时,该位清零。
ADDR
周立功单片机
• A/D转换器寄存器描述
…
ADDR
A/D
转换控制电路
A/D数据寄存器
ADCR
A/D控制寄存器 Fpclk
AD转换时钟
VIC
AIN0
AIN1
AIN7
…
0V/VddA0CHN0
OVERU
N
DONE功能
5:015:623:1626:2429:273031位
——数据寄存器
DONE:AD转换完成标志位。当AD转换结束时该位置位。在读取
ADDR或ADCR被写入时,该位清零。如果在转换过程中,设置了
ADCR,那么该位将置位,并启动一次新的转换。
ADDR
周立功单片机
A/D转换器
• 使用A/D转换器的注意要点
▪AD转换器的时钟不能大于;
▪使用MAT引脚触发AD转换启动时,相应的MAT信号
不必输出到引脚。使用MAT引脚触发的方法,可以实
现AD转换定时启动;
▪BURST模式下,每次转换结束后立即开始下一路的转
换,所以BURST模式具有最高的效率;
▪软件模式下,SEL字段中只能有一位置位,如果多位
置位,将使用最低有效位。
周立功单片机
• A/D转换器操作示例
操作流程
计算ADC
部件时钟
设置
引脚连接模块
设置
AD工作模式
启动AD转换
等待转换结束
读取转换结果
周立功单片机
• A/D转换器操作示例
#define ADCLK 4500000 // 定义AD部件时钟频率,单位:Hz
#define ADBIT 10 // 定义BURST模式下的转换精度
#define ADBIT2 (10 - ADBIT)
...
PINSEL1 = (PINSEL1 & 0xFC3FFFFF) | 0x00400000;
ADCR = (0x01 << 27) | // EDGE
(0x05 << 24) | // START
(0x00 << 22) | // TEST1:0
(0x01 << 21) | // PDN
(ADBIT2 << 17)| // CLKS
(0x00 << 16) | // BUREST
((Fpclk/ADCLK + 1) << 8) | // CLKDIV
(0x01 << 0); // SEL
ADCR |= (1 << 24);
While((ADDR & 0x80000000) != 0);
ADCData = (ADDR >> 6) & 0x3FF;
...
使用软件方式对Ain0转换:
设置引脚连接模块
硬件触发边沿设置
AD启动设置
测试模式设置
AD部件上电设置
BURST模式精度
BURST模式使能
启动AD转换
等待转换结束
读取转换结果
转换通道选择
ADC部件时钟
周立功单片机
第5章 目录
�1.简介
�2.引脚配置
�3.存储器寻址
�4.系统控制模块
�5.存储器加速模块
�6.外部存储器控制器
�7.引脚连接模块
�8. 向量中断控制器
�
�
�
�接口
�接口
�14.定时器0/1
�15.脉宽调制器(PWM)
�
�17.实时时钟
�18.看门狗
周立功单片机
实时时钟
• 特性
LPC2000系列微控制器内部集成了一个功能完整
的实时时钟模块,它具有如下特性:
�带有日历和时钟功能;
�超低功耗设计;
�提供秒、分、小时、日、月、年和星期;
�可编程基准时钟分频器允许调节RTC以适应不同
的晶振频率。
选讲内容选讲内容选讲内容选讲内容
周立功单片机
实时时钟
• 描述
实时时钟(RTC)提供一套计数器在系统工作时对时
间进行测量。RTC消耗的功率非常低,这使其适合于
由电池供电的,CPU不连续工作(空闲模式)的系统。
注意:由于LPC2000系列微控制器的RTC模块没有独
立的时钟源,它使用的时钟频率是通过对Fpclk分频得
到,所以CPU不能进入掉电模式。
周立功单片机
实时时钟
• RTC内部结构
时钟发生器预分频器 时间计数器
报警控制
=
时钟控制 增量中断控制
中断标志
报警寄存器PCLK
产生秒时钟
时间寄存器组与报
警设定值进行比较
有两类中断,一种
是时间增量中断,
一种是报警中断
周立功单片机
时钟发生器预分频器 时间计数器
报警控制
=
时钟控制 增量中断控制
中断标志
报警寄存器PCLK
• 寄存器描述
时钟发生器预分频器 时间计数器
报警控制
=
时钟控制 增量中断控制
中断标志
报警寄存器PCLK 时间计数器时钟发生器预分频器
时钟控制 报警控制增量中断控制
中断标志
报警寄存器
所有寄存器大致可以分为三类:
▪时钟产生寄存器;
▪时间寄存器组;
▪中断产生控制;
周立功单片机
• 寄存器描述
时间计数器 =时钟发生器预分频器
时钟控制 报警控制增量中断控制
中断标志
报警寄存器PCLK
时钟产生寄存器组控制产生RTC时间计数器需要
的秒时钟信号。
——时钟产生寄存器组
读写预分频值,整数部分13PREINT
读写预分频值,小数部分15PREFRAC
读写时钟控制寄存器4CCR
只读时钟节拍计数器15CTC
访问描述有效位名称
周立功单片机
预分频器用于将任何频率高于的PCLK
时钟分频产生的基准时钟。这样就可以不管
外设时钟的频率为多少,RTC总是以正确的速率运行。
预分频寄存器分为整数部分和小数部分,因此有
可能某个时钟节拍多包含一个PCLK周期,而某个节拍
却少一个PCLK周期。但是每个时钟节拍的周期一定是
32768个PCLK周期。
• 寄存器描述——预分频寄存器
读写预分频值,整数部分13PREINT
读写预分频值,小数部分15PREFRAC
读写时钟控制寄存器4CCR
只读时钟节拍计数器15CTC
访问描述有效位名称
读写预分频值,整数部分13PREINT
读写预分频值,小数部分15PREFRAC
读写时钟控制寄存器4CCR
只读时钟节拍计数器15CTC
访问描述有效位名称
读写预分频值,小数部分15PREFRAC
读写预分频值,整数部分13PREINT
周立功单片机
• 寄存器描述
预分频整数部分为13位有效位,小数部分为15位
有效位。
预分频整数部分的计算公式为:
PREINT = int(PCLK / 32768) PREINT = int(PCLK / 32768) PREINT = int(PCLK / 32768) PREINT = int(PCLK / 32768) –––– 1 1 1 1
预分频小数部分的计算公式为:
PREFRAC = PCLK PREFRAC = PCLK PREFRAC = PCLK PREFRAC = PCLK –––– ((PREINT + 1) ((PREINT + 1) ((PREINT + 1) ((PREINT + 1) × 32768)32768)32768)32768)
——预分频寄存器
读写预分频值,整数部分13PREINT
读写预分频值,小数部分15PREFRAC
读写时钟控制寄存器4CCR
只读时钟节拍计数器15CTC
访问描述有效位名称
读写预分频值,小数部分15PREFRAC
读写预分频值,整数部分13PREINT
周立功单片机
• 寄存器描述——时钟控制寄存器
读写预分频值,整数部分13PREINT
读写预分频值,小数部分15PREFRAC
读写时钟节拍计数器4CCR
只读时钟计数寄存器15CTC
访问描述有效位名称
时钟控制寄存器包含4位有效位,它用于控制时钟
分频电路的操作,包括启动RTC和复位时钟节拍计数
器(CTC)等功能。
读写时钟控制寄存器4CCR
测试使能。在正常操作中,这些位应当全为0。CTTEST3 : 2
CTC复位。为1时,时钟节拍计数器复位。在CCR的
bit1变为0之前,它将一直保持复位状态。CTCRST1
时钟使能。当该位为1时,时间计数器使能。
为0时,时间计数器被禁止,这时可对其初始化。
CLKEN0
描述功能位
周立功单片机
• 寄存器描述——时钟计数寄存器
读写预分频值,整数部分13PREINT
读写预分频值,小数部分15PREFRAC
读写时钟控制寄存器4CCR
只读时钟计数寄存器15CTC
访问描述有效位名称
时钟节拍计数器对预分频器的输出时钟进行计
数,用于产生秒的时钟节拍。它是一个只读寄存器,
但它可通过时钟控制寄存器(CCR)复位为0。
只读时钟计数寄存器15CTC
对预分频器的时钟输出进行计数,每计满32768个时
钟,该寄存器复位,并向时间计数器发送一个秒脉冲
时钟节拍
计数器
15 :
1
用户程序不要向该位写入1保留0
描述功能位
周立功单片机
• 寄存器描述
时间计数器 =时钟发生器预分频器
时钟控制 报警控制增量中断控制
中断标志
报警寄存器PCLK
时间计数器组中包含当前的时间,它们分为两类:
完整时间寄存器和分类时间寄存器。
——时间计数器
周立功单片机
• 寄存器描述
时间计数器 =时钟发生器预分频器
时钟控制 报警控制增量中断控制
中断标志
报警寄存器PCLK
——时间计数器
包含日期(月)、月和年32CTIME1
包含日期(年)32CTIME2
包含秒、分、时和星期。32CTIME0
描述有效位名称
在完整时间寄存器中,时间以一个比较完整的格
式存储,程序只需要3次读操作即可读出所有计数器值。
这些寄存器为只读寄存器。
周立功单片机
• 寄存器描述——时间计数器
包含日期(月)、月和年32CTIME1
包含日期(年)32CTIME2
包含秒、分、时和星期。32CTIME0
描述有效位名称
包含日期(月)、月和年32CTIME1
包含日期(年)32CTIME2
包含秒、分、时和星期。32CTIME0
描述有效位名称
(0~59)—(0~59)—(0~23)—(0~6)—取值范围
秒保留分保留小时保留星期保留功能
5:07:613:815:1430:1623:2126:2431:27CTIME0CTIME0CTIME0CTIME0
(1~28,29,3
0)
—(1~12)—
(0~409
5)
—取值范围
日期(月)保留月保留年保留功能
4:07:511:8
15:1
2
27:1631:28CTIME1CTIME1CTIME1CTIME1
(1~365,36
6)
—取值范围
日期(年)保留功能
8:031:9CTIME2CTIME2CTIME2CTIME2
这两个寄存器意义不同,(月)
表示当日在当月中的序号,
(年)表示当日在当年中的序号
周立功单片机
• 寄存器描述——时间计数器
分类时间寄存器包含8个寄存器,所有寄存器都可
读可写。
年值。该值的范围为0~4095。12YEAR
月值。该值的范围为1~12。4MONTH
日期(年)值。该值的范围为1~365。9DOY
星期值。该值的范围为1~365(闰年为366)。3DOW
日期(月)值。该值的范围为1~28,29,30或31(取决
于月份以及是否为闰年)。5DOM
小时值。该值的范围为0~23。5HOUR
分值。该值的范围为0~59。6MIN
秒值。该值的范围为0~59。6SEC
描述有效位名称
年值。该值的范围为0~4095。12YEAR
月值。该值的范围为1~12。4MONTH
日期(年)值。该值的范围为1~365。9DOY
星期值。该值的范围为1~365(闰年为366)。3DOW
日期(月)值。该值的范围为1~28,29,30或31(取决
于月份以及是否为闰年)。5DOM
小时值。该值的范围为0~23。5HOUR
分值。该值的范围为0~59。6MIN
秒值。该值的范围为0~59。6SEC
描述有效位名称
注意:这些日期的寄存器只能在适当的时间间隔处递增,而在定义的溢出点处
复位。为了使这些值有意义,它们不能进行计算且必须正确初始化。
其中DOY寄存器需要单独初始化,也就是说该寄存器的值不会因为对年、
月、日寄存器进行初始化而自动确定到一个正确 的值。
周立功单片机
• 寄存器描述
时间计数器 =时钟发生器预分频器
时钟控制 报警控制增量中断控制
中断标志
报警寄存器PCLK
RTC部件的中断分为两类,一类为时间计数器的
增量中断,由增量中断寄存器控制。另一类为报警匹
配产生的中断,由报警屏蔽寄存器控制。
——中断产生寄存器
读写报警屏蔽寄存器AMR
读写设定报警时间报警寄存器组
读写递增中断寄存器CIIR
读写中断位置寄存器ILR
访问描述名称
周立功单片机
• 寄存器描述——中断产生寄存器
读写报警屏蔽寄存器AMR
读写设定报警时间报警寄存器组
读写递增中断寄存器CIIR
读写中断位置寄存器ILR
访问描述名称
读写报警屏蔽寄存器AMR
读写设定报警时间报警寄存器组
读写递增中断寄存器CIIR
读写中断位置寄存器ILR
访问描述名称
读写报警屏蔽寄存器AMR
读写设定报警时间报警寄存器组
读写递增中断寄存器CIIR
读写中断位置寄存器ILR
访问描述名称
为1时,表示报警寄存器产生了中断。
向该位写入1清除该中断标志位。
RTCALF1
为1时,表示计数器增量中断模块产生了中断。
向该位写入1清除该中断标志。
RTCCIF0
描述功能位
中断位置寄存器是一个2位的寄存器,它指出哪些
模块产生中断,它实际上是一个中断标志寄存器。
周立功单片机
• 寄存器描述——中断产生寄存器
读写报警屏蔽寄存器AMR
读写设定报警时间报警寄存器组
读写递增中断寄存器CIIR
读写中断位置寄存器ILR
访问描述名称
计数器增量中断寄存器可使计数器每次增加时产
生一次中断,比如设置秒增加中断为1,则每秒均产生
一次中断。在清除增量中断标志之前,该中断一直保
持有效。
周立功单片机
• 寄存器描述——中断产生寄存器
读写报警屏蔽寄存器AMR
读写设定报警时间报警寄存器组
读写递增中断寄存器CIIR
读写中断位置寄存器ILR
访问描述名称
为1时,年值的增加产生一次中断。IMYEAR7
为1时,月值的增加产生一次中断。IMMON6
为1时,日期(年)的增加产生一次中断。IMDOY5
为1时,星期值的增加产生一次中断。IMDOW4
为1时,日期(月)的增加产生一次中断。IMDOM3
为1时,小时值的增加产生一次中断。IMHOUR2
为1时,分值的增加产生一次中断。IMMIN1
为1时,秒值的增加产生一次中断。IMSEC0
描述功能CIIR
周立功单片机
• 寄存器描述——中断产生寄存器
读写报警屏蔽寄存器AMR
读写设定报警时间报警寄存器组
读写递增中断寄存器CIIR
读写中断位置寄存器ILR
访问描述名称
报警屏蔽寄存器允许用户屏蔽任意的报警寄存
器,被屏蔽的报警寄存器将不与时间计数器比较。
未被屏蔽的报警寄存器与时间计数器比较如果匹
配,将产生中断。该中断只有在从不匹配到匹配时才
发生,可以避免中断重复。
注意:如果所有屏蔽位都置位,报警将被禁止。
周立功单片机
• 寄存器描述——中断产生寄存器
读写报警屏蔽寄存器AMR
读写设定报警时间报警寄存器组
读写递增中断寄存器CIIR
读写中断位置寄存器ILR
访问描述名称
为1时,年值不与报警寄存器比较。AMRYEAR7
为1时,月值不与报警寄存器比较。AMRMON6
为1时,日期(年)值不与报警寄存器比较。AMRDOY5
为1时,星期值不与报警寄存器比较。AMRDOW4
为1时,日期(月)值不与报警寄存器比较。AMRDOM3
为1时,小时值不与报警寄存器比较。AMRHOUR2
为1时,分值不与报警寄存器比较。AMRMIN1
为1时,秒值不与报警寄存器比较。AMRSEC0
描述功能AMR
周立功单片机
• 寄存器描述——中断产生寄存器
读写报警屏蔽寄存器AMR
读写设定报警时间报警寄存器组
读写递增中断寄存器CIIR
读写中断位置寄存器ILR
访问描述名称
报警寄存器的值与时间计数器相比较,如果所有
未被屏蔽的报警寄存器都与它们对应的时间计数器相
匹配,那么将产生一次中断。向中断位置寄存器的bit1
写入1清除中断。
周立功单片机
读写年报警值ALYEAR
读写月报警值ALMON
读写日期(年)报警值ALDOY
读写星期报警值ALDOW
读写日期(月)报警值ALDOM
读写小时报警值ALHOUR
读写分报警值ALMIN
读写秒报警值ALSEC
访问描述名称
• 寄存器描述——中断产生寄存器
读写报警屏蔽寄存器AMR
读写设定报警时间报警寄存器组
读写递增中断寄存器CIIR
读写中断位置寄存器ILR
访问描述名称
周立功单片机
实时时钟
• 使用RTC的注意要点
�RTC部件使用VPB时钟,如果该时钟出现任何的异常
都会导致时间值的偏移,所以芯片不能进入掉电模式;
�芯片掉电后RTC不能保持寄存器的内容;
�芯片复位后只有预分频寄存器被硬件初始化,其它寄
存器的内容不受复位影响;
�RTC部件的闰年计算比较简单,当年计数器的最低两
位为0时,认为该年为闰年,这在2100年时会出错。闰
年影响2月份的日期数和年的日期数。
周立功单片机
• RTC使用示例
设置RTC基准
时钟分频器
初始化RTC时
钟值
报警中断设置
启动RTC
读取当前时间
或等待中断
操作流程
周立功单片机
Void RTCIni(void)
{
PREINT = Fpclk/32768–1;
PREFRAC = Fpclk–(Fpclk/32768)*32768;
YEAR = 200;
MONTH = 2;
DOM = 19;
DOW = 4;
HOUR = 8;
MIN = 30;
SEC = 0;
CIIR = 0x01;
CCR = 0x01;
}
• RTC使用示例
设置预分频寄存器
设置年
设置月
设置日(月)
设置星期
设置小时
设置分
设置秒
设置增量中断
启动RTC
——RTC初始化示例
周立功单片机
...
ILR = 0x03; // 清除RTC中断标志
CIIR = 0x02; // 设置分值增量中断
ALHOUR = 12; // 设置小时比较值
ALMIN = 0; // 设置分比较值
ALSEC = 0; // 设置秒比价值
AMR = 0xF8; // 设置报警屏蔽寄存器
// 只允许时、分、秒比较
...
• RTC使用示例——RTC定时报警设置
周立功单片机
第5章 目录
�1.简介
�2.引脚配置
�3.存储器寻址
�4.系统控制模块
�5.存储器加速模块
�6.外部存储器控制器
�7.引脚连接模块
�8. 向量中断控制器
�
�
�
�接口
�接口
�14.定时器0/1
�15.脉宽调制器(PWM)
�
�17.实时时钟
�18.看门狗
周立功单片机
看门狗
• 看门狗简介
在嵌入式应用中,CPU必须可靠工作,即使因为
某种原因进入了一个错误状态,系统也应该可以自动
恢复。看门狗的用途就是使微控制器在进入错误状态
后的一定时间内复位。
其原理是在系统正常工作时,用户程序每隔一段
时间执行喂狗动作(一些寄存器的特定操作),如果
系统出错,喂狗间隔超过看门狗溢出时间,那么看门
狗将会产生复位信号,使微控制器复位。
周立功单片机
看门狗
• 特性
LPC2000系列微控制器都集成有看门狗部件,其
特性为:
▪带内部预分频器的可编程32位定时器;
▪如果没有周期性重装(喂狗)动作,则产生片内
复位;
▪具有调试模式;
▪看门狗软件使能后,必须由复位来禁止;
▪错误的喂狗动作,将立即引起复位。
周立功单片机
看门狗
• 内部结构
WDFEED
喂狗寄存器
WDTC
常数寄存器
WDMOD
看门狗模式
WDTV
当前计数器32bit倒计数器
使能
溢出
喂狗错误
复位
中断
喂狗时序
周立功单片机
看门狗
• 内部结构
WDFEED
喂狗寄存器
WDTC
常数寄存器
WDMOD
看门狗模式
WDTV
当前计数器32bit倒计数器
使能
溢出
喂狗错误
复位
中断
喂狗时序
执行正确的
喂狗时序
将预设的定
时常数装入
倒计数器中 该常数不断自
减,必须在为0
之前再次喂狗
如果溢出将引
起看门狗复位
周立功单片机
• 寄存器描述
WDFEED
喂狗寄存器
WDTC
常数寄存器
WDMOD
看门狗模式
WDTV
当前计数器32bit倒计数器
使能
溢出
喂狗错误
复位
中断
喂狗时序
WDFEED
喂狗寄存器
WDTC
常数寄存器
WDMOD
看门狗模式
WDTV
当前计数器32bit倒计数器
使能
溢出
喂狗错误
复位
中断
喂狗时序
只读看门狗定时器值寄存器。反映倒计数器当前值。WDTV
只写看门狗喂狗寄存器。通过它执行特定喂狗时序。WDFEED
读写看门狗定时器常数寄存器。该寄存器决定超时值。WDTC
读/设置看门狗模式寄存器。该寄存器包含看门狗定时器的基本模式和状态。WDMOD
访问描述名称
周立功单片机
• 寄存器描述
WDFEED
喂狗寄存器
WDTC
常数寄存器
看门狗模式
WDTV
当前计数器32bit倒计数器
使能
溢出
喂狗错误
复位
中断
喂狗时序
——看门狗模式寄存器
WDMOD
WDENWDRESE
T
WDTOFWDINT保留功能
01237 : 4位
WDEN:看门狗中断使能位,该位只能置位。
该位置位后,将使能看门狗。一旦该位置位,软件无法将其清
零。只有外部复位或看门狗定时器溢出能将其清零。
注意:将该位置位后只是使能WDT,但没有启动WDT,当第一次喂狗操作时
才启动WDT。
周立功单片机
• 寄存器描述
WDFEED
喂狗寄存器
WDTC
常数寄存器
看门狗模式
WDTV
当前计数器32bit倒计数器
使能
溢出
喂狗错误
复位
中断
喂狗时序
——看门狗模式寄存器
WDMOD
WDENWDRESE
T
WDTOFWDINT保留功能
01237 : 4位
WDRESET:看门狗复位使能位,该位只能软件清除。
该位置位后,看门狗溢出将引起复位。一旦该位置位,软件无
法将其清零。只有外部复位或看门狗定时器溢出能将其清零。
周立功单片机
• 寄存器描述
WDFEED
喂狗寄存器
WDTC
常数寄存器
看门狗模式
WDTV
当前计数器32bit倒计数器
使能
溢出
喂狗错误
复位
中断
喂狗时序
——看门狗模式寄存器
WDMOD
WDENWDRESE
T
WDTOFWDINT保留功能
01237 : 4位
WDTOF:看门狗超时标志。
当看门狗发生超时,看门狗超时标志置位。该标志由软件清零。
周立功单片机
• 寄存器描述
WDFEED
喂狗寄存器
WDTC
常数寄存器
看门狗模式
WDTV
当前计数器32bit倒计数器
使能
溢出
喂狗错误
复位
中断
喂狗时序
——看门狗模式寄存器
WDMOD
WDENWDRESE
T
WDTOFWDINT保留功能
01237 : 4位
WDINT:看门狗中断标志。
当看门狗发生超时,该位置位。该标志不能由软件清零,只能
通过外部复位或者看门狗复位清零。
周立功单片机
• 寄存器描述
WDFEED
喂狗寄存器
常数寄存器
看门狗模式
WDTV
当前计数器32bit倒计数器
使能
溢出
喂狗错误
复位
中断
喂狗时序
——看门狗常数寄存器
WDMOD
该寄存器决定看门狗超时值,当喂狗时序产生时,该寄存
器的内容重新装入看门狗定时器。该寄存器的复位值为0xFF,即
使写入更小的值,也会装入0xFF。
溢出最小时间:tpclk×0xFF×4
溢出最大时间:tpclk×0xFFFFFFFF×4
WDTC
周立功单片机
• 寄存器描述
喂狗寄存器
WDTC
常数寄存器
看门狗模式
WDTV
当前计数器32bit倒计数器
使能
溢出
喂狗错误
复位
中断
喂狗时序
——看门狗喂狗寄存器
WDMOD
向该寄存器写入0xAA,然后写入0x55会使WDTC的值重新装
入看门狗定时器。如果看门狗通过WDMOD寄存器使能,那么第
一次喂狗操作还将启动看门狗运行。在看门狗能够产生中断/复位
之前,即看门狗溢出之前,必须完成一次有效的喂狗时序。
注意:如果喂狗时序不正确,将在喂狗之后的第二个PCLK周期产生看门
狗复位。
WDFEED
周立功单片机
• 寄存器描述
喂狗寄存器
WDTC
常数寄存器
看门狗模式
当前计数器32bit倒计数器
使能
溢出
喂狗错误
复位
中断
喂狗时序
——看门狗定时器值寄存器
WDMOD
该寄存器用于读取看门狗定时器的当前值,该寄存器为只读。
WDFEED
WDTV
周立功单片机
看门狗
• 使用看门狗的注意要点
�WDT定时器为递减计数,向下溢出时产生中断和(或)
复位;
�使能看门狗后,必需要要执行一次正确的喂狗操作才
能启动看门狗;
�看门狗没有独立的振荡器,其使用PCLK作为时钟。所
以CPU不能进入掉电模式,否则看门狗将停止工作;
�看门狗溢出时间 = NNNN×ttttpclkpclkpclkpclk×4444
周立功单片机
• 使用示例
设置看门狗定
时重装值
设置看门狗工
作模式
一次喂狗操作
启动看门狗
操作流程
周立功单片机
• 使用示例
设置看门狗定
时重装值
设置看门狗工
作模式
一次喂狗操作
启动看门狗
操作流程
设置看门狗定
时重装值
设置看门狗工
作模式
一次喂狗操作
启动看门狗
操作流程 Void WDTInit(void) // 看门狗初始化
{
WDTC = 0x10000;
WDMOD = 0x03;
WdtFeed();
}
Void WdtFeed(void) // 喂狗程序
{
WDFEED = 0xAA;
WDFEED = 0x55;
}
C代码:
周立功单片机
周立功单片机
第6章 接口技术与硬件设计
请使用Office2003以上版本播放
周立功单片机
第6章 目录
�1.最小系统
�2.片内外设
�3.总线接口
�4.其它外设
周立功单片机
第6章 目录
�1.最小系统
�2.片内外设
�3.总线接口
�4.其它外设
周立功单片机
最小系统
• 简介
一个嵌入式处理器自己是不能独立工作的,必须
给它供电、加上时钟信号、提供复位信号,如果芯片
没有片内程序存储器,则还要加上存储器系统,然后
嵌入式处理器芯片才可能工作。这些提供嵌入式处理
器运行所必须的条件的电路与嵌入式处理器共同构成
了这个嵌入式处理器的最小系统。而大多数基于
ARM7处理器核的微控制器都有调试接口,这部分在
芯片实际工作时不是必需的,但因为这部分在开发时
很重要,所以也把这部分也归入最小系统中。
周立功单片机
最小系统
• 简介
嵌入式控制器
时钟系统 调试测试接口
复位及其
配置系统
存储器系统
供电系统
(电源)
可选,因为许多面向嵌入
式领域的微控制器内部集
成了程序和数据存储器
——最小系统框图
可选,但是在样
品阶段通常都会
设计这部分电路
周立功单片机
嵌入式控制器
时钟系统 调试测试接口
复位及其
配置系统
存储器系统
供电系统
(电源)
嵌入式控制器
时钟系统 调试测试接口
复位及其
配置系统
存储器系统
供电系统
(电源)
• 各部件简介——电源
供电系统
(电源)
电源系统为整个系统提供能量,是整个系统工作的
基础,具有极其重要的地位,但却往往被忽略。如果电
源系统处理得好,整个系统的故障往往减少了一大半。
周立功单片机
• 各部件简介——电源
嵌入式控制器
时钟系统 调试测试接口
复位及其
配置系统
存储器系统
供电系统
(电源)
供电系统
(电源)
设计电源时要考虑的因素:
1.输出的电压、电流、功率;
2.输入的电压、电流;
3.安全因素;
4.输出纹波;
5.电池兼容和电磁干扰;
6.体积限制;
7.功耗限制;
8.成本限制。
周立功单片机
对于LPC2200系列微控制器,它有4组电源输入。
理想情况下需要提供4组独立的电源,它们需要单点接
地或大面积接地。甚至还有为系统中其它的部件提供更
多种类的电源。但如果没有使用LPC2000内部的AD功
能,或对AD的要求不高,模拟电源和数字电源可以不
分开供电。这样LPC2200和LPC210x都只需要两组电源。
• 各部件简介——电源
1.分析需求
LPC2000系列微控制所需要的电源类型:
无、
、、
LPC213x
LPC22xx
LPC210x
电压
型号
表示数字电源, 表示模拟电源。
LPC2104/05/06无模拟和数字之分。
周立功单片机
• 各部件简介——电源
2.设计末级电源电路
LPC2000系列微控制消耗电流的极限值为70mA。
为了保证可靠性并为以后升级留下余量,则电源系统
能够提供的电流应当大于300mA。
整个系统在上消耗的电流与外部条件有很大的
关系,这里假设电流不超过200mA,这样,电源系统
能够提供600mA电流即可。
分析得到以下参数:
�电源设计最大电流:600mA;
�电源设计最大电流:300mA。
周立功单片机
• 各部件简介——电源
2.设计末级电源电路
在了解功率消耗之后,需要选择合适的器件。
因为系统对这两组电压的要求比较高,且其功耗不
是很大,所以不适合用开关电源,应当用低压差模拟电
源(LDO)。合乎技术参数的LDO芯片很多,Sipex 半
导体SPX1117是一个较好的选择,它的性价比较好,且
有一些产品可以与它直接替换,减少采购风险。
周立功单片机
• 各部件简介——电源
SPX1117主要特点:
稳定输出电流;
1A稳定峰值电流;
3V可调节;
低静态电流;
时低压差为时低压差为;;
%线形调整率;
%负载调整率;
过流及温度保护;
多种封装供选择。
Vin1
G
N
D
2
Vout 3
U12
C33
104
C6
10uF/16V
+5V
Vin1
G
N
D
2
Vout 3
U11
C44
104
C7
10uF/16V
+5V
周立功单片机
• 各部件简介——电源
3.设计前级电源电路
尽管SPX1117允许的输入电压可达20V(参考芯片
数据手册),但太高的电压使芯片的发热量上升,散热
系统不好设计,同时影响芯片的性能。这样,就需要前
级电路调整一下。如果系统可能使用多种电源(如交流
电和电池),各种电源的电压输出不一样,就更需要前
级调整以适应末级的输入。通过之前的分析,前级的输
出选择为5V。选择5V作为前级的输出有两个原因:
�这个电压满足SPX1117的要求;
�目前很多器件还是需要5V供电的,这个5V可以兼
做前级和末级了。
周立功单片机
• 各部件简介——电源
3.设计前级电源电路
根据系统在5V上消耗的电流和体积、成本等方面的
考虑,前级电路可以使用开关电源,也可以使用模拟电
源。 它们的特别如下:
�开关电源:效率较高,可以减少发热量,因而在功率较大时
可以减小电源模块的体积;
�模拟电源:电路简单,输出电压纹波较小,并且干扰较开关
电源小得多。
周立功单片机
Vin1
G
N
D
2
Vout 3
U11
C2
104
C3
220uF/35V
+5V
C4
104
C1
220uF/35V
1
2
3
CZ1
POWER(9V)
C3
220uF/35V
L1
330uH/1A
1
4
2
3 5
VIN
G
N
D
/
O
N
O
F
F
FEEDBACK
OUTPUT
U4
LM2575
D2
1N5819
D1
1N5819
C1
470uF/35V
C2
104
C4
104
1
2
3
CZ1
POWER(9V)
D1
1N5819
+5V
• 各部件简介——电源
模拟电源
开关电源
周立功单片机
嵌入式控制器
时钟系统 调试测试接口
复位及其
配置系统
存储器系统
供电系统
(电源)
• 各部件简介——时钟
目前所有的微控制器均为时序电路,需要一个时钟
信号才能工作,大多数微控制器具有晶体振荡器。简单
的方法是利用微控制器内部的晶体振荡器,但有些场合
(如减少功耗、需要严格同步等情况)需要使用外部振
荡源提供时钟信号。
时钟系统
周立功单片机
• 各部件简介——时钟
目前所有的微控制器均为时序电路,需要一个时钟
信号才能工作,大多数微控制器具有晶体振荡器。简单
的方法是利用微控制器内部的晶体振荡器,但有些场合
(如减少功耗、需要严格同步等情况)需要使用外部振
荡源提供时钟信号。
LPC2000
LPC2000
LPC2000
LPC2000
X1 X2
C CXtal
LPC2000
LPC2000
LPC2000
LPC2000
X1 X2
C
Clock
使用内部振荡器 使用外部时钟源
可以使用稳定的
时钟信号源,如
有源晶振等。
周立功单片机
嵌入式控制器
时钟系统 调试测试接口
复位及其
配置系统
存储器系统
供电系统
(电源)
• 各部件简介——复位及其芯片配置
微控制器在上电时状态并不确定,这造成微控制器
不能正确工作。为解决这个问题,所有微控制器均有一
个复位逻辑,它负责将微控制器初始化为某个确定的状
态。这个复位逻辑需要一个复位信号才能工作。一些微
控制器自己在上电时会产生复位信号,但大多数微控制
器需要外部输入这个信号。这个信号的稳定性和可靠性
对微控制器的正常工作有重大影响。
复位及其
配置系统
周立功单片机
• 各部件简介——复位及其芯片配置
复位电路可以使用简单的阻容复位,这个电路成本
低廉,但不能保证任何情况产生稳定可靠的复位信号,
所以一般场合需要使用专门的复位芯片。
阻容复位
R1
10K
+
LPC2000
C1
47u
周立功单片机
• 各部件简介——复位及其芯片配置
常用的复位专用芯片有CATALYST公司的CAT800系列,Sipex
公司的SP700系列和SP800系列。为了适应嵌入式系统的应用,这些
公司还推出带有EEPROM存储器和看门狗的复位芯片,这可以降低
系统成本和缩小产品体积,减少元件数量也有利于系统的稳定性。
如果系统不需要手动复位功能,可以选择CAT809。如果需要手
动复位功能,可以选择SP705/706、SP708SCN。
种类繁多的复位芯片可以满足不同工作电压和不同复位方式的
系统,这里仅介绍其中部分。
注意:复位芯片的复位门槛的选择至关重要,一般应当选择微控制
器的IO口供电电压范围为标准。LPC2000这个范围为:~,
所以选择复位门槛电压为,即电源电压低于时产生复位
信号。
周立功单片机
• 各部件简介——复位及其芯片配置
CAT809CAT809——3脚微控制器电源监控电路:
� 低有效复位;
� 在工业级温度范围的应用中可直接代替MAX809;
� Vcc低至时,复位信号仍然有效;
� 6uA的电源电流;
� 抗电源的瞬态干扰;
� 紧凑的3脚SOT23和SC70封装;
� 工业级温度范围:-40℃~+85℃ 。
GND
VCC
RST
LPC2000
RST
+
CAT809
R1
10K
周立功单片机
• 各部件简介——复位及其芯片配置
MR
NC
PFI
GND
VCC
RST
RST
PFO
RST
LPC2000
RST
+
SP708
SP708/R/S/TSP708/R/S/T——低功耗微处理器复位监控芯片:
� :SP708R;:SP708S;:SP708T;
� 复位脉冲宽度-200ms;
� 最大电源电流40uA;
� 支持开关式TTL/CMOS手动复位输入;
� Vcc下降至1V时,nRESET信号仍然有效;
� SP708/R/S/T支持高/低电平两种方式。
周立功单片机
• 各部件简介——复位及其芯片配置
SP6200/6201SP6200/6201——带复位输出的 LDO调节器 :
� 适用于要求高精度、快速操作和方便使用的应用;
� 极低的关断电流:最大为1uA;
� 低压差:160mV@100mA。输出电压高精度: 2% ;
� 逻辑控制的电子使能;
� 复位输出(VOUT良好);
� 1uF的陶瓷电容就可保持器件无条件稳定工作。
电压输出使能 复位输出
周立功单片机
• 各部件简介——复位及其芯片配置
CAT1024/1025CAT1024/1025——带EEPROM的复位芯片 :
� 具有2K字节EEPROM存储器,数据保存时间长达100年;
� 存储器采用400KHz的I2C总线接口,16字节的页写缓冲区;
� CAT1025具有高、低电平复位信号,CAT1024具有低电平复
位信号。Vcc低至1V时复位仍有效;
� 工作电压范围:~;
� 手动复位输入。
10K
SCL0
SDA0
RST
nRSTMR
1
RESET2RESET3
VSS4 SDA 5
SCL 6WP7
VCC 8
U7
CAT1025SI-30
10K
周立功单片机
• 各部件简介——复位及其芯片配置
微控制器在复位后可能有多种初始状态,具体复位到哪种初始
状态是在复位的过程中决定的。复位逻辑可能通过片内只读存储器
中的数据决定具体的初始状态,但更多的是通过复位期间的引脚状
态决定,也可能通过两者共同决定。用引脚状态配置复位后的初始
状态没有统一的方法,需要根据相关芯片的手册决定。
LPC2000
RST
10K * 2
nRST
+
10K * 2
+
和决定复
位后存储器的来源
以及存储器的宽度
决定复位后是
否使用~
作为调试端口
P1. 20决定复位后是
否使用~
作为跟踪端口
决定复位后
是否进入ISP状态
周立功单片机
嵌入式控制器
时钟系统 调试测试接口
复位及其
配置系统
存储器系统
供电系统
(电源)
• 各部件简介——存储器系统
对于大部分微控制器来说,存储器系统不是必需
的,但如果微控制器没有片内程序存储器或数据存储器
时,就必须设计存储器系统,这一般通过微控制器的外
部总线接口实现。
注:外部总线的接口方法请参看节。
存储器系统
周立功单片机
• 各部件简介——存储器系统
LPC2210存储器系统
LPC2210
C?
A01
A12
A23
A34
A45
CE6
I/O0 7
I/O1 8
I/O2 9
I/O3 10
Vcc 11
Vss 12
I/O4 13
I/O5 14
I/O6 15
I/O7 16
WE17
A518
A619
A720
A821
A922
A1023
A1124
A1225
A1326
A1427
NC 28
I/O8 29
I/O9 30
I/O1031
I/O1132
Vcc 33
Vss 34
I/O1235
I/O1336
I/O1437
I/O1538
BLE39
BHE40
OE41
A1542
A1643
A1744
U5
IS61LV25616AL
D0
D1
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12
D13
D14
D15
A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
A11
A12
A13
A14
A15
A16
A17
nBLS0
nBLS1
nWE
nCS1
nOE
C14
104
A18
A151
A142
A133
A124
A115
A106
A97
A88
A199
NC10
WE11
NC 12
NC 13
NC 14
NC 15
A1816
A1717
A718
A619
A520
A421
A322
A223
A124
A025
CE26
Vss 27OE28
DQ0 29
DQ8 30
DQ1 31
DQ9 32
DQ2 33
DQ1034
DQ3 35
DQ1136
Vdd 37
DQ4 38
DQ1239
DQ5 40
DQ1341
DQ6 42
DQ1443
DQ7 44
DQ1545
Vss 46
NC 47A1648
U6
SST39VF160
D0
D1
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12
D13
D14
D15
A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
A11
A12
A13
A14
A15
A16
A17
A18
A19
nWE
nOE
nCS0
C15
104
A20
A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
A11
A12
A13
A14
A15
A16
A17
A18
A19
D0
D1
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12
D13
D14
D15
nCS0
nCS1
nBLS0
nBLS1
nOE
nWE
R2
R1
10K
LPC2210
LPC2210
LPC2210
LPC2210
SRAM
SRAM
SRAM
SRAM
FLASH
FLASH
FLASH
FLASH
周立功单片机
嵌入式控制器
时钟系统 调试测试接口
复位及其
配置系统
存储器系统
供电系统
(电源)
• 各部件简介——调试与测试接口
调试与测试接口不是系统运行必须的,但现代系统
越来越强调可测性,调试、测试接口的设计也要重视了。
LPC2000有一个内置JTAG调试接口,通过这个接口可以
控制芯片的运行并获取内部信息。
调试测试接口
周立功单片机
调试接口电路一
TRACEPKT3
TRACEPKT2
TRACEPKT0
TRST
RTCK
EXTIN0
TRACECLK
PIPESTAT2
PIPESTAT1
PIPESTAT0
TRACESYNC
TCKRESET
TDI
TDO
TRACEPKT1
TMS
U1
1
2
3
U2A
74HC125
4
5
6
U2B
74HC125
TRST RST
R1
10K
R2
10K
nRST
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
19 20
J2
TRST
TDI
TMS
TCK
RTCK
TDO
RST
R4
JTAG
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
19 20
21 22
23 24
25 26
27 28
29 30
31 32
33 34
35 36
37 38
J18
ETM
TRST
TDI
TMS
TCK
RTCK
TDO
RST
TRACECLK
EXTIN0
PIPESTAT0
PIPESTAT1
PIPESTAT2
TRACESYNC
TRACEPKT0
TRACEPKT1
TRACEPKT2
TRACEPKT3
R3
TRACEPKT0
TRACEPKT1
TRACEPKT2
TRACEPKT3
TRACESYNC
PIPESTAT0
PIPESTAT1
PIPESTAT2
TRACECLK
EXTIN0
ETM
L
P
C
2
2
0
0
• 各部件简介——调试与测试接口
在该电路中,复位电路与前面介绍电路有所不同。它在复位信
号和CPU之间插入了三态门74HC125。使用三态门主要是为了复位
芯片和JTAG(ETM)仿真器都可以复位芯片。如果没有
74HC125,当复位芯片输出高电平时,JTAG(ETM)仿真器就不
可能把它拉低,这不但不能实现需要的功能,还可能损坏复位芯片
或JTAG(ETM)仿真器。
周立功单片机
• 各部件简介——调试与测试接口
因为这种电路JTAG(ETM)仿真器对LPC2000有完全的控
制,其仿真性能最好。不过,由于74HC125工作的电压范围低于复
位芯片的工作电压范围,所以此电路一般用于样机。正式产品中可
以不需要这部分电路。
TRACEPKT3
TRACEPKT2
TRACEPKT0
TRST
RTCK
EXTIN0
TRACECLK
PIPESTAT2
PIPESTAT1
PIPESTAT0
TRACESYNC
TCKRESET
TDI
TDO
TRACEPKT1
TMS
U1
1
2
3
U2A
74HC125
4
5
6
U2B
74HC125
TRST RST
R1
10K
R2
10K
nRST
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
19 20
J2
TRST
TDI
TMS
TCK
RTCK
TDO
RST
R4
JTAG
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
19 20
21 22
23 24
25 26
27 28
29 30
31 32
33 34
35 36
37 38
J18
ETM
TRST
TDI
TMS
TCK
RTCK
TDO
RST
TRACECLK
EXTIN0
PIPESTAT0
PIPESTAT1
PIPESTAT2
TRACESYNC
TRACEPKT0
TRACEPKT1
TRACEPKT2
TRACEPKT3
R3
TRACEPKT0
TRACEPKT1
TRACEPKT2
TRACEPKT3
TRACESYNC
PIPESTAT0
PIPESTAT1
PIPESTAT2
TRACECLK
EXTIN0
ETM
L
P
C
2
2
0
0
周立功单片机
调试接口电路一
• 各部件简介——调试与测试接口
TRACEPKT3
TRACEPKT2
TRACEPKT0
TRST
RTCK
EXTIN0
TRACECLK
PIPESTAT2
PIPESTAT1
PIPESTAT0
TRACESYNC
TCKRESET
TDI
TDO
TRACEPKT1
TMS
U1
1
2
3
U2A
74HC125
4
5
6
U2B
74HC125
TRST RST
R1
10K
R2
10K
nRST
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
19 20
J2
TRST
TDI
TMS
TCK
RTCK
TDO
RST
R4
JTAG
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
19 20
21 22
23 24
25 26
27 28
29 30
31 32
33 34
35 36
37 38
J18
ETM
TRST
TDI
TMS
TCK
RTCK
TDO
RST
TRACECLK
EXTIN0
PIPESTAT0
PIPESTAT1
PIPESTAT2
TRACESYNC
TRACEPKT0
TRACEPKT1
TRACEPKT2
TRACEPKT3
R3
TRACEPKT0
TRACEPKT1
TRACEPKT2
TRACEPKT3
TRACESYNC
PIPESTAT0
PIPESTAT1
PIPESTAT2
TRACECLK
EXTIN0
ETM
L
P
C
2
2
0
0
ETM功能仅在高级仿真器
中具有,用户如果没有使
用,可以将其省略,同时
把TRACESYNC信号上的
电阻也去掉。
周立功单片机
调试接口电路二
TRACEPKT3
TRACEPKT2
TRACEPKT0
TRST
RTCK
EXTIN0
TRACECLK
PIPESTAT2
PIPESTAT1
PIPESTAT0
TRACESYNC
TCKRESET
TDI
TDO
TRACEPKT1
TMS
U1
nRST
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
19 20
J2
TRST
TDI
TMS
TCK
RTCK
TDO
R2
JTAG
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
19 20
21 22
23 24
25 26
27 28
29 30
31 32
33 34
35 36
37 38
J18
ETM
TRST
TDI
TMS
TCK
RTCK
TDO
TRACECLK
EXTIN0
PIPESTAT0
PIPESTAT1
PIPESTAT2
TRACESYNC
TRACEPKT0
TRACEPKT1
TRACEPKT2
TRACEPKT3
R1
TRACEPKT0
TRACEPKT1
TRACEPKT2
TRACEPKT3
TRACESYNC
PIPESTAT0
PIPESTAT1
PIPESTAT2
TRACECLK
EXTIN0
ETM
L
P
C
2
2
0
0
• 各部件简介——调试与测试接口
周立功单片机
最小系统
• 完整的最小系统
LPC2000系列微控制器具有4种类型的最小系统。
�LPC2100系列没有外部总线接口的最小系统;
�LPC2130系列没有外部总线接口的最小系统;
�LPC2200系列使用外部存储器的最小系统;
�LPC2200系列使用内部存储器的最小系统。
周立功单片机
• 完整的最小系统 ——LPC2100系列
V
D
D
1
.
8
X
T
A
L
1
X
T
A
L
2
n
R
S
T
+5V
C2
10uF/16V
+5V
C1
10uF/16V
VIN3
G
N
D
1
VOUT2
U2
SPX1117M3-
VIN3
G
N
D
1
VOUT2
U3
SPX1117M3-
R1
10KSW1
RST
MR1 VCC 2
GND3
PFI4
PFO 5
NC6
RST 7
RST 8
U4
SP708S
C3
104
C4
104
C5
104
C6
104
C7
104
C8
104
C10
104
C9
104
C11
104
nRST
Y1
1
1
.
0
5
9
2
M
H
z
C12
30P
C13
30P
R2
1M
V32
Vss3
Vss9
V3A14
P
2
.
2
8
/
D
2
8
/
R
D
6
1
7
P
2
.
2
9
/
D
2
9
/
T
D
6
1
8
P
2
.
3
0
/
D
3
0
/
A
I
N
4
1
9
P
2
.
3
1
/
D
3
1
/
A
I
N
5
2
0
P
0
.
2
5
/
R
D
1
2
1
T
D
1
2
2
P
0
.
2
7
/
A
I
N
0
/
C
A
P
0
.
1
/
M
A
T
0
.
1
2
3
P
1
.
1
7
/
T
R
A
C
E
P
K
T
1
2
4
P
0
.
2
8
/
A
I
N
1
/
C
A
P
0
.
2
/
M
A
T
0
.
2
2
5
V
s
s
2
6
P
3
.
2
9
/
B
L
S
2
/
A
I
N
6
2
7
P
3
.
2
8
/
B
L
S
3
/
A
I
N
7
2
8
P
3
.
2
7
/
W
E
2
9
P
3
.
2
6
/
C
S
1
3
0
V
3
3
1
P
0
.
2
9
/
A
I
N
2
/
C
A
P
0
.
3
/
M
A
T
0
.
3
3
2
V18 37
Vss 38
V3 39
P3. 23/A23/XCLK40
P0. 0/TxD0/PWM142
P
0
.
1
/
R
x
D
0
/
P
W
M
3
/
E
I
N
T
0
4
9
P
0
.
2
/
S
C
L
/
C
A
P
0
.
0
5
0
P
1
.
2
6
/
R
T
C
K
5
2
P
3
.
1
6
/
A
1
6
5
3
V
s
s
5
4
P
3
.
1
5
/
A
1
5
5
5
P
3
.
1
4
/
A
1
4
5
6
V
3
5
7
P
0
.
3
/
S
D
A
/
M
A
T
0
.
0
/
E
I
N
T
1
5
8
P
0
.
4
/
S
C
K
0
/
C
A
P
0
.
1
5
9
P
1
.
2
5
/
E
X
T
I
N
0
6
0
P
0
.
5
/
M
I
S
O
0
/
M
A
T
0
.
1
6
1
P
3
.
1
3
/
A
1
3
6
2
P
3
.
1
2
/
A
1
2
6
3
P
3
.
1
1
/
A
1
1
6
4
V
3
5
1
R?
LPC2100
_DCD1
R5
10K
V
D
D
1
.
8
V
D
D
3
.
3
V
D
D
3
.
3
V
D
D
1
.
8
决定是否进入ISP
状态,如果该引
脚悬空将影响程
序脱机运行
周立功单片机
• 完整的最小系统 ——LPC2130系列
V
D
D
3
.
3
X
T
A
L
1
X
T
A
L
2
n
R
S
T
+5V
C1
10uF/16V
VIN3
G
N
D
1
VOUT2
U2
R1
10KSW1
RST
MR1 VCC 2
GND3
PFI4
PFO 5
NC6
RST 7
RST 8
U4
SP708S
C3
104
C4
104
C5
104
C6
104
C7
104
C8
104
C10
104
C9
104
C11
104
nRST
Y1
1
1
.
0
5
9
2
M
H
z
C12
30P
C13
30P
R2
1M
_DCD1
R5
10K
V
D
D
3
.
3
V
D
D
3
.
3
V
D
D
3
.
3
RTXC13
RTXC25
Vss6
V3a7
P
0
.
3
1
1
7
V
s
s
1
8
P
0
.
0
/
T
x
D
0
/
P
W
M
1
1
9
P
1
.
3
1
/
T
R
S
T
2
0
P
0
.
1
/
R
x
D
0
/
P
W
M
3
/
E
I
N
T
0
2
1
P
0
.
2
/
S
C
L
0
/
C
A
P
0
.
0
2
2
V
3
2
3
P
1
.
2
6
/
R
T
C
K
2
4
V
s
s
2
5
P
0
.
3
/
S
D
A
0
/
M
A
T
0
.
0
/
E
I
N
T
1
2
6
P
0
.
4
/
S
C
K
0
/
C
A
P
0
.
1
/
A
D
0
.
6
2
7
P
1
.
2
5
/
E
X
T
I
N
0
2
8
P
0
.
5
/
M
I
S
O
0
/
M
A
T
0
.
1
/
A
D
0
.
7
2
9
P
0
.
6
/
M
O
S
I
0
/
C
A
P
0
.
2
/
A
D
1
.
0
3
0
P
0
.
7
/
S
S
E
L
0
/
P
W
M
2
/
E
I
N
T
2
3
1
P
1
.
2
4
/
T
R
A
C
E
C
L
K
3
2
Vss 42
V3 43
V
b
a
t
4
9
V
s
s
5
0
V
3
5
1
P
1
.
3
0
/
T
M
S
5
2
P
0
.
1
8
/
C
A
P
1
.
3
/
M
I
S
O
1
/
M
A
T
1
.
3
5
3
P
0
.
1
9
/
M
A
T
1
.
2
/
M
O
S
I
1
/
C
A
P
1
.
2
5
4
P
0
.
2
0
/
M
A
T
1
.
3
/
S
S
E
L
1
/
E
I
N
T
3
5
5
P
1
.
2
9
/
T
C
K
5
6
R
E
S
E
T
5
7
P
0
.
2
3
5
8
V
s
s
a
5
9
P
1
.
2
8
/
T
D
I
6
0
X
T
A
L
2
6
1
X
T
A
L
1
6
2
V
r
e
f
6
3
P
1
.
2
7
/
T
D
O
6
4
U1
LPC2138
只需要单电源
周立功单片机
• 完整的最小系统 ——LPC2200使用外部存储
器
V
D
D
1
.
8
V
D
D
3
.
3
V
D
D
3
.
3
V
D
D
3
.
3
V
D
D
3
.
3
V
D
D
1
.
8
V
D
D
1
.
8
V
D
D
3
.
3
D0
D1
D2
D3
D
4
D
5
D
6
D
7
D
8
D
9
D
1
0
D
1
1
D
1
2
D
1
3
D
1
4
D
1
5
_D26
_D27
A
2
3
A
2
2
A
2
1
A
2
0
A
1
9
A
1
8
A
1
7
A
1
6
A
1
5
A
1
4
A
1
3
A
1
2
A
1
1
A
1
0
A
9
A
8
A
7
A6
A5
A4
A3
A2
A1
A0
nBLS1
nBLS0
nWE
nOE
nC S1
nC S0
nC S2
nC S3
X
T
A
L
1
X
T
A
L
2
_DCD1
n
R
S
T
V32
Vss3
D26
Vss9
V3A14
D121
TD122
Vss26
S130
V331
S3/TD636
V
1
8
3
7
V
s
s
3
8
V
3
3
9
P
3
.
2
3
/
A
2
3
/
X
C
L
K
4
0
P
3
.
2
2
/
A
2
2
4
1
P
0
.
0
/
T
x
D
0
/
P
W
M
1
4
2
P
1
.
3
1
/
T
R
S
T
4
3
P
3
.
2
1
/
A
2
1
4
4
P
3
.
2
0
/
A
2
0
4
5
P
3
.
1
9
/
A
1
9
4
6
P
3
.
1
8
/
A
1
8
4
7
P
3
.
1
7
/
A
1
7
4
8
P
0
.
1
/
R
x
D
0
/
P
W
M
3
/
E
I
N
T
0
4
9
P
0
.
2
/
S
C
L
/
C
A
P
0
.
0
5
0
P
1
.
2
6
/
R
T
C
K
5
2
P
3
.
1
6
/
A
1
6
5
3
V
s
s
5
4
P
3
.
1
5
/
A
1
5
5
5
P
3
.
1
4
/
A
1
4
5
6
V
3
5
7
P
0
.
3
/
S
D
A
/
M
A
T
0
.
0
/
E
I
N
T
1
5
8
P
0
.
4
/
S
C
K
0
/
C
A
P
0
.
1
5
9
P
1
.
2
5
/
E
X
T
I
N
0
6
0
P
0
.
5
/
M
I
S
O
0
/
M
A
T
0
.
1
6
1
P
3
.
1
3
/
A
1
3
6
2
P
3
.
1
2
/
A
1
2
6
3
P
3
.
1
1
/
A
1
1
6
4
P
3
.
1
0
/
A
1
0
6
5
P
3
.
9
/
A
9
6
6
V
s
s
6
7
P
0
.
6
/
M
O
S
I
0
/
C
A
P
0
.
2
6
8
P
0
.
7
/
S
S
E
L
0
/
P
W
M
2
/
E
I
N
T
2
6
9
P
1
.
2
4
/
T
R
A
C
E
C
L
K
7
0
P
3
.
8
/
A
8
7
1
P
3
.
7
/
A
7
7
2
V
3
5
1
V3 77
TS1/
Vss 79
1/
Vss 93
V3 94
i1/EINT299
K1/
Vss 103
V3 104
Vss 107
P
2
.
4
/
D
4
1
0
9
V
1
8
1
1
0
V
s
s
1
1
1
V
3
1
1
2
P
1
.
3
0
/
T
M
S
1
1
3
P
2
.
5
/
D
5
1
1
4
P
2
.
6
/
D
6
1
1
5
P
2
.
7
/
D
7
1
1
6
P
2
.
8
/
D
8
1
1
7
P
2
.
9
/
D
9
1
1
8
V
3
1
1
9
P
2
.
1
0
/
D
1
0
1
2
0
P
0
.
1
8
/
C
A
P
1
.
3
/
M
I
S
O
1
/
M
A
T
1
.
3
1
2
1
P
0
.
1
9
/
M
A
T
1
.
2
/
M
O
S
I
1
/
M
A
T
1
.
3
1
2
2
P
0
.
2
0
/
M
A
T
1
.
3
/
S
S
E
L
1
/
E
I
N
T
3
1
2
3
P
2
.
1
1
/
D
1
1
1
2
4
P
2
.
1
2
/
D
1
2
1
2
5
P
1
.
2
9
/
T
C
K
1
2
6
P
2
.
1
3
/
D
1
3
1
2
7
V
s
s
1
2
8
P
2
.
1
4
/
D
1
4
1
2
9
P
2
.
1
5
/
D
1
5
1
3
0
P
2
.
1
6
/
D
1
6
1
3
1
P
2
.
1
7
/
D
1
7
1
3
2
P
2
.
1
8
/
D
1
8
1
3
3
P
2
.
1
9
/
D
1
9
1
3
4
R
E
S
E
T
1
3
5
P
2
.
2
0
/
D
2
0
1
3
6
P
2
.
2
1
/
D
2
1
1
3
7
V
s
s
A
_
P
L
L
1
3
8
V
s
s
A
1
3
9
P
1
.
2
8
/
T
D
I
1
4
0
X
T
A
L
2
1
4
1
X
T
A
L
1
1
4
2
V
1
8
A
1
4
3
P
1
.
2
7
/
T
D
O
1
4
4
U1
LPC2210
A01
A12
A23
A34
A45
CE6
I/O0 7
I/O1 8
I/O2 9
I/O3 10
Vcc 11
Vss 12
I/O4 13
I/O5 14
I/O6 15
I/O7 16
WE17
A518
A619
A720
A821
A922
A1023
A1124
A1225
A1326
A1427
NC 28
I/O8 29
I/O9 30
I/O1031
I/O1132
Vcc 33
Vss 34
I/O1235
I/O1336
I/O1437
I/O1538
BLE39
BHE40
OE41
A1542
A1643
A1744
IS61LV25616AL
A151
A142
A133
A124
A115
A106
A97
A88
A199
NC10
WE11
NC 12
NC 13
NC 14
NC 15
A1816
A1717
A718
A619
A520
A421
A322
A223
A124
A025
CE26
Vss 27OE28
DQ0 29
DQ8 30
DQ1 31
DQ9 32
DQ2 33
DQ1034
DQ3 35
DQ1136
Vdd 37
DQ4 38
DQ1239
DQ5 40
DQ1341
DQ6 42
DQ1443
DQ7 44
DQ1545
Vss 46
NC 47A1648
SST39VF160
D0
D1
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12
D13
D14
D15
A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
A11
A12
A13
A14
A15
A16
A17
D0
D1
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12
D13
D14
D15
A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
A11
A12
A13
A14
A15
A16
A17
A18
A19
nBLS0
nBLS1
nWE
nC S1
nOE
C14
104
nWE
nOE
nC S0
C15
104
R3
10K
R4
A18
A20
+5V
C2
10uF/16V
+5V
C1
10uF/16V
VIN3
G
N
D
1
VOUT2
U2
VIN3
G
N
D
1
VOUT2
U3
R1
10K
C3
104
SW1
RST
C4
104
C5
104
MR1 VCC 2
GND3
PFI4
PFO 5
NC6
RST 7
RST 8
U4
SP708S
C6
104
C7
104
C8
104
C10
104
C9
104
C11
104
Y1
1
1
.
0
5
9
2
M
H
z
C12
30P
C13
30P
R2
1M
R5
10K
nRST
复位后使用
外部16位宽
度存储器
周立功单片机
V
D
D
1
.
8
V
D
D
3
.
3
V
D
D
3
.
3
V
D
D
3
.
3
R5
10K
R2
1M
C13
30P
C12
30P
V
D
D
3
.
3
Y1
1
1
.
0
5
9
2
M
H
z
nRST
V
D
D
1
.
8
V
D
D
1
.
8
C11
104
C9
104
C10
104
C8
104
C7
104
C6
104
C5
104
V
D
D
3
.
3
C4
104
C3
104
_D26
_D27
MR1 VCC 2
GND3
PFI4
PFO 5
NC6
RST 7
RST 8
U4
SP708S
SW1
RST
X
T
A
L
1
X
T
A
L
2
_DCD1
R1
10K
n
R
S
T
V32
Vss3
Vss9
V3A14
TD122
Vss26
V331
V
1
8
3
7
V
s
s
3
8
V
3
3
9
P
3
.
2
3
/
A
2
3
/
X
C
L
K
4
0
P
3
.
2
2
/
A
2
2
4
1
P
0
.
0
/
T
x
D
0
/
P
W
M
1
4
2
P
1
.
3
1
/
T
R
S
T
4
3
P
3
.
2
1
/
A
2
1
4
4
P
3
.
2
0
/
A
2
0
4
5
P
3
.
1
9
/
A
1
9
4
6
P
3
.
1
8
/
A
1
8
4
7
P
3
.
1
7
/
A
1
7
4
8
P
0
.
1
/
R
x
D
0
/
P
W
M
3
/
E
I
N
T
0
4
9
P
0
.
2
/
S
C
L
/
C
A
P
0
.
0
5
0
P
1
.
2
6
/
R
T
C
K
5
2
P
3
.
1
6
/
A
1
6
5
3
V
s
s
5
4
P
3
.
1
5
/
A
1
5
5
5
P
3
.
1
4
/
A
1
4
5
6
V
3
5
7
P
0
.
3
/
S
D
A
/
M
A
T
0
.
0
/
E
I
N
T
1
5
8
P
0
.
4
/
S
C
K
0
/
C
A
P
0
.
1
5
9
P
1
.
2
5
/
E
X
T
I
N
0
6
0
P
0
.
5
/
M
I
S
O
0
/
M
A
T
0
.
1
6
1
P
3
.
1
3
/
A
1
3
6
2
P
3
.
1
2
/
A
1
2
6
3
P
3
.
1
1
/
A
1
1
6
4
P
3
.
1
0
/
A
1
0
6
5
P
3
.
9
/
A
9
6
6
V
s
s
6
7
P
0
.
6
/
M
O
S
I
0
/
C
A
P
0
.
2
6
8
P
0
.
7
/
S
S
E
L
0
/
P
W
M
2
/
E
I
N
T
2
6
9
P
1
.
2
4
/
T
R
A
C
E
C
L
K
7
0
P
3
.
8
/
A
8
7
1
P
3
.
7
/
A
7
7
2
V
3
5
1
V3 77
Vss 79
Vss 93
V3 94
Vss 103
V3 104
Vss 107
P
2
.
4
/
D
4
1
0
9
V
1
8
1
1
0
V
s
s
1
1
1
V
3
1
1
2
P
1
.
3
0
/
T
M
S
1
1
3
P
2
.
5
/
D
5
1
1
4
P
2
.
6
/
D
6
1
1
5
P
2
.
7
/
D
7
1
1
6
P
2
.
8
/
D
8
1
1
7
P
2
.
9
/
D
9
1
1
8
V
3
1
1
9
P
2
.
1
0
/
D
1
0
1
2
0
P
0
.
1
8
/
C
A
P
1
.
3
/
M
I
S
O
1
/
M
A
T
1
.
3
1
2
1
P
0
.
1
9
/
M
A
T
1
.
2
/
M
O
S
I
1
/
M
A
T
1
.
3
1
2
2
P
0
.
2
0
/
M
A
T
1
.
3
/
S
S
E
L
1
/
E
I
N
T
3
1
2
3
P
2
.
1
1
/
D
1
1
1
2
4
P
2
.
1
2
/
D
1
2
1
2
5
P
1
.
2
9
/
T
C
K
1
2
6
P
2
.
1
3
/
D
1
3
1
2
7
V
s
s
1
2
8
P
2
.
1
4
/
D
1
4
1
2
9
P
2
.
1
5
/
D
1
5
1
3
0
P
2
.
1
6
/
D
1
6
1
3
1
P
2
.
1
7
/
D
1
7
1
3
2
P
2
.
1
8
/
D
1
8
1
3
3
P
2
.
1
9
/
D
1
9
1
3
4
R
E
S
E
T
1
3
5
P
2
.
2
0
/
D
2
0
1
3
6
P
2
.
2
1
/
D
2
1
1
3
7
V
s
s
A
_
P
L
L
1
3
8
V
s
s
A
1
3
9
P
1
.
2
8
/
T
D
I
1
4
0
X
T
A
L
2
1
4
1
X
T
A
L
1
1
4
2
V
1
8
A
1
4
3
P
1
.
2
7
/
T
D
O
1
4
4
U1
LPC2212/2214
R3
10K
VIN3
G
N
D
1
VOUT2
U3
R4
10K
VIN3
G
N
D
1
VOUT2
U2
C1
10uF/16V
+5V
+5V
C2
10uF/16V
• 完整的最小系统 ——LPC2200不使用外部存储器
复位后使用
内部存储器
周立功单片机
第6章 目录
�1.最小系统
�2.片内外设
�3.总线接口
�4.其它外设
周立功单片机
片内外设
• 简介
本节介绍LPC2000系列微控制器片内外设的接口
设计,主要介绍以下几种:
�GPIO(通用I/O)
�UART、MODEM
�I2C
�SPI
周立功单片机
• GPIO外设接口设计
LPC2000系列的绝大多数GPIO为真正的全双向I/O
口,可以独立控制每一根I/O口线的状态是输入还是输
出,绝大多数GPIO的输出为推挽输出,可以独立控制
每一根I/O口的输出状态。虽然LPC2000系列的I/O电压
为,GPIO的输出最高为I/O口电源电压,但绝大多
数GPIO能够承受5V电压的输入,绝大多数GPIO作为
输入时是处于高阻状态。
因为LPC2000系列的GPIO有以上特性,所以可以
用它们(通过程序)模拟很多器件的时序达到控制相
应器件的目的。
周立功单片机
• GPIO外设接口设计——按键
独立式按键输入
原理:根据IO口的状态了解外部按
键是否按下;
优点:编程简单;
缺点:口线利用率不高。
行列式按键输入
原理:行线逐个输出,列线读入,
循环一次可以了解外部按键状态;
优点:可以连接较多按键;
缺点:编程较复杂。
周立功单片机
• GPIO外设接口设计——LED控制
GPIO直接驱动LED
原理:当IO口输出高电平时
LED熄灭,输出低电平时
LED点亮。使用时要注意IO
口的驱动能力;
优点:编程简单;
缺点:信息简单。
使用三极管驱动LED数码管
原理:每个IO口驱动数码管的一段,不同
组合可以构成不同的数字或部分字母;
优点:可以表示更丰富的信息;
缺点:成本较高。
周立功单片机
• GPIO外设接口设计——蜂鸣器
原理:如果为直流蜂鸣器,那么只需提
供额定电压就可以鸣叫。如果为交流蜂
鸣器,那么需要提供一定频率的交流信
号,蜂鸣器才能鸣叫。通过IO口控制蜂
鸣器的供电。
该上拉电阻可
以避免当IO口
作为输入时,
Q1基极悬空引
起漏电。
周立功单片机
• GPIO外设接口设计——模拟总线
LPC2000系列部分芯片没有外部总线,当它们需
要外接总线设备时就必须用GPIO模拟总线了。因为总
线需要大量的信号线,而LPC2000的GPIO资源是宝贵
的,所以模拟总线的设计的首要任务是节省GPIO的使
用量,这就需要地址、数据总线复用了。
数据总线
地址总线
控制总线
LPC2000
外设1 外设2
周立功单片机
• GPIO外设接口设计——模拟总线
8位地址的模拟总线
周立功单片机
• GPIO外设接口设计——模拟总线
16位地址的模拟总线
周立功单片机
• GPIO外设接口设计——模拟总线
24位地址的模拟总线
周立功单片机
• UART、MODEM外设接口设计
UART简介:
通用异步收发器UART(即Universal Asynchronous
Receiver and Transmitter)是用硬件实现异步串行通信的
通信接口电路。UART异步串行通信接口是嵌入式系
统最常用的接口,可用来与上位机或其它外部设备进
行数据通信。
LPC2000系列ARM7微控制器均具有两个UART,
它们的结构及寄存器符合16C550工业标准。
周立功单片机
• UART、MODEM外设接口设计
UART:
是通用异步串行通信接口的总称,UART允许在串行链路上
进行全双工的通信,输出/输入的电平为TTL电平。一般来说,全
双工UART定义了一个串行发送引脚(TXD)和一个串行接收引脚
(RXD),可以在同一时刻发送和接收数据。
16C500:
是一种工业标准的UART,此类UART芯片内部集成了可编程
的波特率发生器、发送/接收FIFO、处理器中断系统和各种总线
状态错误检测电路等等,并具有完全的MODEM控制能力。
RS232:
是美国电子工业协会(EIA)制定的串行通讯标准,又称RS-
232-C 。RS232是一个全双工的通讯标准,它可以同时进行数据
接收和发送的工作。
周立功单片机
• UART、MODEM外设接口设计
LPC2000系列ARM7微控制器包含有两个UART接
口, 详细请参考节。使用UART时,数据位的宽
度是由波特率而定。
周立功单片机
• UART、MODEM外设接口设计
如果要使用UART0与RS232接口的设备进行基本
的通讯,那么就需要一个RS232转换器将TTL电平转换
成RS232电平。
周立功单片机
• UART、MODEM外设接口设计
LPC2000系列ARM7微控制器的UART1带有完整
的调制解调器(MODEM)接口,只要使用SP3243ECA
转换芯片将信号转换成RS232电平,即可与MODEM
连接,控制MODEM拔号、通讯等等。
周立功单片机
• I2C总线接口
I2C BUS(Inter IC BUS)是Philips推出的芯片间串
行传输总线,它以2根连线实现了完善的全双工同步数
据传送,可以极方便地构成多机系统和外围器件扩展
系统。I2C总线采用了器件地址的硬件设置方法,通过
软件寻址完全避免了器件的片选线寻址方法,从而使
硬件系统具有最简单而灵活的扩展方法。详细信息请
参看节。
微控制器A LCD驱 动 器
A D C
静态RAM EEPROM
门 阵 列 器 件 微控制器B
S D A
S C L
周立功单片机
• I2C总线接口
�发送器:本次传输中发送数据到总线的器件;
�接收器:本次传输中从总线接收数据的器件;
�主机:初始化发送、产生时钟信号和终止发送的器
件,它可以是发送器或接收器。主机通常是微控制
器;
�从机:被主机寻址的器件,可以是发送器或接收器。
微控制器A LCD驱 动 器
A D C
静态RAM EEPROM
门 阵 列 器 件 微控制器B
S D A
S C L
——名词解释
周立功单片机
• I2C总线接口——总线信号
数据的有效位
起始信号和停止信号
数 据 线 ,
保持稳定,
数 据 有 效
允 许 数
据 变 化
SDA
SCK
S P
起 始 信 号 停 止 信 号
SDA
SCK起始信号通常由
主机发出,它作
为一次传输的开
始。在起始信号
后总线被认为处
于忙的状态
停止信号作为
一次传送的结
束,在该信号
之后,总线被
认为再次处于
空闲状态。
周立功单片机
• I2C总线接口——常用I2C器件
随着I2C总线技术的推出。很多电子厂商都推出了
许多带I2C总线接口的器件,大量应用于视频、音像及
通讯等领域。表给出了常用的通用I2C接口的种类、
型号及寻址字节。
1 0 1 0 a10 a9 a8 R/
只写:0 1 1 1 0 0 SA0 R/
(SA0为该器件的引脚)
只写:0 1 1 1 0 0 SA0 R/
(SA0为该器件的引脚)
从地址:070H
读:0A3H 写:0A2H
0 1 0 A2 A1 A0 R/
0 1 0 A2 A1 A0 R/
0 1 0 A2 A1 A0 R/
CAT1161/2内嵌I2C总线、E2PROM、RESET、
WDT功能的电源监控器件
PCF8576通用低复用率LCD 驱动器
PCF8562带32×4位RAM 低复用率的通用
LCD驱动器
ZLG7290键盘及LED驱动器
PCF8563实时时钟/日历时钟
CAT24WC01
CAT24WC02
CAT24WC04
128B E2RPM
256B E2RPM
512B E2RPM
器件地址及寻址字节型号种类
W
W
W
W
W
W
周立功单片机
• I2C总线接口——ZLG7290
ZLG7290为键盘和LED驱动器,它提供了I2C串行
接口和键盘中断信号,方便与处理器连接;可驱动8位
共阴数码管或64只独立LED和64个按键, 可控扫描位数
以及可控任一数码管闪烁,提供数据译码和循环移位、
段寻址等控制,8个功能键可检测任一键的连击次数,
无需外接元件即可直接驱动LED即可扩展驱动电流和
驱动电压。下图为ZLG7290的引脚排列。
周立功单片机
• I2C总线接口——CAT24WC02
CAT24WC02是一款I2C总线接口的E2PROM器
件,其引脚如下图所示。
器件地址选择
CAT24WC02的I2C总线地址的高4位固定为
1010,低四位由A2、A1和A0决定。当A2A1A0引脚悬
空时,默认值为000。
周立功单片机
• I2C总线接口——I2C应用示例
LPC2000系列微控制器都提供了硬件I2C总线接口
和I2C总线控制器。由于LPC2000微控制器的SDA和
SCL端口为开漏输出,所以必须在SDA和SCL线上分别
外接一个上拉电阻。
该示例利用LPC2000微控制器作为I2C总线的主
机,在总线上挂接着两个I2C器件作为从机,分别为
E2PROM器件CAT24WC02和键盘和LED驱动器
ZLG7290。R46和R48即为I2C总线上的两个上拉电阻。
周立功单片机
• I2C总线接口——I2C应用示例
总线上拉电阻
周立功单片机
• SPI总线接口
SPI(Serial Peripheral Interface——串行外设接口)
总线系统是一种同步串行外设接口,允许MCU与各种
外围设备以串行方式进行通信、数据交换。外围设备
包FLASH、RAM、A/D转换器、网络控制器、MCU等。
SPI系统可直接与各个厂家生产的多种标准外围器件直
接接口,一般使用4条线:串行时钟线SCK、主机输入
/从机输出数据线MISO、主机输出/从机输入数据线
MOSI和低电平有效的从机选择线SSEL(有的SPI接口
芯片带有中断信号线INT,有的SPI接口芯片没有主机
输出/从机输入数据线MOSI)。 详细信息参看节。
周立功单片机
• SPI总线接口
�SCK串行时钟,用于同步SPI接口间数据传输的时钟信号。该时
钟总是由主机驱动并且从机接收;
�SSEL从机选择,SPI从机选择信号是一个低有效信号,用于指示
被选择参与数据传输的从机。每个从机都有各自特定的从机选择
输入信号。在数据处理之前,SSEL必须为低电平并在整个处理过
程中保持低电平。如果在数据传输中SSEL信号变为高电平,传输
中止;
�MISO主入从出,该信号是一个单向的信号,它将数据从从机传
输到主机。当器件为从机时,串行数据从该端口输出;当器件为
主机时,串行数据从该端口输入;当从机没有被选择时,将该信
号驱动为高阻态;
�MOSI主出从入,该信号是一个单向的信号,它将数据从主机传
输到从机。当器件为主机时,串行数据从该端口输出;当器件为
从机时,串行数据从该端口输入。
——引脚描述
周立功单片机
• SPI总线接口——发送与接收
8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8
S P I主 机
S P I从 机
M O S I
M O S I M I S 0
M I S 0
S C K
S C K
接 收 缓 冲 区
接 收 缓 冲 区
写 SPI数 据
写 SPI数 据
将数据写到SPI发送缓冲区后,时钟信号SCK的1次作用对应
一位数据的发送(MISO)和另一位数据的接收(MOSI);在主机
中数据从移位寄存器中自左向右发出送到从机(MOSI),同时
从机中的数据自右向左发到主机(MISO),经过8个时钟周期完
成1个字节的发送。输入字节保留在移位寄存器中,然后从接收
缓冲区中读出一个字节的数据。
周立功单片机
• SPI总线接口——总线连接
SPI总线可在软件的控制下构成各种简单的或复杂
的系统,如:1个主MCU和几个从MCU;几个从MCU
相互连接构成多主机系统(分布式系统);1个主
MCU和1个或几个从I/O设备。
大多数应用场合中,使用1个MCU作为主机,它
控制数据向1个或几个从外围器件的传送。从器件只能
在主机发命令时才能接收或向主机传送数据。其数据
的传输格式通常是高位(MSB)在前,低位(LSB)
在后,在一些增强型的MCU中高位在前或低位在前都
是可通过软件设置的,如LPC2000系列微控制器。
周立功单片机
• SPI总线接口——总线连接
8位移位寄存器
SPI时钟发生器
8位移位寄存器
主 机 从 机
M I S O
M O S I
M I S O
M O S I
S S E L
S C KS C K
V C C
S S E L
8位移位寄存器
SPI时钟发生器
8位移位寄存器
主 机 /从 机 从 机 /主 机
MI S O
M O S I
M I S O
M O S I
S S E L
S C KS C K
SPI时钟发生器
SS E L
单主单从
互为主从
将对方SSEL引
脚拉低后,迫使
对方作为从机
周立功单片机
• SPI总线接口——总线连接
单主多从
8位移位寄存器
SPI时钟发生器
8位移位寄存器
主 机 从 机
G P I O
P R O T
M I S O
M O S I
M I S O
M O S I
S S E L
S C KS C K
8位移位寄存器
MIS O
M O S I
S S E L
S C K
G P I O
P R O T
从 机
周立功单片机
• SPI总线接口——总线连接
多机互为主从
S C K
M I S O
M O S I
S S E L
GPIO 1
GPIO n
S C K
M I S O
M O S I
S S E L
GPIO 1
GPIO n
S C K
M I S O
M O S I
S S E L
GPIO 1
GPIO n
主 / 从 主 / 从
主 / 从
周立功单片机
• SPI总线接口——应用示例
在把SPI与几种不同的串行I/O芯片相连时,应特别注意这些
串行I/O芯片的输入输出特性。
(1) 输入芯片的串行数据输出是否有三态控制端。平时未选中芯
片的输出端应处于高阻态。若没有三态控制端,应外加三态门。
否则MCU的MISO端只能连接1个输入芯片。
(2) 输出芯片的串行数据输入是否有允许控制端。即应该只有在
这片芯片允许时,SCK脉冲才把串行数据移入该芯片;芯片禁止
时,SCK对芯片无影响。若没有允许控制端,应在外部用门电路
对SCK进行控制后,再加到芯片的时钟输入端,或者SPI只连接1
个芯片,不能再连接其它输入或输出芯片。
周立功单片机
第6章 目录
�1.最小系统
�2.片内外设
�3.总线接口
�4.其它外设
周立功单片机
总线接口
• 简介
LPC2200系列具有开放的外部总线,而LPC2100
系列则总线不开放,但是可以通过IO口模拟总线接口。
在总线接口上可以挂接多种外部设备,包括:并行
SRAM、并行Flash、USB接口、液晶模块、网络接口
等设备,这里仅介绍其中部分常用的外部设备。
周立功单片机
• 并行SRAM
�SRAM为静态RAM存储器,具有极高的读写速度,在嵌入式系
统中常用来作变量/数据缓冲,或者将程序复制到SRAM上运行,
以提高系统的性能。注意,SRAM属于易失性存储器,电源掉电
后SRAM中的数据将会丢失,所以不可能直接使用SRAM引导程
序运行。
�DRAM为动态RAM存储器,具有存储容量大和价格便宜的特点。
DRAM是用MOS电路和电容来作存储元件,由于电容会放电,所
以需要定时充电以维持存储内容的正确,例如每隔2ms刷新一次
数据。
�PSRAM(即Pseudo-SRAM)器件是异步SRAM接口技术和利用
存储阵列的高密度DRAM技术相结合的产物。实际上,这些器件
实现了对主机系统透明地自刷新技术。通过扩展包括刷新操作和
读出操作两部分时间在内的读出周期的规定周期时间,使得透明
的刷新成为可能。这种方法同样也可用于写入周期。
——概述
周立功单片机
• 并行SRAM
SRAM器件种类繁多,这里以IS61LV25616AL为例。该芯片
是美国ISSI公司的高速SRAM器件,采用CMOS技术,存储容量
为512K字节,16位数据宽度,工作电源。管脚分布如下图所
示。
——SRAM
周立功单片机
• 并行SRAM
SRAM器件种类繁多,这里以IS61LV25616AL为例。该芯片
是美国ISSI公司的高速SRAM器件,采用CMOS技术,存储容量
为512K字节,16位数据宽度,工作电源。管脚分布如下图所
示。
——SRAM
地GND
电源VDD
空NC
高字节选择
低字节选择
写使能
输出使能
芯片使能
数据输入/出I/O0~I/O15
地址输入A0~A17
管脚描述管脚名
CE
OE
WE
LB
UB
周立功单片机
• 并行SRAM
IS61LV25616AL工作模式
——SRAM
周立功单片机
• 并行SRAM
芯片IS61LV25616AL与LPC2200的连接如下图所示。
——SRAM
地址总线
A1~A18,
A0未使用
数据总线
使用Bank0,所以
片选连接在CS0
周立功单片机
• 并行SRAM
PSRAM以CellularRAM的MT45W4ML16PFA 为例。CellularRAM
是一系列PSRAM产品,是一种高速、CMOS动态随机存取存储器,
适用于低功耗的便携式产品中。
CellularRAM技术有几个特点:
�它向后可兼容标准异步SRAM器件;
�它是带有SRAM接口的DRAM技术;
�它的价格比目前使用的SRAM器件更低;
�器件包含有页面模式读访问,可看作是异步读协议的带宽增加
的扩展特性。
——PSRAM
为了能在异步存储器总线上实现无缝操作,CellularRAM产品集
成了一种透明的自刷新机制。隐藏刷新不需要系统存储器控制器的额
外支持,它对器件的读/写性能没有明显影响。
MT45W4ML16PFA是CellularRAM的一种,是一个4Meg×16
位的64Mb器件。为了减少功耗,内核电压被降低到,为了兼容
各种不同存储器总线的接口,I/O电压为。
周立功单片机
• 并行SRAM
功能框图
——PSRAM
地址译码逻辑
(配置寄存器 C RC RC RC R )
控 制 逻 辑
4 ,0 9 6 k4 ,0 9 6 k4 ,0 9 6 k4 ,0 9 6 k×1 61 61 61 6
(2 ,048k(2,048k(2,048k(2,048k×1 61 61 61 6 )
D R A MD R A MD R A MD R A M
存 储 器 阵 列
输 入 /
输 出
多 路 转
换 器 和
缓 冲 器
DQ[7:0]DQ[7:0]DQ[7:0]DQ[7:0]
DQ[15:8] DQ[15:8] DQ[15:8] DQ[15:8]
A[21:0] 64MbA[21:0] 64MbA[21:0] 64MbA[21:0] 64Mb器 件
A[20:0] 32MbA[20:0] 32MbA[20:0] 32MbA[20:0] 32Mb器 件
C E #C E #C E #C E #
W E #W E #W E #W E #
O E #O E #O E #O E #
U B #U B #U B #U B #
L B #L B #L B #L B #
Z Z #Z Z #Z Z #Z Z #
周立功单片机
• 并行SRAM
总线操作模式
——PSRAM
周立功单片机
• 并行SRAM
与LPC2000硬件连接图
——PSRAM
LPC2200在外部存储器接口Bank0上使用MT45W4ML16PFA,所
以将LPC2200的CS0与MT45W4ML16PFA的片选引脚连接。存储器连
接使用了16位总线方式。
周立功单片机
• 并行Flash
FLASH存储器又称闪存,是一种可在线多次擦除的非易失性
存储器,即掉电后数据不会丢失。FLASH存储器还具有体积小、
功耗低、抗振性强等优点,是嵌入式系统的首选存储设备。
FLASH存储器主要分为两种,一种为NOR型FLASH,另一
种为NAND型FLASH 。
——概述
周立功单片机
• 并行Flash
(1) 接口差别
NOR型FLASH采用的是SRAM接口,提供有足够的地址引脚
来寻址,可以很容易地存取其片内的每一个字节;
NAND型FLASH使用复杂的I/O口来串行地存取数据,各个
产品或厂商的方法可能各不相同。通常是采用8个引脚来传送控
制、地址和数据信息。
(2) 读写的基本单位
NOR型FLASH操作是以“字”为基本单位;
NAND型FLASH操作是以“页面”为基本单位,页的大小一般
为512字节。
(3) 性能比较
NOR型FLASH的地址线和数据线是分开的,传输效率很高,
程序可以在芯片内执行。NOR型的读速度比NAND型稍快一些;
NAND型的写入速度比NOR型快很多(由于NAND型读写的基
本单位为“页面”,所以对于小量数据的写入,总体速度要比NOR
型慢);
——NOR型与NAND型FLASH的区别
周立功单片机
• 并行Flash
(4) 容量和成本
NAND型FLASH具有极高的单元密度,容量可以做得比较
大,加上其生产过程更为简单,价格也就相应地降低了。
NOR型FLASH占据了容量为1~16MB闪存市场的大部分,而
NAND型FLASH只是用在8~128MB的产品当中,这也说明NOR
主要应用在代码存储介质中,NAND适合于数据存储,NAND在
CompactFlash、Secure Digital、PC Cards和MMC存储卡市场上所
占份额最大。
(5) 软件支持
在NOR型FLASH上运行代码不需要任何的软件支持,而在
NAND型FLASH上进行同样操作时,通常需要驱动程序,也就是
内存技术驱动程序MTD (Memory Technology Drivers)。NAND型
和NOR型FLASH在进行写入和擦除操作时都需要MTD(说明,
MTD已集成在FLASH芯片内部,它是对FLASH进行操作的接口)。
——NOR型与NAND型FLASH的区别
周立功单片机
• 并行Flash
这里以SST39VF160为例,介绍NOR型FLASH存储器的结构
及操作。
SST39VF160是SST公司的CMOS多功能FLASH(MPF)器
件,存储容量为2M字节,16位数据宽度(即一个字为2字节),工
作电压为~。SST39VF160由SST特有的高性能SuperFlash
技术制造而成,SuperFlash技术提供了固定的擦除和编程时间,
与擦除/编程周期数无关。芯片管脚配置如下图所示。
——NOR型Flash存储器
周立功单片机
• 并行Flash ——NOR型Flash存储器
悬空管脚不连接NC
地Vss
供给电源电压: ~电源VDD
控制写操作。写使能WE#
数据输出缓冲器的门控信号。输出使能OE#
CE#为低时启动器件开始工作。芯片使能CE#
读周期内输出数据,写周期内输入数据。
写周期内数据内部锁存。
OE#或CE#为高时输出为三态。
数据输入/输出DQ15~DQ0
存储器地址。扇区擦除时,A19~A11用来选择
扇区。块擦除时,A19~A15用来选择块。地址输入A19~A0
功能管脚名称符号
SST39VF160管脚描述
NOR型FLASH存储器采用的是SRAM接口,其地址线和数据
线是分开的。
周立功单片机
VIHVILVIL器件标识符软件模式
X高阻/DOUTVIHXX
X高阻/DOUTXVILX
写禁止
X高阻XXVIH等待
扇区或块地址,
芯片擦除时为XXHX
VILVIHVIL擦除
AINDINVILVIHVIL编程
AINDOUTVIHVILVIL读
地址DQWE#OE#CE#模式
• 并行Flash ——NOR型Flash存储器
SST39VF160工作模式选择
周立功单片机
• 并行Flash ——NOR型Flash存储器
NOR型FLASH存储器容量越来越大,为了方便数据管理,将
FLASH划分为块(Block),每个块又分成扇区(Sector)。
SST39VF160的块大小为32K字,扇区大小为2K字。
�读操作,可以对任何地址的任何字节进行,不受限制;
�写操作,以字形式进行编程。编程前包含字的扇区必须完全
擦除;
�擦除操作,以扇区(2K)、块(32K)或全片为单位进行擦除。
擦除后数据变为0xFF。
周立功单片机
• 并行Flash ——NOR型Flash存储器
SST39VF160的存储器操作由命令来启动。命令通过标准微
处理器写时序写入器件。将WE#拉低、CE#保持低电平来写入命
令。地址总线上的地址在WE#或CE#的下降沿(无论哪一个后产
生下降沿)被锁存。数据总线上的数据在WE#或CE#的上升沿
(无论哪一个先产生上升沿)被锁存。存储器操作命令如下表所
示。
F0H5555H55H2AAAHAAH5555H
软件ID退出
/CFI退出
F0HXXH
软件ID退出
/CFI退出
98H5555H55H2AAAHAAH5555HCFI查询入口
90H5555H55H2AAAHAAH5555H软件ID入口
10H5555H55H2AAAHAAH5555H80H5555H55H2AAAHAAH5555H芯片擦除
50HBax55H2AAAHAAH5555H80H5555H55H2AAAHAAH5555H块擦除
30HSax55H2AAAHAAH5555H80H5555H55H2AAAHAAH5555H扇区擦除
数据WA3A0H5555H55H2AAAHAAH5555H字编程
数据地址数据地址数据地址数据地址数据地址数据地址
第6666个总线写周期第5555个总线写周期第4444个总线写周期第3333个总线写周期第2222个总线写周期第1111个总线写周期
命令时序
周立功单片机
• 并行Flash ——NOR型Flash存储器
SST39VF160与LPC2000连接图
周立功单片机
• 并行Flash
这里以K9F2808U0C为例,介绍NAND型FLASH存储器的结构
及操作。
K9F2808U0C是SAMSUNG公司生产的NAND型FLASH存储
器,存储容量为16M×8Bit,工作电压为~。528字节的页
编程操作时间为200μs,16K字节的块擦除操作时间为2ms。页面
的数据以每个字50ns的速度被读出。片内写控制自动实现所有编
程和擦除功能,包括脉冲的周期、内部校验和数据冗余。
——NAND型Flash存储器
周立功单片机
• 并行Flash ——NAND型Flash存储器
K9F2808U0C的存储空间分为32K页,每一页有(512+16)
字节。该寄存器被分为两个区:数据区和空闲区。数据区又可分
为上、下两个区,每个区为256字节;空闲区可以用于存放ECC
校验和其它校验信息。
K9F2808U0C芯片的存储器阵列由16个单元组成,这16个单
元串联到一起形成一个NAND结构。每个单元位于不同的页面。
一个块由两个NAND结构的串组成。一个NAND结构包含16个单
元。全部135168个NAND单元位于一个块中。
周立功单片机
• 并行Flash ——NAND型Flash存储器
对K9F2808U0C的操作是通过将特定的指令数据写到芯片指
令寄存器中实现,指令与时序的定义如下表所示。
O-70h读状态
D0h60h块擦除
10h80h页编程
O-FFh复位
-90h读器件ID
-50h读数据寄存器(空闲区)
-00h/ 01h读数据寄存器(数据区)
忙时可接受的命令第二个周期第一个周期功能
周立功单片机
• 并行Flash ——NAND型Flash存储器
K9F2808U0C与LPC2000连接图
周立功单片机
总线接口
• USB(D12)
USB总线主要用于USB设备与USB主机之间的数
据通信,特别为USB设备与USB主机之间大量数据的
传输提供了高速、可靠的传输协议。例如:在嵌入式
系统中,可以利用USB设备与微控制器构成USB设备。
USB设备与PC机USB主控器相连就可以实现嵌入式系
统与PC机之间的通信了,也就可以实现诸如U盘、移
动硬盘、USB接口打印机等功能。
——概述
周立功单片机
• USB(D12)
PDIUSBD12是一款性价比很高的USB器件,完全符合
版规范。PDIUSBD12管脚排列及内部功能框图如下图所示。
控制
模拟
收发器
上游端口
PLL锁相环
位时钟恢复
PHILIPS
串行接口引擎
电压调整器
SoftConnect
内部RAM
存储器
管理单元
并行和DMA
接口
1
2
3
4
5
6
7
8
9
10
11
12 17
18
19
20
21
22
23
24
25
26
27
28DATA<0>
DATA<1>
DATA<2>
DATA<3>
GND
DATA<4>
DATA<5>
DATA<6>
DATA<7>
ALE
CS_N
A0
D+
D–
VDD
XTAL2
XTAL1
RESET_N
GL_N
EOT_N
DMACK_N
DMREQSUSPEND
13 16 WR_NCLKOUT
14 15 RD_NINT_N
管脚排列 内部框图
周立功单片机
PDIUSBD12是一款性价比很高的USB器件,完全符合
版规范。PDIUSBD12管脚排列及内部功能框图如下图所示。
控制
模拟
收发器
上游端口
PLL锁相环
位时钟恢复
PHILIPS
串行接口引擎
电压调整器
SoftConnect
内部RAM
存储器
管理单元
并行和DMA
接口
内部框图
• USB(D12)
1
2
3
4
5
6
7
8
9
10
11
12 17
18
19
20
21
22
23
24
25
26
27
28DATA<0>
DATA<1>
DATA<2>
DATA<3>
GND
DATA<4>
DATA<5>
DATA<6>
DATA<7>
ALE
CS_N
A0
D+
D–
VDD
XTAL2
XTAL1
RESET_N
GL_N
EOT_N
DMACK_N
DMREQSUSPEND
13 16 WR_NCLKOUT
14 15 RD_NINT_N
管脚排列
1
2
3
4
5
6
7
8
9
10
11
12 17
18
19
20
21
22
23
24
25
26
27
28DATA<0>
DATA<1>
DATA<2>
DATA<3>
GND
DATA<4>
DATA<5>
DATA<6>
DATA<7>
ALE
CS_N
A0
D+
D–
VDD
XTAL2
XTAL1
RESET_N
GL_N
EOT_N
DMACK_N
DMREQSUSPEND
13 16 WR_NCLKOUT
14 15 RD_NINT_N
管脚排列
数据总线接口
地址锁存
片选线
读选通引脚
写选通引脚
——总线接口
PDIUSBD12的硬件接口和外部存储器接口类似,可以当作一
片外部RAM芯片来进行访问。
LPC2200微控制器的外部数据总线与地址总线是分开的,所以
PDIUSBD12的DATA0~DATA7可以直接与LPC2200的数据总线的
D0~D7直接相连就可以构成访问PDIUSBD12的数据总线了。
LPC2200微控制器访问PDIUSBD12的地址总线则必须由片选
信号和地址信号构成。举个例子,PDIUSBD12的片选引脚CS_N与
LPC2200的Bank2片选引脚相连,而PDIUSBD12的A0则需要与
LPC2200的地址线A0相连了。
周立功单片机
• USB(D12)
D12XTAL2
D12XTAL1
CS_USB
USBDP
/GOODLNK
USBDM
RST_USB
D12DM
D12DP
AD0
INT_USB
X1
6MHz
VBUS
1
D-2
D+
3
GND
4
SHIELD5
CZ1
USB
R7
1K
R3
18R+/-1%
R2
18R+/-1%
C5C1
68pF
C2
22pF
R5
1M
R4
1M
C3
470pF
C6
+
C4
105
+
C7
R1
10K
FB1
FB2
VCC33
VCC33
VCC33
RD
WR
DATA01
DATA1
2
DATA2
3
DATA34
GND
5
DATA4
6
DATA57
DATA6
8
DATA79
ALE
10
CS_N
11
SUSPEND12
CLKOUT
13
INT_N
14
RD_N
15WR_N
16
DMREQ 17
DMACK_N
18EOT_N
19
RESET_N 20
GL_N
21
XTAL1 22
XTAL2
23VCC
24
D- 25
D+
27
A0 28
U1
PDIUSBD12(TSSOP-28)
L1
GOODLINK
VBUS
USB-
USB+
SUSP
R6 1M
VCC33
C8
104
R8
1M
D0
D1
D2
D3
D4
D5
D6
D7
GND
R9 10K
CBG201209U151B
CBG201209U151B
104
R10 10K
VCC33
INT_USB
SUSP
R11 10K
PDIUSBD12与LPC2200电路原理图
周立功单片机
• USB(D12)
PDIUSBD12与LPC2100电路原理图
周立功单片机
总线接口
• USB(D12)
(1)PDIUSBD12振荡电路的电容C1与C2必须分别为
68pF和22pF,否则可能会造成PDIUSBD12工作时钟不
正常。
(2)注意串联在D+和D-上的磁珠的型号,如果型号
选择不当会影响USB总线的稳定性。磁珠元件内部由
电阻与电感组成,所以选型时必须综合考虑USB总线
频率与磁珠的阻抗是否匹配。
(3)D+/ D – 线上应串接18欧的匹配电阻。
——硬件电路设计要点
周立功单片机
总线接口
• 液晶接口
液晶是一种在一定温度范围内呈现既不同于固态、
液态,又不同于气态的特殊物质态,它既具有各向异
性的晶体所特有的双折射性,又具有液体的流动性。
液晶显示器件(英文的简写为LCD)就是利用液晶态
物质的液晶分子排列状态在电场中改变而调制外界光
的被动型显示器件。
液晶显示屏是平板显示器件中的一种,具有低工
作电压、微功耗、无辐射、体积小等特点,被广泛应
用于各种各样嵌入式产品中,如手机、PDA、数码相
机等。
——概述
周立功单片机
总线接口
• 液晶接口
按显示原理分:TN(Twist Nematic)扭曲向列型、
STN(Super Twist Nematic)超扭曲向列型、TFT
(Thin Film Transistor)薄膜晶体管型等。
按颜色分:单色屏、4级灰度屏、8级灰度屏、16级灰
度屏、64级灰度屏、256级灰度屏、16色屏、256色伪
彩色屏、TFT真彩色屏等。
触摸屏:电阻式触摸屏(四线电阻式触摸屏、五线电
阻式触摸屏)、表面声波触摸屏、电容式触摸屏、红
外线触摸屏等。
——液晶屏分类
周立功单片机
• 液晶接口 ——触摸屏
四线电阻式触摸屏(简称四线式触摸屏)包含两个透明的阻
性层。其中一层在屏幕的左右边缘各有一条垂直总线,另一层在
屏幕的底部和顶部各有一条水平总线。四线式触摸屏是最常用的
触摸屏之一,所以这里将对其作重点介绍。
周立功单片机
• 液晶接口 ——触摸屏
触摸屏的两个金属导电层分别用来测量X轴和Y轴方向的坐
标。用于X坐标测量的导电层从左右两端引出两个电极,记为X+
和X-。用于Y坐标测量的导电层从上下两端引出两个电极,记为
Y+和Y-。这就是四线电阻式触摸屏的引线构成。
周立功单片机
• 液晶接口 ——触摸屏
当在一对电极上施加电压时,在该导电层上就会形成均匀连
续的电压分布。若在X方向的电极对上施加一确定的电压,而Y
方向电极对上不加电压时,在X平行电压场中,触点处的电压值
可以在Y+(或Y-)电极上反映出来,通过测量Y+电极对地的电
压大小,便可得知触点的X坐标值。同理,当在Y电极对上加电
压,而X电极对上不加电压时,通过测量X+(或X-)电极的电
压,便可得知触点的Y坐标值。
周立功单片机
• 液晶接口 ——触摸屏
在使用触摸屏时,需要一个ADC转换器将模拟信号转换成数
字信号,通常直接使用触摸屏控制器完成这一功能,也可以使用
微处理器内部的ADC转换器实现。触摸屏控制器的主要功能是在
微处理器的控制下向触摸屏的两个方向分时施加电压,并将相应
的电压信号传送给自身A/D转换器,在微处理器SPI口提供的同步
时钟作用下将数字信号输出到微处理器。常见的触摸屏控制器如:
ADS7843/7846、MK715等等。
周立功单片机
• 液晶接口 ——点阵式液晶模块
在嵌入式系统应用中,如果微控制器本身带有液晶驱动控制
功能,则可以直接对点阵式液晶显示屏进行连接控制;如果微控
制器本身没有液晶驱动控制功能,则需要外扩液晶驱动板来连接
液晶显示屏,或者使用点阵式图形液晶显示模块。
由于点阵式液晶显示屏的引脚较多,生产厂家通常会将液晶
显示屏和驱动电路装配在一起,形成液晶模块,即LCM。液晶模
块在很大程度上方便了用户的使用,用户只要将其与微控制器连
接,即可进行图形的显示输出控制。
周立功单片机
• 液晶接口 ——点阵式液晶模块
这里以SMG240128A点阵图形液晶模块为例,介绍如何与
LPC2000系列微控制器连接使用。
SMG240128A点阵图形液晶模块的点像素为240×128点,黑
色字/白色底,STN液晶屏,视角为6:00,内嵌控制器为东芝公司
的T6963C,外部显示存储器为32K字节。液晶模块采用8位总线
接口与微控制器连接,内部集成了负压DC-DC电路(LCD驱动电
压),使用时只需提供单5V电源即可。
周立功单片机
• 液晶接口 ——点阵式液晶模块
背光灯电源正/负端 LED+/-20、21
DC-DC负电源输出 Vout19
字体选择,为高时6*8字体,为低时8*8字体 FS18
数据总线位0-7DB0-710-17
复位,低电平有效Reset9
C/D=H时,Wr=L :写命令;Rd=L :读状态
C/D=L时,Wr=L :写数据;Rd=L :读数据C/D8
片选信号,低电平有效CE7
读操作信号,低电平有效Rd6
写操作信号,低电平有效Wr5
LCD驱动电压(对比度调节负电压输入)Vo4
电源(+5V)Vdd3
电源地Vss2
接地显示屏框架外壳地FG1
备注说明符号引脚
SMG240128A点阵图形液晶模块引脚说明
周立功单片机
• 液晶接口 ——点阵式液晶模块
T6963C是东芝公司的点阵式图形液晶控制器,T6963C常用
于中规模的单色点阵图形液晶的显示控制器,其最大特点是具有
独特的硬件初始化值设置功能,显示驱动所需的参数如占空比系
数、驱动传输的字节数/行、字符的字体选择等均由引脚电平设置。
相关参数如下:
�工作电压:
�最大驱动液晶点阵:单色640×128(单屏)
�支持存储器大小:64K字节SRAM
�MCU接口:8位并行数据接口
�显示方式:图形方式、文本方式、图形文本混合方式
�字符发生器:128种5×8、6×8、7×8、8×8字符
(CGROM)
�可管理外部2K字节的CGRAM(8×8字符)
�驱动LCD占空比: 1/16~1/128
�低功耗:显示期间电流典型值
周立功单片机
• 液晶接口 ——点阵式液晶模块
T6963C读写操作时序图
周立功单片机
• 液晶接口 ——点阵式液晶模块
SMG240128A液晶模块与LPC2100 连接
使用8位
数据总线
使用区
别数据/命令
周立功单片机
• 液晶接口 ——点阵式液晶模块
SMG240128A液晶模块与LPC2200 连接
使用8位
数据总线
使用地址线
A1区别数
据/命令
数据操作地址:0x83000000
命令操作地址:0x83000002
周立功单片机
总线接口
• 网络接口
TCP/IP协议和以太网协议是使用最广泛的通讯协
议,如果一个嵌入式系统没有以太网接口,其价值将
大打折扣。
以太网底层协议的实现由以太网控制器来负责,
目前比较常用的10Mbps嵌入式以太网控制芯片有
RTL8019AS、CS8900等,而100Mbps的有LAN91C111
等,这里主要介绍RTL8019AS和LAN91C111。
——概述
周立功单片机
• 网络接口 ——RTL8019简介
RTL8019AS是一种高度集成的以太网控制芯片,能简单地实
现Plug and Play并兼容NE2000、掉电等特性。在全双工模式下,
如果是连接到一个同样是全双工的交换机或集线器,就可实现同
时接收和发送。这个特性虽然不能把传输速率从10Mbps提高到
20Mbps,但是在执行以太网CSMA/CD协议时,可以避免更多的
冲突的发生。而Microsoft's Plug and Play功能就可以为用户减轻对
资源配置的烦恼(如IRQ 、I/O address等)。
周立功单片机
• 网络接口 ——RTL8019简介
器件特性
●支持PnP自动检测模式;
●支持Ethernet II 和
10Base5, 10Base2, 10BaseT;
●软件兼容8位或16位的NE2000模式;
●支持跳线和非跳线模式;
●支持在非跳线模式下的Microsoft’s
Plug and Play配置;
●支持在全双工模式下的双倍信道带
宽;
●支持UTP、AUI 、BNC的自动检
测;
●在10BaseT下支持自动极性修正;
●支持8路中断请求(IRQ);
●支持16位I/O地址;
●内建16K SRAM;
●支持四盏可编程诊断LED。
管脚排列
周立功单片机
• 网络接口 ——RTL8019简介
FIFO ISA总线接口
系统I/O端口
本地DMA
远程DMA
16K SRAM
本
地
地
址
远
程
地
址
本
地
总
线
数据发送
16位
16位/8位
网络数据
管脚排列 内部功能框图
周立功单片机
• 网络接口 ——RTL8019与LPC2000的硬件电路设
计
NET_RST()RTL8019AS复位输入信号RSTDRV
INT_N()RTL8019AS中断输出信号INT0
nWERTL8019AS写使能(低电平有效)IOWB
nOERTL8019AS读使能(低电平有效)IORB
nCS3RTL8019AS地址总线SA5
A22RTL8019AS地址总线SA8
A1~A5RTL8019AS地址总线SA0~SA4
D0 ~ D15RTL8019AS数据总线SD0 ~
SD15
LPC2200功 能RTL8019AS
RTL8019AS与LPC2200一般通过外部总线进行连接。我们假
设RTL8019AS与LPC2200的连接关系如下表所示。
周立功单片机
• 网络接口 ——RTL8019与LPC2200的硬件电路设
计
周立功单片机
• 网络接口 ——RTL8019与LPC2100的硬件电路设
计
INT31
INT22
INT13
INT04
SA05
VDD6
SA17
SA28
SA39
SA410
SA511
SA612
SA713
GND14
SA815
SA916
VDD17
SA1018
SA1119
SA1220
SA1321
SA1422
SA1523
SA1624
SA1725
SA1826
SA1927
GND28
IORB29
IOWB30
O
S
C
I
5
0
T
X
+
4
9
T
X
-
4
8
V
D
D
4
7
L
D
4
6
H
D
4
5
G
N
D
4
4
S
D
7
4
3
S
D
6
4
2
S
D
5
4
1
S
D
4
4
0
S
D
3
3
9
S
D
2
3
8
S
D
1
3
7
S
D
0
3
6
I
O
C
H
R
D
Y
3
5
A
E
N
3
4
R
S
T
D
R
V
3
3
S
M
E
M
W
B
3
2
S
M
E
M
R
B
3
1
BD4 80
BD5 79
BD6 78
BD7 77
EECS 76
BCSB75
BA14 74
BA15 73
BA16 72
BA17 71
VDD 70
BA18 69
BA19 68
BA20 67
BA21 66
JP 65
AUI 64
LED263
LED162
LED061
LEDBN C60
TPIN+59
TPIN-58
VDD 57
RX+ 56
RX- 55
CD+ 54
CD- 53
GND 52
OSCO51
B
D
3
8
1
B
D
2
8
2
G
N
D
8
3
B
D
1
8
4
B
D
0
8
5
G
N
D
8
6
S
D
1
5
8
7
S
D
1
4
8
8
V
D
D
8
9
S
D
1
3
9
0
S
D
1
2
9
1
S
D
1
1
9
2
S
D
1
0
9
3
S
D
9
9
4
S
D
8
9
5
I
O
C
S
1
6
B
9
6
I
N
T
7
9
7
I
N
T
6
9
8
I
N
T
5
9
9
I
N
T
4
1
0
0
U2
RTL8019AS
VCC
VCC
VCC
VCC
VCC
VCC
VCC
VCC
Y4
20M
C1
20P
C2
20P
R26
51
R27
51
C13
103
C3
180
C4
180
R43
10
R44
10
N
E
T
_
R
S
T
LED8 GRN
LED7 RED
R28 1K
R29 3K
VCC
INT_NET
NET_RD
NET_WR
A0
A1
A2
A3
A4
A
D
0
A
D
1
A
D
2
A
D
3
A
D
4
A
D
5
A
D
6
A
D
7
R25
27K
LED6 GRN
R30 1K
TPOUT+4
TPOUT-5
TPIN+6
TPIN-7
RX_CT8
TX_ CT3
ETX_ CT1
ERX_CT2 1: RECEIVE+2: RECEIVE-
3: TRANSMIT+
6: TRANSMIT-
4: N
5: N
7: N
8: N
RJ-45
1: TX+
2: TX-
3: RX+
4: RX-
CZ1
HR901170A
C5
103
C6
103
C7
103
C8
103
INT_N
INT_N
WR
NET_CS
RD
NET_RD
NET_WR
1
2
3
U4A
74LS32
4
5
6
U4B
74LS32
1 2
U3A
74F04
A
D
8
A
D
9
A
D
1
0
A
D
1
1
A
D
1
2
A
D
1
3
A
D
1
4
A
D
1
5
AD0
AD1
AD2
AD3
AD4
AD5
AD6
AD7
ALE
WR
RD
NET_RST
INT_NET
R1 220
R2 220
R3 220
R4 220
R5 220
R6 220
R7 220
R8 220
R9 220NET_CS
OC1
C11
1D3
1Q 2
2D4
2Q 5
3D7
3Q 6
4D8
4Q 9
5D13
5Q 12
6D14
6Q 15
7D17
7Q 16
8D18
8Q 19
U?
74HC573
GND
ALE
AD0
AD1
AD2
AD3
AD4
A0
A1
A2
A3
A4
Philips
LPC2100
U1
LPC2100
周立功单片机
• 网络接口 ——LAN91C111简介
器件特性
●支持PnP自动检测模式;
●支持10/100Mbps全双工模式;
●软件兼容8位或16位、32位CPU访问
模式;
●芯片内部32位数据总线;
●支持数据突发传输;
●支持多种嵌入式处理器外部总线;
●内建8KB FIFO缓存。
管脚排列图
周立功单片机
• 网络接口 ——LAN91C111简介
管脚排列图
MAC控制器
物理
层控
制器
MII接口
8KB
收/发FIFO
LAN91C111
串行
EEPROM
网络
变压器
ISA,
嵌入式CPU
内部框图
LAN91C111芯片内部集成了MAC控制器、物理层控制器。
MAC控制器可以把数据从FIFO中发送到物理层控制器中,再由
物理层控制器发送到网络。而芯片与CPU的接口比较丰富。
周立功单片机
• 网络接口 ——LAN91C111与LPC2200的硬件电路设计
NET_RST()LAN91C111复位输入信号RESET
INT_N()LAN91C111中断输出信号INT0
悬空LAN91C111总线控制管脚ARDY
VCCLAN91C111总线控制nVLBUS
悬空LAN91C111总线控制nLDEV
VCCLAN91C111总线控制nRDYRTN
VCCLAN91C111总线控制W/nR
VCCLAN91C111总线控制nCYCLE
GNDLAN91C111总线控制LCLK
GNDLAN91C111总线控制nADS
nCS2LAN91C111总线控制AEN
BLE0~BLE1LAN91C111低16位数据选通nBE 0~nBE1
VCCLAN91C111高16位数据选通nBE2~nBE3
nWELAN91C111写使能(低电平有效)IOWB
nOELAN91C111读使能(低电平有效)IORB
nCS2LAN91C111地址总线A5
A22LAN91C111地址总线A8
A1~A3LAN91C111地址总线A1~A3
D0 ~ D15LAN91C111数据总线D0 ~ D15
LPC2200功 能LAN91C111
周立功单片机
• 网络接口 ——LAN91C111与LPC2200的硬件电路设计
LED3LED
LED2LED
R11
1K
R12
1K
R9 11K
TPOUT+4
TPOUT-5
TPIN +6
TPIN -7
RX_CT8
TX_CT3
ETX_CT1
ERX_CT2 1: RECEIVE+2: RECEIVE-
3: TRANSMIT+
6: TRANSMIT-
4: N
5: N
7: N
8: N
R
J
-
4
5
CZ1
R7
R8
R3
R4
Y1
25M
C13
30P
C14
30P
C1
103
R1
10K
R2
10K
R16
R14
10K
R15
R13
10K x 3
A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
A11
A12
A13
A14
A15
D0
D1
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12
D13
D14
D15
RST
LED1 LED R10
1K
INT
WR
RD
n
C
S
2
n
B
E
1
n
B
E
0
R1710M
A178
A279
A380
A481
A582
A683
A784
A885
A986
A1087
A1188
A1289
A1390
A1491
A1592
D6100
D5101
D4102
D3104
D2105
D1106
D0107
D799
D876
D975
D1074
D1173
D1271
D1370
D1469
D1568
A
E
N
4
1
RESET30
nADS37
LCLK42
ARDY38
nRDYRTN46
nSRDY43
INTR029
nLEDV45
nRD 31
nWR 32
nDATACS34
nCYCLE35
W/nR 36
nVLBUS40
n
B
E
3
9
7
n
B
E
2
9
6
n
B
E
1
9
5
n
B
E
0
9
4
XTAL1127
XTAL2128
RBIAS12
TPO+ 14
TPO- 15
TPI+ 17
TPI- 18
nLNK20
LBK 21
LEDA22
LEDB23
nCNTRL28
U?
91C111
周立功单片机
第6章 目录
�1.最小系统
�2.片内外设
�3.总线接口
�4.其它外设
周立功单片机
其它外设
• 概述
除了前面介绍的一些常用外设之外,在嵌入式系
统中可能还要用到一些其它外部设备。如并行打印机、
CF卡及IDE硬盘接口等。
周立功单片机
• 并行打印机 ——概述
打印机是重要的输出设备,很多测控仪器都需要
用它来长久保存数据。在嵌入式系统中使用打印机一
般有以下几种方式:
1.直接使用微型打印机的机芯,微控制器直接控制机芯工作。
采用这种方式可减少设备的体积,也可以降低成本,但开发
难度还很大,同时因为各种微型打印机的机芯不统一,带来
采购的风险。
2.使用成品微型打印机,这是常用的方式。采用这种方式可
减少设备的体积,微型打印机的可选范围也比较大,而且很
多微型打印机的接口也比较统一。缺点是成本比较高。
3.使用普通打印机。采用这种方式成本最低,且接口统一,
可选的范围也非常广,开发难度也最低。不过,其体积庞
大,且对工作环境要求高,不能在工业环境下使用。
该方案实际很少使用,
所以不作更多的介绍
该方案 不能在工业环境下
使用,所以不作更多的介绍
周立功单片机
• 并行打印机 ——概述
2.使用成品微型打印机,这是常用的方式。采用这种方式可
减少设备的体积,微型打印机的可选范围也比较大,而且很
多微型打印机的接口也比较统一。缺点是成本比较高。
2.使用成品微型打印机,这是常用的方式。采用这种方式可
减少设备的体积,微型打印机的可选范围也比较大,而且很
多微型打印机的接口也比较统一。缺点是成本比较高。
从接口方面来说,打印机分为标准并行打印机、
标准串行打印机、USB接口打印机、专用接口打印机
及它们的组合。因为USB接口在微型打印机中还不普
及,所以不作更多的介绍,下面介绍并行打印机和串
行打印机的接口。
周立功单片机
• 并行打印机 ——并行打印机接口信号(打印机端)
选择输入(低电平请求打印机联机,高电平迫使打印机停止联机)I/SLCT IN36
+5 V DCO+5 V35
没有使用-n/c34
信号地——0 V33
故障(低电平表示打印机没有联机)O/FAULT32
低电平复位打印机I/RESET31
/RESET的信号地——/GNDRESET30
信号地——GND19~29
+5 V DC (50 mA max)O+5 V PULLUP18
屏蔽地——CHASSIS GND17
逻辑地——0 V16
没有使用-n/c15
低电平使打印机自动换行I/AUTOFEED14
高电平表示打印机在线OSEL13
高电平表示打印机无纸OPOUT12
高电平表示打印机正忙,不能接收数据OBUSY11
低电平表示数据已被接受而且打印机准备好接收下一数据O/ACK10
并行数据的第0至第7位,高电平为“1”I/OD0~D72~9
数据选通触发脉冲,上升沿时读入数据I/STROBE1
描述方向信号名称引脚
周立功单片机
• 并行打印机 ——并行打印机接口信号(电脑端)
信号地—GND18~25
选择输入(低电平请求打印机联机,高电平迫使打印机停止联机)O/SELIN17
低电平使打印机初始化O/INIT16
高电平表示打印机无故障I/ERROR15
低电平使打印机自动换行O/AUTOFD14
高电平表示打印机在线ISEL13
高电平表示打印机无纸IPE12
高电平表示打印机正忙,不能接收数据IBUSY11
低电平表示打印机已接受数据而且准备好接收下一数据I/ACK10
并行数据的第0至第7位,高电平为“1”OD0~D72~9
数据选通触发脉冲,上升沿时数据有效O/STROBE1
描述方向信号名称引脚
周立功单片机
• 并行打印机 ——接口实例
不是必须的,使用
可以增加LPC2000
的安全性。选择
50~500欧姆
为保证输出的驱动
能力,数据口必须
增加长线驱动器
周立功单片机
• 并行打印机 ——炜煌热敏打印机
炜煌热敏打印机能在安静的打印环境里保持最小
的噪声,被广泛应用于医疗仪器或其它需要安静打印
的仪器上。高速打印、高分辨率的图象效果还能打印
出优美鲜明的轮廓甚至是清晰的品牌标志和条码,具
有较高的性价比。WH153具有面板式和平台式两种基
本形式,接口有并行和串行两种方式。
面板式微打 平台式微打
周立功单片机
• 并行打印机 ——炜煌热敏打印机
炜煌热敏打印机能在安静的打印环境里保持最小
的噪声,被广泛应用于医疗仪器或其它需要安静打印
的仪器上。高速打印、高分辨率的图象效果还能打印
出优美鲜明的轮廓甚至是清晰的品牌标志和条码,具
有较高的性价比。WH153具有面板式和平台式两种基
本形式,接口有并行和串行两种方式。
注:“A”表示面板式;“T”表示平台式。
串口24-48 / 9-1930mm/秒±-153WH153ST
串口24-48 / 9-1930mm/秒±-153WH153SA
并口24-48 / 9-1930mm/秒±-153WH153PT
并口24-48 / 9-1930mm/秒±-153WH153PA
接口每行字符数(5×7)/ 汉字数(16×16)打印速度
每行
点数纸宽/mm打印头型 号
炜煌微型打印机产品列表
周立功单片机
• 并行打印机 ——炜煌热敏打印机
WH系列打印机的并行接口与标准并行接口
CENTRONICS兼容,并行连接方式的面板式和平台
式插座引脚序号如下图所示。
周立功单片机
• 并行打印机 ——炜煌热敏打印机
接地,逻辑“0”电平。—GND25-1810-24
空脚。14,16,172,6,8,26
打印机内部经电阻上拉“高”电平,表示无故障。出-ERR154
打印机内部经电阻上拉“高”电平,表示打印机在线。出SEL1325
接地。—PE23
“高”电平表示打印机正“忙”,不能接收数据。出BUSY1121
回答脉冲,“低”电平表示数据已被接受而且打印机准
备好接收下一数据。
出-ACK1019
并行数据第1位,当其逻辑为“1”时为“高”电平。入DATA123
数据选通触发脉冲,上升沿时读入数据。入-STB11
说 明方向信 号平台式引脚面板式引脚
周立功单片机
• 并行打印机 ——炜煌热敏打印机
WHxxxSx型打印机的串行接口与RS-232C标准兼
容,因此可直接将打印机与IBM PC相接。串行接口方
式的面板式和平台式插座引脚序号如下图所示。
可以利用LPC2000的UART1与该打印机接口,WH
系列打印机的串行接口所需要的信号在UART1上均存
在,只要把这些信号通过232电平转换后一一对应地连
接到串行打印机上即可。
周立功单片机
• 并行打印机 ——炜煌热敏打印机
直流+5V 3A电源输入端出+5V--10
信号CTS出DCD811
信号地—GND759
该信号为“SPACE”状态表示打印机“在线”出DSR662
该信号高电平时,表示打印机正“忙”不能
接受数据,而当该信号低电平时,表示打
印机“准备好”,可以接收数据
出CTS586
打印机从主计算机接收数据入TxD235
说明方向信号平台式9孔面板式10针面板式
周立功单片机
CF卡是一种大容量存储设备,目前已广泛应用在
数码相机、PDA、MP3、工控机等嵌入式系统中。CF
卡有PC卡I/O、MEMORY 及True IDE等3种模式,而
True IDE模式兼容IDE硬盘,该模式比其它的两种模式
更实用,是3种模式中使用较多的一种。所以只介绍
CF卡在True IDE模式下的接口。
• CF卡及IDE硬盘接口 ——概述
256MB CF卡 5GB硬盘CF卡
周立功单片机
• CF卡及IDE硬盘接口 ——引脚设定及类型
I-IORD34IA03217
GND50O-VS133IA04216
I/OD10149I-CS1132IA05215
I/OD09148I/OD15131IA06214
I/OD08147I/OD14130VCC13
O-PDIAG46I/OD13129IA07212
O-DASP45I/OD12128IA08211
IRFU444I/OD11127IA09210
ORFU43O-CD126I-ATASEL9
OIORDY42O-CD225IA1028
I-RESET41O-IOCS1624I-CS07
O-VS240I/OD0223I/OD076
I-CSEL39I/OD0122I/OD065
VCC38I/OD0021I/OD054
OINTRQ37IA0020I/OD043
I-WE336IA0119I/OD032
I-IOWR35IA0218GND1
类型信号名称Pin号类型信号名称Pin号类型信号名称Pin号
周立功单片机I-IORD34IA03217
GND50O-VS133IA04216
I/OD10149I-CS1132IA05215
I/OD09148I/OD15131IA06214
I/OD08147I/OD14130VCC13
O-PDIAG46I/OD13129IA07212
O-DASP45I/OD12128IA08211
IRFU444I/OD11127IA09210
ORFU43O-CD126I-ATASEL9
OIORDY42O-CD225IA1028
I-RESET41O-IOCS1624I-CS07
O-VS240I/OD0223I/OD076
I-CSEL39I/OD0122I/OD065
VCC38I/OD0021I/OD054
OINTRQ37IA0020I/OD043
I-WE336IA0119I/OD032
I-IOWR35IA0218GND1
类型信号名称Pin号类型信号名称Pin号类型信号名称Pin号
I-IORD34IA03217
GND50O-VS133IA04216
I/OD10149I-CS1132IA05215
I/OD09148I/OD15131IA06214
I/OD08147I/OD14130VCC13
O-PDIAG46I/OD13129IA07212
O-DASP45I/OD12128IA08211
IRFU444I/OD11127IA09210
ORFU43O-CD126I-ATASEL9
OIORDY42O-CD225IA1028
I-RESET41O-IOCS1624I-CS07
O-VS240I/OD0223I/OD076
I-CSEL39I/OD0122I/OD065
VCC38I/OD0021I/OD054
OINTRQ37IA0020I/OD043
I-WE336IA0119I/OD032
I-IOWR35IA0218GND1
类型信号名称Pin号类型信号名称Pin号类型信号名称Pin号
• CF卡及IDE硬盘接口 ——引脚设定及类型
主控器上的这些
信号应该接地 这些信号仅对16
位系统有用,在8
位系统中无效。
在主控器上将该引
脚接VCC,使该信
号线为高电平
在主控器上
这些信号与
VCC连接
周立功单片机
• CF卡及IDE硬盘接口 ——信号描述
当所有的数据通过 D[15:0]进行16位传输时,任务文件寄存器在总线
低位D[7:0]上以字节方式操作。
31,30,29,28,2
7,49,48,47,6,
5,4,3,2,23,22,
21
I/OD15-D00
卡内部该引脚上拉信号控制设备;当引脚接地,设备被配置为主模
式,当引脚为空,设备被配置为从模式。39I-CSEL
在True IDE模式下,当-CS1用来选择辅助状态寄存器及设备控制寄存
器,-CS0为任务文件寄存器的片选信号。7,32I-CS0,-CS1
CF存储卡及CF+卡上的这些卡检测引脚接地。他们被主控器用来检测
CF存储卡及CF+卡是否完全插进插槽。26,25O-CD1,-CD2
在True IDE模式下,磁盘启动/从盘就绪信号可通过主/从握手协议输
入/输出。45I/O-DASP
在IDE实模式下,诊断信号可通过主/从握手协议输入/输出。46I/O-PDIAG
在True IDE模式中,A[2:0]可用来选择Task File(任务文件)中8个寄
存器中的一个,其它的地址线应该被主控器设置为接地。18,19,20IA2-A0
描述引脚方向信号名
周立功单片机
在True IDE模式,当设备为一个字数据传输周期时,该输出信号为低。24O-IOIS16
在True IDE模式下,该输入信号无效,可通过主控器接VCC。36I-WE
在True IDE模式下,该输出信号可当作IORDY信号使用42O-IORDY
CF卡工作电压控测信号。-VS1接地,可使CF存储卡/CF+卡在
下被读取,-VS2保留。33,40O-VS1,-VS2
+5V,+电源。13,38-VCC
True IDE模式下,通过主控器,该输入引脚低电平复位。41I- RESET
该输入信号无效,应被置高或通过主控器连接至VCC。44I保留
在True IDE模式下,该信号线对主控器发出中断请求。37OINTRQ
为了使能True IDE模式,该输入信号线应被主控器接地。9I-ATA SEL
写CF卡寄存器信号引脚。35I-IOWR
读CF卡寄存器信号引脚。34I-IORD
在True IDE模式,该输出信号无效,无需与主控器连接。43O保留
Ground。1,50-GND
描述引脚方向信号名
• CF卡及IDE硬盘接口 ——信号描述
周立功单片机
• CF卡及IDE硬盘接口 ——设备寄存器地址
8位高柱面高柱面10101
8位选择卡/磁头选择卡/磁头01101
8位命令状态11101
8位设备控制Alt状态01110
8位低柱面低柱面00101
8位扇区号扇区号11001
8位扇区计数扇区计数01001
8位特征错误寄存器10001
8位或16位WR数据RD数据00001
Note-IOWR=0-IORD=0A00A01A02-CS0-CS1
在读写操作时,通过nCS1、nCS0、A02、A01和
A00引脚来控制目标寄存器。
周立功单片机
• CF卡及IDE硬盘接口 ——I/O时序图
t0
t1 t2
t3 t4
t5 t6t7
tA
tB tC
tR DtC
t6 z
t9 t8
t2 i
有 效 地 址
(A02,A01,A00,
-CS0,-CS1)
IORD/-IOWR
读 数
Data(D15:D00)
写 数
Data(D15:D00)
-IOCS16
IORDY
IORDY
IORDY
周立功单片机
CF卡可以在5V或下工作,当CF工作电源为5V时CF卡的
某些引脚要求输入的逻辑电平最小值为,而GPIO的输出电平
才,所示只能使用给CF卡供电。
由于寄存器的地址是由A00、A01、A02、-CS0和-CS1决定,
将它们都分配在P1口是为了简化编程;而数据总线D00-D15使用
~使用连续的GPIO,也是为了也编程方便;其它的I/O
引脚都没有特别的要求。
• CF卡及IDE硬盘接口
O-CS1-CS1*
OA02A02*
-DIOR-IORD*
-DIOW-IOWR*
O-CS0-CS0*
OA00A00* 、OD00~D15D00~D15*~
OA01A01*-RESET-RESET*
I/OIDE硬盘CF卡LPC2210I/OIDE硬盘CF卡LPC2210
——接口示例
LPC2200与CF卡及IDE硬盘连接引脚分配
周立功单片机
• CF卡及IDE硬盘接口 ——接口示例
LPC2200与CF卡接线图 LPC2200与IDE硬盘接线图
周立功单片机
周立功单片机
第7章 移植μC/OS-II到ARM7
周立功单片机
第7章 目录
�1. μC/OS-II简介
�2.移植规划
�3.移植μC/OS-II
�4.移植代码应用到LPC2000
周立功单片机
第7章 目录
�1. μC/OS-II简介
�2.移植规划
�3.移植μC/OS-II
�4.移植代码应用到LPC2000
周立功单片机
μC/OS-II简介
• 概述
μC/OS-II读做“micro C O S 2”,意为“微控制器操
作系统版本2”。μC/OS-II是源码公开的著名实时内
核,可用于各类8位、16位和32位单片机或DSP。从μ
C/OS算起,该内核已有10多年应用史,在诸多领域得
到广泛应用。
μC/OS-II是一个完整的、可移植、可固化、可剪
裁的占先式实时多任务内核。μC/OS-II使用ANSI C语
言编写,包含一小部分汇编代码,使之可以供不同架
构的微处理器使用。至今,从8位到64位,μC/OS-II
已在超过40种不同架构的微处理器上运行。
周立功单片机
• μC/OS-II特点
●提供源代码:购买作者撰写的《嵌入式实时操作系统μC/OS-II》
一书即可获得μC/OS-II 版本的所有源代码,购买此书的其它
版本可以获得相应版本的全部源代码。
●可移植性(portable):μC/OS-II的源代码绝大部分是使用移植性
很强的ANSI C写的,将与微处理器硬件相关的汇编语言使用量压缩
到最低的限度,以使μC/OS-II便于移植到其它微处理器上。目前,
μC/OS-II已经被移植到多种不同架构的微处理器上。
●可固化(ROMmable):只要具备合适的软硬件工具,就可以将μ
C/OS-II嵌入到产品中成为产品的一部分。
●可剪裁(scalable):μC/OS-II使用条件编译实现可剪裁,用户程序
可以只编译自己需要的(μC/OS-II的)功能,而不编译不要需要的
功能,以减少μC/OS-II对代码空间和数据空间的占用。
●可剥夺(preemptive):μC/OS-II是完全可剥夺型的实时内核,μ
C/OS-II总是运行就绪条件下优先级最高的任务。
周立功单片机
• μC/OS-II特点
●多任务:μC/OS-II可以管理64个任务,然而,μC/OS-II的作者建
议用户保留8个给μC/OS-II。这样,留给用户的应用程序最多可有56
个任务。
●可确定性:绝大多数μC/OS-II的函数调用和服务的执行时间具有
确定性,也就是说,用户总是能知道μC/OS-II的函数调用与服务执
行了多长时间。
●任务栈:μC/OS-II的每个任务都有自己单独的栈,使用μC/OS-II
的占空间校验函数,可确定每个任务到底需要多少栈空间。
●系统服务:μC/OS-II提供很多系统服务,例如信号量、互斥信号
量、时间标志、消息邮箱、消息队列、块大小固定的内存的申请与
释放及时间管理函数等。
●中断管理:中断可以使正在执行的任务暂时挂起,如果优先级更
高的任务被中断唤醒,则高优先级的任务在中断嵌套全部退出后立
即执行,中断嵌套层数可达255层。
周立功单片机
• μC/OS-II特点
●稳定性与可靠性:μC/OS-II是μC/OS的升级版,μC/OS自1992
年以来已经有数百个商业应用。μC/OS-II与μC/OS的内核是一样
的,只是提供了更多的功能。2000年7月,μC/OS-II在一个航空项
目中得到了美国联邦航空管理局对商用飞机的、符合RTCA DO –
178B标准的认证。这表明,该操作系统的质量得到了认证,可以
在任何应用中使用。
作
者
及
其
著
作
周立功单片机
第7章 目录
�1. μC/OS-II简介
�2.移植规划
�3.移植μC/OS-II
�4.移植代码应用到LPC2000
周立功单片机
移植规划
• 概述
所谓“移植”,就是使一个实时内核能在其它的微
处理器或微控制器上运行。
尽管大部分μC/OS-II的代码是用C语言编写的,
但是在编写与处理器硬件相关的代码时还是不得不使
用汇编语言。移植的主要工作就是编写这些与处理器
硬件相关的代码。
在移植前针对所使用的微处理器进行规划,主要
有以下几个方面的考虑:编译器的选择、任务模式的
选择和支持的指令集。
周立功单片机
• μC/OS-II移植
应用程序
(用户代码)
μC/OS-II
(与处理器无关代码)
...
μC/OS-II配置
(与应用无关)
μC/OS-II移植
(与处理器相关代码)
CPU 定时器
硬件
软件
——μC/OS-II硬件软件体系结构
用于产生
系统时钟
移植时需要
编写的代码
周立功单片机
移植规划
• 编译器的选择
目前,针对ARM处理器核的C语言编译器有很
多,如SDT、ADS、IAR、TASKING和GCC等。据了
解,目前在国内最流行的是ADS、SDT和GCC。SDT
和ADS均为ARM公司自己开发,ADS为SDT的升级
版,以后ARM公司不再支持SDT,所以不会选择SDT。
GCC虽然支持广泛,很多开发套件使用它作为编译
器,但是与ADS比较其编译效率较低,这对充分发挥
芯片性能很不利,所以最终使用ADS编译程序和调试。
周立功单片机
移植规划
• 任务模式的取舍
ARM7处理器核具有用户、系统、管理、中止、
未定义、中断和快中断七种模式,其中除用户模式外
其它均为特权模式。其中管理、中止、未定义、中断
和快中断模式与相应异常相联系,任务使用这些模式
不太适合。而系统模式除了是特权模式外,其它与用
户模式一样,因而可选为任务使用的模式只有用户模
式和系统模式。为了尽量减少任务代码错误对整个程
序的影响,缺省的任务模式定为用户模式,可选为系
统模式,同时提供接口使任务可以在这两种模式间切
换。
周立功单片机
移植规划
• 支持的指令集
带T变量的ARM7处理器核具有两个指令集(可以
参考第3章 ):标准32位ARM指令集和16位Thumb指
令集,两种指令集有不同的应用范围。为了最大限度
地支持芯片的特性,任务应当可以使用任意一个指令
集并可以自由切换,而且不同的任务应当可以使用不
同的指令集,这次移植的代码已经实现了这一点。
周立功单片机
第7章 目录
�1. μC/OS-II简介
�2.移植规划
�3.移植μC/OS-II
�4.移植代码应用到LPC2000
周立功单片机
移植μC/OS-II
• 概述
要移植一个操作系统到一个特定的CPU体系结构
上并不是一件很容易的事情,它对移植者有以下要求:
1. 对目标体系结构要有很深了解;
2. 对OS原理要有较深入的了解;
3. 对所使用的编译器要有较深入的了解;
4. 对需要移植的操作系统要有相当的了解;
5. 对具体使用的芯片也要一定的了解。
周立功单片机
要移植一个操作系统到一个特定的CPU体系结构
上并不是一件很容易的事情,它对移植者有以下要求:
1. 对目标体系结构要有很深了解;
2. 对OS原理要有较深入的了解;
3. 对所使用的编译器要有较深入的了解;
4. 对需要移植的操作系统要有相当的了解;
5. 对具体使用的芯片也要一定的了解。
• 概述
要移植一个操作系统到一个特定的CPU体系结构
上并不是一件很容易的事情,它对移植者有以下要求:
1. 对目标体系结构要有很深了解;
2. 对OS原理要有较深入的了解;
3. 对所使用的编译器要有较深入的了解;
4. 对需要移植的操作系统要有相当的了解;
5. 对具体使用的芯片也要一定的了解。
参考ARM公司的《ARM体系结构》文档
参考《嵌入式实时操作系统μC/OS-II 》一书
参考ADS软件自带的编译器和连接器手册
参考《嵌入式实时操作系统μC/OS-II 》一书
参考具体芯片的数据手册和使用手册
因为第4点的影响是全局性的,它决定移植代码的框架和功能。
所以重点介绍第4点。
周立功单片机
• 概述
根据μC/OS-II的要求,移植μC/OS-II到一个新的
体系结构上需要提供2个或3个文件:
(C语言头文件)
(C程序源文件)
(汇编程序源文件)
其中在某些情况下不需要,但极
其罕见。不需要的必须满足以下苛
刻条件,而同时满足这些条件的微控制器几乎没有:
1.可以直接使用C语言开关中断;
2.可以直接使用C语言编写中断服务程序;
3.可以直接使用C语言操作堆栈指针;
4.可以直接使用C语言保存CPU的所有寄存器。
——移植需要编写的文件
周立功单片机
• 概述
时钟节拍中断服务程序*中断服务程序OSTickISR()
中断退出时的任务切换函数*函数OSIntCtxSw()
进入多任务环境时运行优先
级最高的任务,
*
M函数OSStartHighRdy()
μC/OS-II在执行某些操作时
调用的用户函数,一般为空函数
OSInitHookBegin()、
OSInitHookEnd()、
…
任务堆栈初始化函数函数OSTaskStkInit()
任务切换时执行的代码函数OS_TASK_SW
定义堆栈的增长方向常量OS_STK_GROWTH
开关中断的代码宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()
堆栈的数据类型数据类型OS_STK
与编译器无关的数据类型数据类型BOOLEAN、INT8U、INT8S、…
描述所属文件类型移植内容
实际上,还有一个文件很重要,它就是,它定义了一个汇编宏,
它是μC/OS-II for ARM7通用的中断服务程序的汇编与C函数接口代码。时钟
节拍中断服务程序也没有移植,因为其与芯片和应用都强烈相关,需要用户自
己编写,不过可以通过简化用户代码的编写。
——移植代码包括的内容
周立功单片机
• 关于头文件和
μC/OS-II要求所有.C文件的都要包含都文件,这样
使得用户项目中的每个.C文件不用分别去考虑它实际上需要哪些
头文件。使用的缺点是它可能会包含一些实际不相
关的头文件,这意味着每个文件的编译时间可能会增加,但却增
强了代码的可移植性。
在本移植中另外增加了一个头文件,我们要求所有用
户程序必须包含,在中包含和特定的头
文件和配置项。而μC/OS-II的系统文件依然只是包含,
即μC/OS-II的系统文件完全不必改动。所有的配置改变包括头文
件的增减均在中进行,而定下来后不必改动(μ
C/OS-II的系统文件需要包含的东西是固定的)。这样,μC/OS-
II的系统文件需要编译的次数大大减少,编译时间随之减少。
UCOS内核文件
用户程序
周立功单片机
• 编写
μCOS-II不使用C语言中的short、int、long等数据类型的定
义,因为它们与处理器类型有关,隐含着不可移植性。代之以移
植性强的整数数据类型,这样,既直观又可移植,不过这就成了
必须移植的代码。根据ADS编译器的特性,这些代码如程序清单
所示。
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U;
typedef signed char INT8S;
typedef unsigned short INT16U;
typedef signed short INT16S;
typedef unsigned int INT32U;
typedef signed int INT32S;
typedef float FP32;
typedef double FP64;
typedef INT32U OS_STK;
——不依赖于编译的数据类型
周立功单片机
• 编写
μCOS-II运行时,处理器可能处于的状态如下图所示:
——使用软中断SWI作底层接口
Thumb指令集ARM指令集
用户模式
系统模式
用户任务使用
的处理器模式
ARM7内核具有的指令集
ARM指令
用户模式
ARM指令
系统模式
Thumb指令
系统模式
Thumb指令
用户模式
周立功单片机
• 编写
为了使底层接口函数与处理器状态无关,同时在任务调用
相应的函数不需要知道函数位置,本移植使用软中断指令SWI
作为底层接口,使用不同的功能号区分不同的函数。软中断功
能号分配如下表所示,未列出的为保留功能。
——使用软中断SWI作底层接口
任务代码是ARM代码Void TaskIsARM(INT8U prio)0x82
任务切换到系统模式Void ChangeToSYSMode(void)0x80
任务切换到用户模式Void ChangeToUSRMode(void)0x81
任务代码是THUMB代码Void TaskIsTHUMB(INT8U prio)0x83
开中断Void OS_EXIT_CRITICAL(void)0x03
关中断void
OS_ENTER_CRITICAL(void)
0x02
运行优先级最高的任务,由OSStartHighRdy产
生
_OSStartHighRdy(void)0x01
任务级任务切换函数void OS_TASK_SW(void)0x00
简介接口函数功能号
周立功单片机
• 编写
用软中断作为操作系统的底层接口就需要在C语言中使用
SWI指令。在ADS中,有一个关键字__swi,用它声明一个不存
在的函数,则调用这个函数就在调用这个函数的地方插入一条
SWI指令,并且可以指定功能号。同时,这个函数也可以有参
数和返回值,其传递规则与一般函数一样。
——使用软中断SWI作底层接口
/* 任务级任务切换函数 */
__swi(0x00) void OS_TASK_SW(void);
/* 运行优先级最高的任务 */
__swi(0x01) void _OSStartHighRdy(void);
/* 关中断 */
__swi(0x02) void OS_ENTER_CRITICAL(void);
/* 开中断 */
__swi(0x03) void OS_EXIT_CRITICAL(void);
/* 任务切换到系统模式 */
__swi(0x80) void ChangeToSYSMode(void);
/* 任务切换到用户模式 */
__swi(0x81) void ChangeToUSRMode(void);
/* 任务代码是ARM代码 */
__swi(0x82) void TaskIsARM(INT8U prio);
/* 任务代码是THUMB代码 */
__swi(0x83) void TaskIsTHUMB(INT8U prio);
程序中调用软
中断时使用的
函数名
软件中断号
该调用不返
回参数
周立功单片机
• 编写
μCOS-II使用结构常量OS_STK_GROWTH中指定堆栈的
生长方式:
置OS_STK_GROWTH为0表示堆栈从下往上长。
置OS_STK_GROWTH为1表示堆栈从上往下长。
虽然ARM处理器核对于两种方式均支持,但ADS的C语言
编译器仅支持一种方式,即从上往下长,并且必须是满递减堆
栈,所以OS_STK_GROWTH的值为1。
#define OS_STK_GROWTH 1
——堆栈生长方式
周立功单片机
• 编写
该函数用于初始化任务堆栈,使任务的堆栈看起来就像刚
发生中断一样。即任务被执行时,就像从中断返回一样。
在编写此函数之前,必须先确定任务的堆栈结构。而任务
的堆栈结构是与CPU的体系结构、编译器有密切的关联。本移
植的堆栈结构如下图所示。
——OSTaskStkInit( )
任务入栈的
其它数据
LR
R12
R11
R10
R9
R8
...
栈底
任务环境开始
SP
PC
R2
R1
R0
OSEnterSum
空闲空间
周立功单片机
• 编写——OSTaskStkInit( )
OS_STK *OSTaskStkInit (void (*task)(void
*pd), void *pdata, OS_STK *ptos, INT16U opt)
{
OS_STK *stk;
opt = opt;
stk = ptos;
*stk = (OS_STK) task;
*--stk = (OS_STK) task;
*--stk = 0;
*--stk = 0;
*--stk = 0;
*--stk = 0;
*--stk = 0;
*--stk = 0;
*--stk = 0;
*--stk = 0;
*--stk = 0;
*--stk = 0;
*--stk = 0;
*--stk = 0;
*--stk = (unsigned int) pdata;
*--stk = (USER_USING_MODE|0x00);
*--stk = 0;
return (stk);
}
入栈的数据
任务入栈的
其它数据
LR
R12
R11
R10
R9
R8
...
栈底
任务环境开始
SP
PC
R2
R1
R0
OSEnterSum
空闲空间
周立功单片机
• 编写——OSTaskStkInit( )
OS_STK *OSTaskStkInit (void (*task)(void
*pd), void *pdata, OS_STK *ptos, INT16U opt)
{
OS_STK *stk;
opt = opt;
stk = ptos;
*stk = (OS_STK) task;
*--stk = (OS_STK) task;
*--stk = 0;
*--stk = 0;
*--stk = 0;
*--stk = 0;
*--stk = 0;
*--stk = 0;
*--stk = 0;
*--stk = 0;
*--stk = 0;
*--stk = 0;
*--stk = 0;
*--stk = 0;
*--stk = (unsigned int) pdata;
*--stk = (USER_USING_MODE|0x00);
*--stk = 0;
return (stk);
}
该数据比较特别,它用于保存该任务关中断的次
数,它在调用OS_ENTER_CRITICAL( )时加1,在调用
OS_EXIT_CRITICAL( )时减1。
这样每个任务都可以独立控制本任务的中断允许状
态,而不会影响其它任务的中断允许状态。因此关中断
和开中断就可以嵌套。
周立功单片机
• 编写——软件中断异常服务程序
前面介绍过,操作系统与硬件相关的底层函数使用软件中
断作为接口,如下表所示。移植代码中一个重要的工作就是为
这些软件中断编写服务程序。
任务代码是ARM代码Void TaskIsARM(INT8U prio)0x82
任务切换到系统模式Void ChangeToSYSMode(void)0x80
任务切换到用户模式Void ChangeToUSRMode(void)0x81
任务代码是THUMB代码Void TaskIsTHUMB(INT8U prio)0x83
开中断Void OS_EXIT_CRITICAL(void)0x03
关中断void
OS_ENTER_CRITICAL(void)
0x02
运行优先级最高的任务,由OSStartHighRdy产
生
_OSStartHighRdy(void)0x01
任务级任务切换函数void OS_TASK_SW(void)0x00
简介接口函数功能号
周立功单片机
• 编写——软件中断异常服务程序
任务代码是ARM代码0x82
任务切换到系统模式0x80
任务切换到用户模式0x81
任务代码是THUMB代码0x83
开中断0x03
关中断0x02
运行优先级最高的任务,由
OSStartHighRdy产生
0x01
任务级任务切换函数0x00
简介功能号
任务代码是ARM代码Void TaskIsARM(INT8U prio)0x82
任务切换到系统模式Void ChangeToSYSMode(void)0x80
任务切换到用户模式Void ChangeToUSRMode(void)0x81
任务代码是THUMB代码Void TaskIsTHUMB(INT8U prio)0x83
开中断Void OS_EXIT_CRITICAL(void)0x03
关中断void
OS_ENTER_CRITICAL(void)
0x02
运行优先级最高的任务,由OSStartHighRdy产
生
_OSStartHighRdy(void)0x01
任务级任务切换函数void OS_TASK_SW(void)0x00
简介接口函数功能号
void SWI_Exception(int SWI_Num, int *Regs)
{
OS_TCB *ptcb;
switch(SWI_Num)
{
case 0x02: // 关中断
...
case 0x03: // 开中断
...
case 0x80: // 任务切换到系统模式
...
case 0x81: // 任务切换到用户模式
...
case 0x82: // 任务代码是ARM代码
...
case 0x83: // 任务代码是Thumb代码
...
default:
}
}
这两个软件中断使
用汇编代码完成
周立功单片机
• 编写——软件中断异常服务程序
任务代码是ARM代码0x82
任务切换到系统模式0x80
任务切换到用户模式0x81
任务代码是THUMB代码0x83
开中断0x03
关中断0x02
运行优先级最高的任务,由
OSStartHighRdy产生
0x01
任务级任务切换函数0x00
简介功能号 μC/OS-II的启动多任务环境的
函数叫做OSStart(),用户在调用
OSStart()之前,必须已经建立了一个
或更多任务。OSStart()最终调用函数
OSStartHighRdy()运行多任务启动前
优先级最高的任务。
void OSStartHighRdy(void)
{
_OSStartHighRdy();
}
该函数在文件中实现。
周立功单片机
• 编写——软件中断异常服务程序
任务代码是ARM代码0x82
任务切换到系统模式0x80
任务切换到用户模式0x81
任务代码是THUMB代码0x83
开中断0x03
关中断0x02
运行优先级最高的任务,由
OSStartHighRdy产生
0x01
任务级任务切换函数0x00
简介功能号 关中断和开中断是为了保护临界
段代码。这些代码与处理器有关,是
需要移植的代码。在ARM处理器核
中关中断和开中断时通过改变程序状
态寄存器CPSR中的相应控制位实现。
由于使用了软件中断,程序状态寄存
器CPSR保存到程序状态保存寄存器
SPSR中,软件中断退出时会将SPSR
恢复到CPSR中,所以程序只要改变
程序状态保存寄存器SPSR中的相应
的控制位就可以了。
周立功单片机
• 编写——软件中断异常服务程序
任务代码是ARM代码0x82
任务切换到系统模式0x80
任务切换到用户模式0x81
任务代码是THUMB代码0x83
开中断0x03
关中断0x02
运行优先级最高的任务,由
OSStartHighRdy产生
0x01
任务级任务切换函数0x00
简介功能号
void SWI_Exception(int SWI_Num, int *Regs)
{
...
case 0x02: // 关中断
__asm
{
MRS R0,SPSR
ORR R0,R0,#NoInt
MSR SPSR_c,R0
}
OsEnterSum++;
break;
case 0x03: // 开中断
if (--OsEnterSum == 0)
{
__asm
{
MRS R0,SPSR
BIC R0,R0,#NoInt
MSR SPSR_c,R0
}
}
break;
...
每关闭一次中断,
中断关闭计数器加1
每调用一次开中断函
数,该计数器减1,为
0时允许打开中断
关闭中断
打开中断
周立功单片机
• 编写——软件中断异常服务程序
任务代码是ARM代码0x82
任务切换到系统模式0x80
任务切换到用户模式0x81
任务代码是THUMB代码0x83
开中断0x03
关中断0x02
运行优先级最高的任务,由
OSStartHighRdy产生
0x01
任务级任务切换函数0x00
简介功能号
它们可以在任何情况下使用。它
们改变程序状态保留寄存器SPSR的相
应位段,而程序状态保留寄存器会在
软件中断退出时复制到程序状态寄存
器CPSR,任务的处理器模式就改变
了。
周立功单片机
• 编写——软件中断异常服务程序
任务代码是ARM代码0x82
任务切换到系统模式0x80
任务切换到用户模式0x81
任务代码是THUMB代码0x83
开中断0x03
关中断0x02
运行优先级最高的任务,由
OSStartHighRdy产生
0x01
任务级任务切换函数0x00
简介功能号
void SWI_Exception(int SWI_Num, int *Regs)
{
...
case 0x80: // 任务切换到系统模式
__asm
{
MRS R0,SPSR
BIC R0,R0,#0x1f
ORR R0,R0,#SYS32Mode
MSR SPSR_c,R0
}
break;
case 0x81: // 任务切换到用户模式
__asm
{
MRS R0,SPSR
BIC R0,R0,#0x1f
ORR R0,R0,#USR32Mode
MSR SPSR_c,R0
}
break;
...
使用内嵌汇编将处理器模式切换到
用户模式
使用内嵌汇编将处理器模式切换到
系统模式
周立功单片机
• 编写——软件中断异常服务程序
任务代码是ARM代码0x82
任务切换到系统模式0x80
任务切换到用户模式0x81
任务代码是THUMB代码0x83
开中断0x03
关中断0x02
运行优先级最高的任务,由
OSStartHighRdy产生
0x01
任务级任务切换函数0x00
简介功能号
任务可以使用ARM的两种指令集的
任意一种运行,但是任务建立时默认的
只是一种指令集。如果任务使用的第一
条指令与默认的指令集不同,则程序运
行错误。所以增加两个函数TaskIsARM()
和TaskIsTHUMB()用于改变任务建立时
默认的指令集。
它们都有唯一的参数:需要改变的
任务的优先级,值得注意的是,这两个
函数必须在相应的任务建立后但还没有
运行时调用。
周立功单片机
• 编写——软件中断异常服务程序
任务代码是ARM代码0x82
任务切换到系统模式0x80
任务切换到用户模式0x81
任务代码是THUMB代码0x83
开中断0x03
关中断0x02
运行优先级最高的任务,由
OSStartHighRdy产生
0x01
任务级任务切换函数0x00
简介功能号
...
case 0x82: // 任务代码是ARM代码
if (Regs[0] <= OS_LOWEST_PRIO)
{
ptcb = OSTCBPrioTbl[Regs[0]];
if (ptcb != NULL)
{
ptcb -> OSTCBStkPtr[1] &=
~(1 << 5);
}
}
break;
case 0x83: // 任务代码是Thumb代码
if (Regs[0] <= OS_LOWEST_PRIO)
{
ptcb = OSTCBPrioTbl[Regs[0]];
if (ptcb != NULL)
{
ptcb -> OSTCBStkPtr[1] |=
(1 << 5);
}
}
break;
...
被设置的任务号一定不
能大于最低优先级任务
获取指定任务的任务控
制块的地址
修改任务堆栈中CPSR的值,
在任务重新运行时,切换到
ARM指令方式
修改任务堆栈中CPSR的值,
在任务重新运行时,切换到
Thumb指令方式
周立功单片机
• 编写——软件中断异常服务程序
任务代码是ARM代码0x82
任务切换到系统模式0x80
任务切换到用户模式0x81
任务代码是THUMB代码0x83
开中断0x03
关中断0x02
运行优先级最高的任务,由
OSStartHighRdy产生
0x01
任务级任务切换函数0x00
简介功能号
注意:
这两个函数必须在相应的任务建立后但
还没有运行时调用。
如果在低优先级的任务中创建高优先级
的任务就十分危险了。此时,解决的方法有
三种:
(1)高优先级任务使用默认的指令集;
(2)改变函数OSTaskCreateHook()使任务
默认不是处于就绪状态,建立任务后调用函
数OSTaskResume()来使任务进入就绪状
态;
(3)建立任务时禁止任务切换,调用函数
TaskIsARM()或TaskIsTHUMB()后再允许
任务切换。
周立功单片机
• 编写
在文件中还有许多钩子函数,它们在某个特定
的系统动作时被调用,允许执行函数中的用户代码。这些函数
默认是空函数,用户根据实际情况添加相关代码。它们分别如
下表所示。
——…Hook( )函数
在建立所有的TCB后,由OSTCBInit函数调用OSTCBInitHook( )
每个时钟节拍产生后被调用OSTimeTickHook( )
由空闲任务调用OSTaskIdleHook( )
被统计任务调用,每秒执行一次OSTaskStatHook( )
在进行任务切换时被调用OSTaskSwHook( )
在任务删除时被调用OSTaskDelHook( )
在任务建立时被调用OSTaskCreateHook( )
在OSInit()函数结束时被执行OSInitHookEnd( )
在开始执行OSInit( )函数时被执行OSInitHookBegin( )
被执行条件函数名
周立功单片机
移植μC/OS-II
• 编写
在文件中有软件中断的汇编接口程序、
任务切换程序、OS启动时运行就绪最高优先级任务的
程序。
周立功单片机
• 编写
在调用软中断之后,处理器切换到ARM指令和管理模式下
工作。在执行软件中断服务函数之前,要提取中断号和其它入
口参数,这些通过软件中断接口程序完成。
——软件中断汇编接口
SoftwareInterrupt
LDR SP, StackSvc
STMFD SP!, {R0-R3, R12, LR}
MOV R1, SP
MRS R3, SPSR
TST R3, #T_bit
LDRNEH R0, [LR,#-2]
BICNE R0, R0, #0xff00
LDREQ R0, [LR,#-4]
BICEQ R0, R0, #0xFF000000
CMP R0, #1
LDRLO PC, =OSIntCtxSw
LDREQ PC, =__OSStartHighRdy
BL SWI_Exception
LDMFD SP!, {R0-R3, R12, PC}^
保护被中断的现场
将要用到的寄存器压栈
判断中断前的指令集类型
从产生软件中断
的指令中提取
中断号
ARM
Thumb
根据不同的中断号执
行不同的程序
返回被中断的任务软件中断服务函数其它
启动多任务环境,运
行就绪的最高优先级
任务
1
进行任务切换0
执行程序中断号
周立功单片机
• 编写
μCOS-II是抢占式实时操作系统,得到运行的始终是就绪
条件下最高优先级的任务。当处于运行状态的任务因为某种脱
离就绪态,或者有其它更高优先级的任务进入就绪态,那么操
作系统内核就要运行别的就绪任务,这时需要进行任务切换。
任务切换可能发生的情况有两种:
1.当前运行的任务主动交出CPU控制权,通常发生在等待
某个事件或是调用系统延时。调用函数OS_TASK_SW( );
2.发生中断,使更高优先级的任务进入就绪状态,内核剥
夺当前任务的运行资格。即发生在中断退出时。调用函数
OSIntCtxSw( )。
——任务切换代码
周立功单片机
• 编写
虽然OS_TASK_SW( )和OSIntCtxSw( )的执行条件不同,但
是它们的功能相同,只要稍作处理就可以它们共用一段任务切
换代码。这些处理就是保证在执行任务切换前两者的任务现场
是一致的。共同执行的任务切换代码是“OSIntCtxSw”
其中OS_TASK_SW( )是通过软件中断0完成的,通过前面
的分析,可以知道执行任务切换时的现场环境如下所示,同时
R3中保存着SPSR,它是任务中断前CPSR的备份。
——任务切换代码
任务入栈的
其它数据
LR
R12
R3
R2
R1
R0
空闲空间
栈底
任务环境开始
SP
周立功单片机
• 编写——OSIntCtxSw
保存当前任务的
寄存器组及其它
修改当前任务的
TCB堆栈指针
用将要运行任务的优先级和
TCB指针更新OSPrioHighRdy
和OSTCBCur
恢复新任务的寄存
器组及其它
运行新任务
流程图
周立功单片机
• 编写——OSIntCtxSw
保存当前任务的
寄存器组及其它
修改当前任务的
TCB堆栈指针
用将要运行任务的优先级和
TCB指针更新OSPrioHighRdy
和OSTCBCur
恢复新任务的寄存
器组及其它
运行新任务
流程图OSIntCtxSw
;下面为保存任务环境
LDR R2, [SP, #20] ;获取PC
LDR R12, [SP, #16] ;获取R12
MRS R0, CPSR
;保存LR,PC及R4-R12
MSR CPSR_c, #(NoInt | SYS32Mode)
MOV R1, LR
STMFD SP!, {R1-R2}
STMFD SP!, {R4-R12}
;获取R0-R3,并出栈R12和PC寄存器
MSR CPSR_c, R0
LDMFD SP!, {R4-R7}
ADD SP, SP, #8
;保存R0-R3
MSR CPSR_c, #(NoInt | SYS32Mode)
STMFD SP!, {R4-R7}
;获取OsEnterSum,并保存CPSR,OsEnterSum
LDR R1, =OsEnterSum
LDR R2, [R1]
STMFD SP!, {R2, R3}
...
PC
LR
R12
R11
R10
R9
R7
R5
R4
R3
R2
R1
R0
R6
R8
CPSR
OSEnterSum
切换至系统模式获取
任务运行时的各寄存
器并将它们压栈
恢复之前的模式
读出压栈的数据
任务环境保存结束
后的栈结构
周立功单片机
• 编写——OSIntCtxSw
修改当前任务的
TCB堆栈指针
用将要运行任务的优先级和
TCB指针更新OSPrioHighRdy
和OSTCBCur
保存当前任务的
寄存器组及其它
恢复新任务的寄存
器组及其它
运行新任务
周立功单片机
OSIntCtxSw
...
;保存当前任务堆栈指针到当前任务的TCB
LDR R1, =OSTCBCur
LDR R1, [R1]
STR SP, [R1]
BL STaskSwHook ;调用钩子函数
;OSPrioCur <= OSPrioHighRdy
LDR R4, =OSPrioCur
LDR R5, =OSPrioHighRdy
LDRB R6, [R5]
STRB R6, [R4]
;OSTCBCur <= OSTCBHighRdy
LDR R6, =OSTCBHighRdy
LDR R6, [R6]
LDR R4, =OSTCBCur
STR R6, [R4]
...
• 编写——OSIntCtxSw
用即将运行任务
的TCB指针更新
OSTCBCur变量
用即将运行任务
的优先级更新
OSPrioCur变量
周立功单片机
• 编写——OSIntCtxSw
恢复新任务的寄存
器组及其它
运行新任务
保存当前任务的
寄存器组及其它
修改当前任务的
TCB堆栈指针
用将要运行任务的优先级和
TCB指针更新OSPrioHighRdy
和OSTCBCur
周立功单片机
OSIntCtxSw
...
OSIntCtxSw_1
;从R6指向TCB中获取新任务堆栈指针
LDR R4, [R6]
;调整堆栈指针
;17寄存器CPSR,OsEnterSum,R0-R12,LR,SP
ADD SP, R4, #68
LDR LR, [SP, #-8]
;进入管理模式,恢复任务的各寄存器和变量
MSR CPSR_c, #(NoInt | SVC32Mode)
MOV SP, R4 ;设置堆栈指针
;获取CPSR和OsEnterSum
LDMFD SP!, {R4, R5}
;恢复新任务的OsEnterSum
LDR R3, =OsEnterSum
STR R4, [R3]
;恢复CPSR
MSR SPSR_cxsf, R5
;运行新任务
LDMFD SP!, {R0-R12, LR, PC }^
• 编写——OSIntCtxSw
恢复新任务
的各寄存器
运行新任务
这段代码还被
__OSStartHighRdy
函数调用,用于启
动最高优先级的就
绪任务
周立功单片机
__OSStartHighRdy
MSR CPSR_c, #(NoInt | SYS32Mode)
;告诉uC/OS-II自身已经运行
LDR R4, =OSRunning
MOV R5, #1
STRB R5, [R4]
;调用钩子函数
BL OSTaskSwHook
LDR R6, =OSTCBHighRdy
;取得新任务的TCB指针
LDR R6, [R6]
B OSIntCtxSw_1
• 编写——OSStartHighRdy
μC/OS-II的多任务环境由函数OSStart( ) 启动。用户在调
用该函数之前,必须已经建立了一个或更多任务。OSStart()最
终调用函数OSStartHighRdy( )运行多任务启动前优先级最高的
任务,而它最终是调用__OSStartHighRdy实现的,其代码如下
所示:
周立功单片机
文件
• 编写
通过前面的分析,我们可以画出下面这张结构图:
中断退出时任务切换
xxx_Handlerxxx_Handlerxxx_Handlerxxx_Handler
任务级任务切换
OS_TASK_SW()OS_TASK_SW()OS_TASK_SW()OS_TASK_SW()
启动多任务
OSStartHighRdy()OSStartHighRdy()OSStartHighRdy()OSStartHighRdy()
OSIntCtxSwOSIntCtxSwOSIntCtxSwOSIntCtxSw _OSStartHighRdy_OSStartHighRdy_OSStartHighRdy_OSStartHighRdy
OSIntCtxSw_1OSIntCtxSw_1OSIntCtxSw_1OSIntCtxSw_1
周立功单片机
移植μC/OS-II
• 关于中断及时钟节拍
在本移植中,IRQ是受μC/OS-II管理的中断,而
对于FIQ不做处理,这是为了提高FIQ的响应速度。由
于各种ARM芯片的中断系统不一样,各个用户的目标
板也不一样,对于中断和时钟节拍是需要进一步移植
的代码。为此编写了一个汇编宏,它是μC/OS-II for
ARM7通用的中断服务程序的汇编与C函数接口代码。
注:在不受管理的中断服务程序中不能调用任何系统函数。
周立功单片机
• 关于中断及时钟节拍
流程图
保存当前任务的
寄存器组
中断嵌套数加1
切换到系统模式
执行中断服务程序
关中断
执行OSIntExit( )
切换到IRQ模式
判断是否需要进行
任务切换
切换任务或返回
周立功单片机
• 关于中断及时钟节拍
流程图
保存当前任务的
寄存器组
中断嵌套数加1
切换到系统模式
执行中断服务程序
关中断
执行OSIntExit( )
切换到IRQ模式
判断是否需要进行
任务切换
切换任务或返回
周立功单片机
MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function
EXPORT $IRQ_Label ; 输出的标号
IMPORT $IRQ_Exception_Function ; 引用的外部标号
$IRQ_Label
SUB LR, LR, #4 ; 计算返回地址
STMFD SP!, {R0-R3, R12, LR} ; 保存任务环境
MRS R3, SPSR ; 保存状态
; 保存用户状态的R3,SP,LR,不能回写
STMFD SP, {R3, SP, LR}^
LDR R2, =OSIntNesting
LDRB R1, [R2]
ADD R1, R1, #1
STRB R1, [R2]
SUB SP, SP, #4*3
; 切换到系统模式
MSR CPSR_c, #(NoInt | SYS32Mode)
CMP R1, #1
LDREQ SP, =StackUsr
...
• 关于中断及时钟节拍
中断嵌套层数加1
切换到系统模式,如果
是第一次中断还要设置
堆栈指针
压栈保存被中断任务的
运行环境
周立功单片机
• 关于中断及时钟节拍
流程图
保存当前任务的
寄存器组
中断嵌套数加1
切换到系统模式
执行中断服务程序
关中断
执行OSIntExit( )
切换到IRQ模式
判断是否需要进行
任务切换
切换任务或返回
中断服务程序
(ISR)
在ISR中可以
打开中断实
现中断嵌套
周立功单片机
MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function
EXPORT $IRQ_Label ; 输出的标号
IMPORT $IRQ_Exception_Function ; 引用的外部标号
$IRQ_Label
...
BL $IRQ_Exception_Function
; 切换到系统模式
MSR CPSR_c, #(NoInt | SYS32Mode)
; OsEnterSum,使OSIntExit退出时中断关闭
LDR R2, =OsEnterSum
MOV R1, #1
STR R1, [R2]
BL OSIntExit
; 因为中断服务程序要退出,所以OsEnterSum=0
LDR R2, =OsEnterSum
MOV R1, #0
STR R1, [R2]
; 切换回irq模式,并恢复用户状态的R3,SP,LR
MSR CPSR_c, #(NoInt | IRQ32Mode)
LDMFD SP, {R3, SP, LR}^ ; 注意不能回写
...
• 关于中断及时钟节拍
关闭中断
执行中断服务程序(ISR)
使OSEnterSum为1,防
止在OSIntExit函数中打
开中断
通知系统,中断退出
使OSEnterSum为0,
运行中断打开
恢复任务的R3、SP和
LR
周立功单片机
• 关于中断及时钟节拍
流程图
保存当前任务的
寄存器组
中断嵌套数加1
切换到系统模式
执行中断服务程序
关中断
执行OSIntExit( )
切换到IRQ模式
判断是否需要进行
任务切换
切换任务或返回
周立功单片机
MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function
EXPORT $IRQ_Label ; 输出的标号
IMPORT $IRQ_Exception_Function ; 引用的外部标号
$IRQ_Label
...
LDR R0, =OSTCBHighRdy
LDR R0, [R0]
LDR R1, =OSTCBCur
LDR R1, [R1]
CMP R0, R1
ADD SP, SP, #4*3
MSR SPSR_cxsf, R3
; 不进行任务切换
LDMEQFD SP!, {R0-R3, R12, PC}^
; 进行任务切换
LDR PC, =OSIntCtxSw
MEND
• 关于中断及时钟节拍
比较当前任务是否为就
绪的最高优先级任务,
如果不是则进行切换
设置堆栈指针和恢复
SPSR
进行任务切换或者恢复
执行被中断任务
周立功单片机
• 关于中断及时钟节拍
流程图
保存当前任务的
寄存器组
中断嵌套数加1
切换到系统模式
执行中断服务程序
关中断
执行OSIntExit( )
切换到IRQ模式
判断是否需要进行
任务切换
切换任务或返回
中断服务程序
(ISR)
在ISR中可以
打开中断实
现中断嵌套
周立功单片机
void ISR(void)
{
OS_ENTER_CRITICAL()或直接给变量OsEnterSum赋1;
清除中断源;
通知中断控制器中断结束:
开中断: OS_EXIT_CRITICAL();
用户处理程序;
}
• 中断服务程序的编写
因为中断发生时肯定是允许中断的,所以如果用户在清除
中断源之前调用μC/OS-II的系统服务函数就很可能会造成芯片
的中断系统工作异常而使程序工作异常。因此在函数开始处关
闭中断,或者直接给变量OSEnterSum赋1。如果用户程序没有
这种情况,则不需要这个操作。在执行OS_EXIT_CRITICAL( )
后,中断重新打开,如果在接下来的用户处理程序中发生中
断,就可以实现中断嵌套。
周立功单片机
第7章 目录
�1. μC/OS-II简介
�2.移植规划
�3.移植μC/OS-II
�4.移植代码应用到LPC2000
周立功单片机
移植代码应用到LPC2000
• 概述
在具体的项目中应用移植代码时,还需要做一些
工作,这是因为:
1.各种基于ARM7处理器核的芯片的硬件结构不
尽相同,所以需要编写部分启动代码(参看第5
章)。另外中断服务程序的编写方法也各不相同;
2.因为各个项目对资源的要求不一样,所以尽管使
用同一系列的芯片,其时钟节拍中断也可能使用不
同的中断实现。
周立功单片机
移植代码应用到LPC2000
• 概述
将μC/OS-II移植到LPC2000时,需要完成的工作主
要有以下几个部分:
� 编写或获取启动代码;
� 挂接SWI软件中断;
� 中断及时钟节拍中断;
� 编写应用程序。
注:其中“启动代码”已经在第5章中讲述。
周立功单片机
Reset
LDR PC,ResetAddr
LDR PC,UndefinedAddr
LDR PC,SWI_Addr
LDR PC,PrefetchAddr
LDR PC,DataAbortAddr
DCD 0xb9205f80
LDR PC,[PC, #-0xff0]
LDR PC,FIQ_Addr
ResetAddr DCD ResetInit
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
nouse DCD 0
IRQ_Addr DCD IRQ_Handler
FIQ_Addr DCD FIQ_Handler
• 挂接SWI软件中断
将软中断异常处理程序挂接到内核是通过修改启动代码中
的异常向量表实现, 代码如下所示:
发生软件中断
时跳转到软件
中断服务函数
周立功单片机
1.增加汇编接口的支持
方法是在文件中适当位置添加如下所示的代码,其中
xxx替换为自己需要的字符串。这样,汇编接口就完成了。
xxx_Handler HANDLER xxx_Exception
• 中断及时钟节拍中断
编写中断服务程序代码比较简单,按照小节( )
编写C语言处理函数即可。关键在于把程序与芯片的相关中断源挂
接,使芯片在产生相应的中断后会调用相应的处理程序。 这需要
做以下两个方面的工作:
周立功单片机
void ISR(void)
{
OS_ENTER_CRITICAL() 或直接给变量 OsEnterSum 赋 1;
清除中断源 ;
通知中断控制器中断结束:
开中断: OS_EXIT_CRITICAL();
用户处理程序 ;
}
• 中断服务程序的编写
因为中断发生时肯定是允许中断的,所以如果用户在清除
中断源之前调用 μC/OS - II 的系统服务函数就很可能会造成芯片
的中断系统工作异常而使程序工作异常。因此在函数开始处关
闭中断,或者直接给变量 OSE nterSum 赋1 。如果用户程序没有
这种情况,则不需要这个操作。在执行 OS_EXIT_CRITICAL( )
后,中断重新打开,如果在接下来的用户处理程序中发生中
断,就可以实现中断嵌套。
2.初始化向量中断控制器
//中断外设初始化;
VICVectAddrX = (uint32) xxx_Handler ;
VICVectCntlX = (0x20 | Y);
VICIntEnable = 1 << Y;
每个中断都
有自己的汇
编接口代码
将汇编接口代
码的入口设置
到向量中断
周立功单片机
• 编写应用程序
移植μC/OS-II是为了在自己的系统使用μC/OS-II。要在自己
的系统中使用μC/OS-II编写自己的应用程序就必须遵守μC/OS-II
的编程规范。主要包括主函数和用户任务,它们的关系如下。
Main
函数
初始化操作系统,
并建立空闲任务
创建根任务或更多
的任务
启动多任务环境
根任务
目标板初始化
(启动系统时钟)
创建其它的任务
执行任务循环
任务1
执行特定操作
执行任务循环
任务n
执行特定操作
执行任务循环
. . .
周立功单片机
• 编写应用程序
移植μC/OS-II是为了在自己的系统使用μC/OS-II。要在自己
的系统中使用μC/OS-II编写自己的应用程序就必须遵守μC/OS-II
的编程规范。主要包括主函数和用户任务,它们的关系如下。
Main
函数
初始化操作系统,
并建立空闲任务
创建根任务或更多
的任务
启动多任务环境
根任务
目标板初始化
(启动系统时钟)
创建其它的任务
执行任务循环
任务1
执行特定操作
执行任务循环
任务n
执行特定操作
执行任务循环
. . .
多任务共享
系统资源,
分时执行
多任务共享
系统资源,
分时执行
多任务共享
系统资源,
分时执行
多任务共享
系统资源,
分时执行
周立功单片机
• 编写应用程序
Main
函数
初始化操作系统,
并建立空闲任务
创建根任务或更多
的任务
启动多任务环境
移植μC/OS-II是为了在自己的系统使用μC/OS-II。要在自己
的系统中使用μC/OS-II编写自己的应用程序就必须遵守μC/OS-II
的编程规范。主要包括主函数和用户任务,它们的关系如下。
根任务
目标板初始化
(启动系统时钟)
创建其它的任务
执行任务循环
任务1
执行特定操作
执行任务循环
任务n
执行特定操作
执行任务循环
. . .
多任务共享
系统资源,
分时执行
多任务共享
系统资源,
分时执行
多任务共享
系统资源,
分时执行
多任务共享
系统资源,
分时执行
Main
函数
初始化操作系统,
并建立空闲任务
创建根任务或更多
的任务
启动多任务环境
#include ""
OS_STK TaskStartStk[TASK_STK_SIZE];
OS_STK TaskStk[TASK_STK_SIZE];
int main (void)
{
OSInit();
OSTaskCreate(Task1, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
OSStart();
return 0;
}
定义任务的堆栈
周立功单片机
• 编写应用程序
根任务
目标板初始化
(启动系统时钟)
创建其它的任务
执行任务循环
void Task1(void *pdata)
{
pdata = pdata; /* 避免编译警告 */
TargetInit(); /* 目标板初始化 */
for (;;)
{
OSTimeDly(OS_TICKS_PER_SEC / 50);
if (GetKey() != KEY1)
{
continue;
}
OSTimeDly(OS_TICKS_PER_SEC / 50);
if (GetKey() != KEY1)
{
continue;
}
OSTaskCreate(Task2, (void *)0,
&TaskStk[TASK_STK_SIZE - 1], 10);
while (GetKey() != 0)
{
OSTimeDly(OS_TICKS_PER_SEC / 50);
}
}
}
任务1
执行特定操作
执行任务循环
将该任务放在循环中创
建,是因为该任务执行
一次后会自行删除
周立功单片机
• 编写应用程序
任务1
执行特定操作
执行任务循环
根任务
目标板初始化
(启动系统时钟)
创建其它的任务
执行任务循环
void Task1(void *pdata)
{
pdata = pdata; /* 避免编译警告 */
TargetInit(); /* 目标板初始化 */
for (;;)
{
OSTimeDly(OS_TICKS_PER_SEC / 50);
if (GetKey() != KEY1)
{
continue;
}
OSTimeDly(OS_TICKS_PER_SEC / 50);
if (GetKey() != KEY1)
{
continue;
}
OSTaskCreate(Task2, (void *)0,
&TaskStk[TASK_STK_SIZE - 1], 10);
while (GetKey() != 0)
{
OSTimeDly(OS_TICKS_PER_SEC / 50);
}
}
}
将该任务放在循环中创
建,是因为该任务执行
一次后会自行删除
任务1
执行特定操作
执行任务循环
// 任务功能:鸣叫两声,然后删除自己
void Task2(void *pdata)
{
pdata = pdata; /* 避免编译警告 */
BeeMoo(); /* 使蜂鸣器鸣叫 */
/* 延时 */
OSTimeDly(OS_TICKS_PER_SEC / 8);
BeeNoMoo(); /* 使蜂鸣器停止鸣叫 */
OSTimeDly(OS_TICKS_PER_SEC / 4);
BeeMoo();
/* 延时 */
OSTimeDly(OS_TICKS_PER_SEC / 8);
BeeNoMoo(); /* 使蜂鸣器停止鸣叫 */
OSTaskDel(OS_PRIO_SELF); /* 删除自己 */
}
周立功单片机
周立功单片机
第8章 嵌入式系统开发平台
周立功单片机
第8章 目录
�1. 如何建立嵌入式系统开发平台
�2.数据队列
�3.串口驱动
�接口模块
�总线模块
�总线模块
�7.其它软件模块
周立功单片机
第8章 目录
�1. 如何建立嵌入式系统开发平台
�2.数据队列
�3.串口驱动
�接口模块
�总线模块
�总线模块
�7.其它软件模块
周立功单片机
如何建立嵌入式系统开发平
台
• 平台的概念
平台是一个意义很广泛的词,要准确的定义平台
不是件容易的事。在嵌入式系统中的开发平台具有如
下特点:
�层次性
�服务性
�规范性
�通用性
�技术密度
周立功单片机
• 平台的概念
平台是一个意义很广泛的词,要准确的定义平台
不是件容易的事。在嵌入式系统中的开发平台具有如
下特点:
�层次性
�服务性
�规范性
�通用性
�技术密度
平台是一个意义很广泛的词,要准确的定义平台
不是件容易的事。在嵌入式系统中的开发平台具有如
下特点:
�层次性
层次性首先表现在平台本身具有层次,高层的平台是以低层平
台为基础搭建起来的。还表现在每个层次的平台的内部还有层次性。
越高层次的平台越容易使用,对使用者的要求也就越低。
�服务性
平台是为应用服务的,没有应用的平台是无意义的,没有存在
的必要。对于元器件来说,线路板就是它的应用。而API是硬件平台
的应用,应用程序又是API的应用。
�规范性
�通用性
�技术密度
周立功单片机
• 平台的概念
平台是一个意义很广泛的词,要准确的定义平台
不是件容易的事。在嵌入式系统中的开发平台具有如
下特点:
�层次性
�服务性
�规范性
当一个平台建立起来后,其对应用的接口就具有一定的规范。
一个软件模块一旦开发完毕,其接口函数及使用方法就确定了,应
用程序就需要按照规范使用。
�通用性
平台从来不是给一个应用使用的。如果一个平台只能给一个应
用使用,作为平台来说,其设计是失败的(尽管其作为最终应用可
能是成功的)。这是平台的服务性决定的。
�技术密度
周立功单片机
• 平台的概念
平台是一个意义很广泛的词,要准确的定义平台
不是件容易的事。在嵌入式系统中的开发平台具有如
下特点:
�层次性
�服务性
�规范性
�通用性
�技术密度
平台特别是商业平台通常由相关领域的专家建立。这是因为往
往需要适应不同的应用的要求,所以其需要的技术含量是很高的。
周立功单片机
应用程序
应用程序
接口
电路板
元器件
• 平台的例子
a 1
1
a 2
2
3
a 3
4
a 4
b 1
b 2
b 3
b 4
5
6
7
8
Vcc1
0
a 1
1
a 2
2
3
a 3
4
a 4
b 1
b 2
b 3
b 4
5
6
7
8
a 1
1
a 2
2
3
a 3
4
a 4
b 1
b 2
b 3
b 4
5
6
7
8
G N D
0
A P I
O S 板 级
支 持
包
模 块
A
驱 动
程 序
模 块
B
驱 动
程 序
…
应 用 程 序
�层次性
�服务性
�规范性
�通用性
�技术密度
本章重点
介绍该层
周立功单片机
如何建立嵌入式系统开发平
台
• 使用平台开发的优势
应用程序接口这个嵌入式软件开发平台的提出和
应用是因为其能够解决当前及今后的嵌入式开发过程
中出现的一些矛盾。以下是使用嵌入式软件开发平台
(API)开发的优点:
�缩短开发时间
�降低对开发人员的要求
�降低开发成本
�增加稳定性和可靠性
�降低软件对硬件变化的敏感性
周立功单片机
• 不适合使用平台开发的场合
虽然使用平台开发有很多优点,但其也不是万能
的。有一些场合并不适合使用平台开发,这些场合主
要有以下几种:
�极大批量的产品
这种产品往往要求硬件成本和生产成本最低化。而使用平台开
发不可避免带来资源占用的增加,反映到硬件上就是成本的增加。
有时这种增加是不可接受的。这种情况不适合用平台开发。
�没有合适的平台但产品需要尽快上市时
开发平台是需要时间的,甚至比当前的项目的时间更长。但如
果后续有类似的产品,则还是建议开发者逐步建立起自己的开发平
台,这会对以后所有的项目带来好处。
�需要极度榨取硬件性能的场合
除了极大批量的产品需要极度榨取硬件性能外,估计只有科学
研究和一些一件一件制造的高价值产品(如巨型机)需要这样做
了,在普通的企业中应该不容易见到。
周立功单片机
• 建立开发平台的方法
1.选择操作系统
操作系统(OS)是一个基础的软件平台。因此,建立软件开发平台
(自己的API)首先需要选择一个合适的操作系统。操作系统的选择与应
用相关的,但对于嵌入式系统一般需要选择嵌入式操作系统。
2.制定API规范及应用程序编写规范
有了操作系统,就可以制订API规范和程序编写规范了。这些规范一
部分已经被操作系统规定好了,另一部分需要自己制订。建议这些规范
尽量靠近与已存在的事实标准,以减少学习时间。
3.获取成熟的软件模块并修改适合指定的规范
开发人员可以通过各种途径获取成熟的软件模块,还可以获取一些
商业和自由的软件模块。这些软件模块不一定适合自己的规范,这就需
要对这些软件模块进行进一步的修改或包装以适应自己的规范。
4.编写自己的软件模块
通过外部途径不一定能够获取所有必须的软件模块,此时就需要自
己编写软件模块了。
周立功单片机
• 编写自己的软件模块
因为开发平台基于操作系统,所以很可能多个任务
和/或同时访问同一个API函数。这就需要API函数必须
是可重入的。这里主要介绍如何使这些函数可重入,
和其它一些内容。
1.使用任务
2.禁止然后允许中断
3.使用信号量
4.使用数据队列
5.禁止然后允许任务调度
6.使用一个任务作为模块服务器
7.复合方法
周立功单片机
• 编写自己的软件模块
因为开发平台基于操作系统,所以很可能多个任务
和/或同时访问同一个API函数。这就需要API函数必须
是可重入的。这里主要介绍如何使这些函数可重入,
和其它一些内容。
1.使用任务
有一些设备需要CPU周期为其服务,典型的是扫描显示和扫描
键盘。可以给它们分配相应的任务,与用户任务一起调度。这样,
就可以使用任何任务间通信的方法实现。
键盘扫描
任务 显示任务用户任务
操作系统内核
通信 通信
周立功单片机
• 编写自己的软件模块
2.禁止然后允许中断
有一些设备需要的访问时间很短,如全局变量。它们可以通过
禁止中断——访问设备——允许中断的方式编写软件模块。
任务A
允许中断
禁止中断
中断服务函数
全局变量
周立功单片机
• 编写自己的软件模块
3.使用信号量
一些设备需要的访问时间比较长,使用方法2可能造成关中断时
间过长。此时可以使用信号量来编写软件模块。具体过程为申请信
号量——访问设备——发送信号量。
信号量
访问独享资
源之前申请
信号量
其它任务申请信
号量受阻,不能
访问独享资源
独
享
资
源
任务A
任务B
任务C
信号量
信号量申请成
功后,可以访
问独享资源
周立功单片机
• 编写自己的软件模块
4.使用数据队列
有一些设备具有自己的中断,典型的是串口输出。可以利用消
息队列将用户任务需要的服务通过消息队列排队、缓冲起来,利用
中断功能依次服务。
任务A
任务B
任务C
中断服务函数
数据队列
周立功单片机
• 编写自己的软件模块
5.禁止然后允许任务调度
当中断服务程序不可能访问这个资源时,可以使用本方法避免
实现函数重入。但是不推荐用户使用此方法。
任务A
允许任务切换
禁止任务切换
中断服务函数
独
享
资
源
周立功单片机
• 编写自己的软件模块
6.使用一个任务作为模块服务器
当一个软件模块十分复杂,使用上述方法难以保证API函数可
重入性时,或软件模块需要在单任务环境和多任务环境都能够使用
时,可以依照单任务的方式编写,然后编写一个任务作为服务器,
由这个服务器直接操作这个软件模块,而其它的任务通过消息队列
等方式与之通讯,把需要的操作提交给服务器,而服务器通过消息
邮箱等方式返回操作结果。
服务器
任务
任务A
任务B
...
任务N
软件包
数据队列
周立功单片机
• 编写自己的软件模块
6.使用一个任务作为模块服务器
当一个软件模块十分复杂,使用上述方法难以保证API函数可
重入性时,或软件模块需要在单任务环境和多任务环境都能够使用
时,可以依照单任务的方式编写,然后编写一个任务作为服务器,
由这个服务器直接操作这个软件模块,而其它的任务通过消息队列
等方式与之通讯,把需要的操作提交给服务器,而服务器通过消息
邮箱等方式返回操作结果。
7.复合方法
有一些驱动程序比较复杂(例如通讯协议),可以结合两种或
两种以上的方法实现。
周立功单片机
• 编写自己的软件模块
编写软件模块由一个要注意的地方是:必须把与硬件相
关的部分和与硬件无关的部分分开。这可以通过把与硬件相
关的部分放在驱动程序中实现。这样,硬件变化时只需要重
新编写驱动程序即可。驱动程序也可以分层实现。也可以通
过配置实现,不过这有时不太容易实现。当然可以合并使用。
硬件平台A 硬件平台B 硬件平台C
硬件驱动A 硬件驱动B 硬件驱动C
软件模块 软件模块 软件模块软件模块应用
于不同的硬件
平台时,只需
要修改相应的
硬件驱动
周立功单片机
第8章 目录
�1. 如何建立嵌入式系统开发平台
�2.数据队列
�3.串口驱动
�接口模块
�总线模块
�总线模块
�7.其它软件模块
周立功单片机
数据队列
• 简介
数据队列一般用于数据缓存,可以用来平衡速率
不同的两个部件,使快速部件无需等待慢速部件。
任务A 任务B
数据队列
任务A产生信
息快而短促
任务B处理信
息相对较慢
周立功单片机
数据队列
• 简介
数据队列一般是先入先出(FIFO)的,但本数据
队列可以配置为后入先出。本数据队列是可配置可裁
减的模块,并且不依赖于操作系统,可以在前后台系
统中使用。数据队列使用的空间由用户分配且由这个
空间的地址唯一识别一个数据队列。
周立功单片机
数据队列
• API函数
数据队列软件模块包括的API函数如下所示:
取得队列中总共可以存储的数据数目QueueSize
取得队列中已存储数据的数目QueueNData
清空队列QueueFlush
LIFO(后进先出)方式发送数据QueueWriteFront
FIFO(先进先出)方式发送数据QueueWrite
获取队列中的数据QueueRead
建立数据队列QueueCreate
功能简介API函数名
周立功单片机
• API函数
4
5
6
7
3
0
1
2
数据队列
有效数据空间
空闲数据空间
QueueRead
读队列中数据
QueueWrite
FIFO方式写数据
QueueWriteFront
LIFO方式写数据
注:API函数的具
体使用方法,请
参看相关手册。
QueueCreate
QueueFlush
QueueNData
QueueSize
周立功单片机
第8章 目录
�1. 如何建立嵌入式系统开发平台
�2.数据队列
�3.串口驱动
�接口模块
�总线模块
�总线模块
�7.其它软件模块
周立功单片机
串口驱动
• 简介
在实际应用中,嵌入式系统往往不是作为一个独
立的控制单元而存在,它还要和其它控制单元进行通
信。这些控制单元可以是另一个嵌入式系统,也可以
是PC机。如果双方均遵循同样的通讯协议,就可以互
相通讯了。
周立功单片机
串口驱动
• API函数
串口驱动软件模块包括的API函数如下所示:
接收一个字节数据UART0Getch
发送多个字节数据UART0Write
发送一个字节数据UART0Putch
初始化UART0UART0Init
功能简介API函数名
周立功单片机
UART0Init UART0Init
串口驱动
• API函数
串口驱动软件模块包括的API函数如下所示:
主机A 主机B
UART0Getch
UART0Putch
UART0Write
TXD
RXD
UART0Putch
UART0Write
UART0Getch
TXD
RXD
周立功单片机
第8章 目录
�1. 如何建立嵌入式系统开发平台
�2.数据队列
�3.串口驱动
�接口模块
�总线模块
�总线模块
�7.其它软件模块
周立功单片机
MODEM接口
• 简介
在实际应用中,嵌入式系统和其它控制单元的通
信可能不局限于一个小的地理范围,如跨城市通讯甚
至跨洲通讯。此时,如果需要布置专门的通讯线路则
成本太高,利用现成的通讯网络成为唯一的选择。而
电话网络是目前分布最广的廉价通讯网络。不过,要
利用电话网络需要一种接口设备,这就是MODEM
(调制解调器)。
周立功单片机
MODEM接口模块
• API函数
MODEM接口软件模块包括的API函数如下所示:
从MODEM获取一个字节数据ModemGetch
通过MDOEM拨号ModemDiaUP
挂断MODEMModemDiaDown
通过MODEM发送多个字节数据ModemWrite
获取MODEM状态GetModemState
初始化MODEMModemInit
功能简介API函数名
周立功单片机
MODEM接口模块
• API函数
所有API函数的返回值为当前MODEM的状态,如
下所示:
发现振铃信号MODEM_RING
已经与对方连接上MODEM_CONNECT
连接关闭MODEM_CLOSE
没有找到MODEMNOT_FIND_MODEM
不能初始化MODEMNOT_INIT_MODEM
状态说明MODEM状态
周立功单片机
ModemInit
GetModemState
ModemDiaUP
ModemDiaDown
ModemInit
GetModemState
ModemDiaUP
ModemDiaDown
• API函数
ModemGetch
获取一字节数据
ModemWrite
发送多字节数据
ModemWrite
发送多字节数据
ModemGetch
获取一字节数据
周立功单片机
第8章 目录
�1. 如何建立嵌入式系统开发平台
�2.数据队列
�3.串口驱动
�接口模块
�总线模块
�总线模块
�7.其它软件模块
周立功单片机
I2C总线模块
• 简介
I2C总线由Philips公司推出,是近年来在微电子通
信控制领域广泛采用的一种新型总线标准。它是同步
通信的一种特殊形式,具有接口线少、控制方式简化、
器件封装形式小、通信速率较高等优点。在主从通信
中,可以有多个I2C总线器件同时接到I2C总线上,通过
地址来识别通信对象。
周立功单片机
I2C总线模块
• 简介
I2C 总线通过2根线——串行数据线(SDA)和串行时钟线
(SCL)——连接到总线上的任何一个器件,每个器件都应有一个
唯一的地址,而且都可以作为一个发送器或接收器。此外,器件
在执行数据传输时也可以被看作是主机或从机。
Rp Rp
VDD
SCL
SDA
SDA出
SDA入SCL入
SCL出
SCL
SDA
器件1 器件2
I
2
C BUS
周立功单片机
I2C总线模块
• API函数
I2C接口软件模块包括的API函数如下所示:
从I2C从器件读数据I2cRead
向I2C从器件写数据I2cWrite
初始化I2C总线I2cInit
功能简介API函数名
周立功单片机
I2C总线模块
• API函数
Rp Rp
VDD
SCL
SDA
SDA出
SDA入SCL入
SCL出
SCL
SDA
器 件 1 器 件 2
I
2
C B U S
I2cWrite
向从器件写数据
I2cRead
读取从器件数据
I2cInit
初始化I2C总线
周立功单片机
第8章 目录
�1. 如何建立嵌入式系统开发平台
�2.数据队列
�3.串口驱动
�接口模块
�总线模块
�总线模块
�7.其它软件模块
周立功单片机
SPI总线模块
• 简介
串行外围设备接口SPI总线技术是Motorola公司推
出的一种同步串行接口。SPI总线是一种三线同步总
线,因其硬件功能很强,所以,与SPI有关的软件就相
当简单,使CPU有更多的时间处理其他事务。
SPI是一个全双工的串行接口。它设计成可以处理
在一个给定总线上多个互连的主机和从机。在一定数
据传输过程中,接口上只能有一个主机和一个从机能
够通信。在一次数据传输中,主机总是向从机发送一
个字节数据,而从机也总是向主机发送一个字节数据。
周立功单片机
SPI总线模块
• API函数
SPI接口软件模块包括的API函数如下所示:
开始访问SPISPIStart
通过SPI发送并接收一个数据SPIRW
访问SPI结束SPIEnd
获取SPI状态GetSPIFlag
初始化SPI总线为主模式SPIInit
功能简介API函数名
周立功单片机
SPI总线模块
• API函数
8位移位寄存器
SPI时钟发生器
8位移位寄存器
主 机 从 机
M I S O
M O S I
M I S O
M O S I
S S E L
S C KS C K
V C C
S S E L
SPIInit
初始化SPI总线
SPIStart
开始访问SPI
SPIEnd
结束访问SPI
SPIRW
读写SPI
GetSPIFlag
获取SPI状态
周立功单片机
第8章 目录
�1. 如何建立嵌入式系统开发平台
�2.数据队列
�3.串口驱动
�接口模块
�总线模块
�总线模块
�7.其它软件模块
周立功单片机
其它软件模块
前面介绍的软件模块都是比较简单和接近底层的
软件模块,广州周立功单片机发展有限公司和其它一
些公司还有一些比较大型的软件模块,比如ZLG/FS、
ZLG/D12、ZLG/CF、ZLG/IP、ZLG/GUI、
MiniTypeTM字库及输入法等。限于篇幅,不能详细介
绍它们,感兴趣的读者可以购买广州周立功单片机发
展有限公司推出EasyARM2200开发学习套件,其中附
带ZLG/FS、ZLG/D12、ZLG/CF、ZLG/IP、ZLG/GUI
的源代码及它们的一份使用许可证,同时有
MiniTypeTM字库的简单实验程序。