Download presentation
Presentation is loading. Please wait.
1
课件下载地址: 周立功网站: 在首页搜索“课件”即可。 注意:请使用PowerPoint2003播放。 LPC2000 ADS工程模板下载地址: 在首页搜索“模板”即可。
2
ARM之旅 概述 选择合适的ARM芯片 充分了解该ARM芯片 ARM的特性 了解ARM内部结构 设计最小系统 建立开发环境 (软件、硬件)
HelloWorld程序 概述 产品开发 ARM的特性 了解ARM内部结构 ARM程序的组成 了解ARM指令系统 掌握部分ARM指令 选择合适的ARM芯片 充分了解该ARM芯片 入门级别 了解级别 当前位置
3
主题: LPC2000系列ARM 内核剖析
4
LPC2000系列ARM内核剖析 5.1 简介 5.2 引脚配置 5.3 存储器寻址 5.4 系统控制模块 5.5 存储器加速模块
5.6 外部存储器控制器 5.7 引脚连接模块 5.8 向量中断控制器
5
5.1 简介 5.1.1 总体特性 5.1.2 LPC2000系列ARM芯片具体特性 5.1.3 LPC2000系列ARM芯片外设
5.1 简介 5.1.1 总体特性 5.1.2 LPC2000系列ARM芯片具体特性 5.1.3 LPC2000系列ARM芯片外设 5.1.4 LPC2000系列ARM器件信息 5.1.5 LPC2000系列ARM芯片典型应用
6
5.1.1 总体特性 ARM单片机化 (1) 针对工控领域 (2) 少管脚,小封装 (3) 内嵌大容量SRAM/FLASH,可加密
(4) 单电源化 (5) 快速GPIO
7
5.1.2 LPC2000系列ARM芯片 具体特性 (1) CPU-ARM7TDMI-S,小端结构。
(2) 内置大容量SRAM:2~64KB。 (3) 内嵌128位宽度的高速零等待FLASH,0~512KB。 (4) 可加密,有效保护劳动成果和知识产权。 (5) 独特的存储器加速模块,允许代码在最大时钟下运行,极大提高系统性能。
8
5.1.2 LPC2000系列ARM芯片 具体特性 (6) 内置PLL,可实现60/70MHz的操作频率。
(7) 内置BootLoader,可实现ISP和IAP。 (8) 标准调试接口,通过简单的JTAG即可进行调试。 (9) 内置嵌入式跟踪单元(ETM),可实现对代码进行无干扰高速实时跟踪。 (10) 外设丰富。
9
5.1.2 LPC2000系列ARM芯片 具体特性 (11) 外部中断输入引脚多。 (12) 低功耗,多种能耗管理方式。
(13) 小封装,多功能管脚。 (14) 工业级芯片,工作温度-40~85/105度。 (15) 产品线长,品种丰富,选型灵活。
10
5.1.3 LPC2000系列ARM 芯片外设 (1) 众多GPIO口,可承受5V电压。
(2) 2个32位定时器/计数器,带可编程预分频器,带4路比较和4路匹配比较通道。 (3)脉宽调制器(PWM),6路输出。 (4) 双串口,符合16C550工业标准,其中UART1具有完整的Modem接口。 (5) 一个或者多个I2C接口,支持高速模式(400K)。
11
5.1.3 LPC2000系列ARM 芯片外设 (6) 多个SPI接口,部分型号具有SSP接口(兼容SPI、MicroWire和SSI总线)。 (7) 1个或者2个10位AD转换器,最多14路输入。 (8) 1个10位DA转换器。 (9) 多路CAN接口。 (10) USB 2.0 Device(全速)。
12
5.1.4 LPC2000系列ARM 芯片外设 (11) 向量中断控制器,可分配优先级。 (12) 内置实时时钟。 (13) 内置看门狗。
13
USB 2.0 Device(FULL),单电源供电,快速GPIO
5.1.5 LPC2000系列ARM 器件信息 子系列 芯片型号 管脚数目 说明 LPC210x LPC2101 / 2102 / 2103 / 2104 / 2105 / 2106 48 快速GPIO LPC211x LPC2114 / 2119 64 2119带2路CAN LPC212x LPC2124 / 2129 2129带2路CAN LPC213x LPC2131 / 2132 / 2134 / 2136 / 2138 单电源供电 LPC214x LPC2141 / 2142 / 2144 / 2146 / 2148 USB 2.0 Device(FULL),单电源供电,快速GPIO LPC219x LPC2194 4路CAN LPC2210 LPC2210 / 2212 / 2214 144 总线开放 LPC2220 LPC2290 LPC2290 / 2292 / 2294 总线开放,带2/4路CAN
14
5.1.6 LPC2000系列ARM 芯片典型应用 (1) 工业控制。 (5) 通信网关。 (2) 医疗系统。 (6) 协议转换器。
(3) 访问控制。 (7) 嵌入式软Modem。 (4) POS机。 (8) 通用性应用。
15
5.1.6 LPC2000系列ARM 芯片典型应用 成熟产品实例-致远以太网产品 ZNE-200T ZNE-200
16
5.1.6 LPC2000系列ARM 芯片典型应用 成熟产品实例-致远以太网产品 ZNE-100TI ZNE-100T
17
5.1.6 LPC2000系列ARM 芯片典型应用 成熟产品实例-致远以太网产品 ZNE-100PT ZNE-100
18
5.1.6 LPC2000系列ARM 芯片典型应用 成熟产品实例-致远以太网产品 NETCOM-10S NETCOM-10M
19
5.1.6 LPC2000系列ARM 芯片典型应用 成熟产品实例-致远金卡产品 MJS-800
20
5.1.6 LPC2000系列ARM 芯片典型应用 成熟产品实例-致远CAN产品 CANET-E
21
5.1.6 LPC2000系列ARM 芯片典型应用 成熟产品实例-MiniARM嵌入式工控板 MiniARM
22
5.1.6 LPC2000系列ARM 芯片典型应用 成熟产品实例-MiniARM嵌入式工控板 MiniARM
23
5.1.6 LPC2000系列ARM 芯片典型应用 成熟产品实例-MiniARM嵌入式工控板 MiniARM
24
5.1.6 LPC2000系列ARM 芯片典型应用 成熟产品实例-MiniARM嵌入式工控板 MiniARM
25
5.1.6 LPC2000系列ARM 芯片典型应用 成熟产品实例-MiniARM嵌入式工控板 应用场合: (1)远程数据采集
(2)电力计费系统 (3)医疗系统 (4)POS机 (5)工控机
26
5.2 引脚配置 5.2.1 LPC2000系列芯片外形 5.2.2 LPC2000系列管脚分布 5.2.3 引脚描述
27
5.2.1 LPC2000系列芯片外形 48PIN 64PIN
28
5.2.1 LPC2000系列芯片外形 144PIN
29
5.2.2 LPC2000系列管脚分布 LPC2114/2124 LPC2210/2212/2214
30
5.2.3 引脚描述 (一) 管脚描述列表 (二) 多功能引脚和配置 (三) 特殊管脚
31
5.2.3 引脚描述 (一)管脚描述列表 管脚名称 管脚号 类型 描 述 P0.0~ P0.31 I/O
描 述 P0.0~ P0.31 I/O P0口:P0口是一个32位I/O口。每个位都有独立的方向控制。有28个P0口可用作通用双向数字I/O口,P0.31只用作输出口。P0口管脚的操作取决于管脚连接模块所选择的功能。管脚P0.24,P0.26和P0.27不可用。 P0.0/ TXD0/ PWM1 19 O P 通用输入/输出数字管脚(GPIO) TXD UART0的发送器输出 PWM1 脉宽调制器输出1 P0.1/ RXD0/ PWM3/ EINT0 21 I P 通用输入/输出数字管脚(GPIO) RXD0 UART0的接收器输入 PWM3 脉宽调制器输出3 EINT0 外部中断0输入
32
5.2.3 引脚描述 (二)多功能引脚和配置 LPC2000系列微控制器的引脚一般是多个功能复用,但是同一引脚在同一时刻只能使用其中一个功能,由引脚连接模块控制。 GPIO TXD0 PWM1输出 P0.0 通过引脚连接模块控制
33
5.2.3 引脚描述 (三)特殊管脚 1)系统运行相关 P0.14-ISP使能管脚。 P1.20-跟踪端口使能管脚(P1[25:16])。
P1.26(RTCK)-调试端口使能管脚P1[31:26]。 BOOT1:0-启动引导设置选择,总线宽度管脚。 CS3:0-存储器组选择管脚。 BLS3:0-字节定位选择管脚。
34
5.2.3 引脚描述 (三)特殊管脚 2) 应用相关 P0.31-仅输出端口。 I2C相关管脚-开漏输出端口。
35
内容小结 在前面两节主要讲述了如下几个方面的内容: (1)Philips 通用ARM芯片的总体特点 (2)LPC2000系列芯片的特点
36
5.3 存储器寻址 5.3.1 内部结构 5.3.2 存储器分布和操作 5.3.3 存储器映射 5.3.4 异常向量表
37
5.3.1 内部结构 (一)LPC2000芯片内部框图 (二)内部各单元简要介绍
38
5.3.1 内部结构 (一)芯片内部框图 LPC2000系列微控制器包含四大部分: ARM7TDMI-S CPU ARM7局部总线及相关部件
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外设总线及相关部件
39
5.3.1 内部结构 (一)芯片内部框图 LPC2000系列微控制器将ARM7TDMI-S配置为小端模式(Little-endian)。
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 EMC VIC AHB外设分配了2M字节的地址范围,它位于4G字节ARM寻址空间的最顶端。每个AHB外设都分配了16KB的地址空间。 AHB To VPB 桥 I2C串行接口 SPI串行接口 UART0 & 1 CAN 看门狗定时器 系统控制 外部中断 TIMER0/1 ADC 通用I/O PWM0 实时时钟 LPC2000系列微控制器的外设功能(除中断控制器)都连接到VPB总线。AHB到VPB的桥将VPB总线与AHB总线相连。VPB外设也分配了2M字节的地址范围,从3.5GB地址点开始。每个VPB外设都分配了16KB的地址空间。
40
5.3.1 内部结构 (二)芯片内部各单元简介 内部存储器包括无等待SRAM和Flash;
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 VIC EMC 向量中断控制器(VIC)可以减少中断的响应时间,最多可以管理32个中断请求; I2C串行接口 外部存储器控制器(EMC)支持4个BANK的外部SRAM或Flash,每个BANK最多16MB; I2C串行接口为标准的I2C总线接口,支持最高速度400kb;
41
5.3.1 内部结构 (二)芯片内部各单元简介 具有两个完全独立的SPI控制器,遵循SPI规范,可配置为SPI主机或从机;
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 看门狗定时器
42
5.3.1 内部结构 (二)芯片内部各单元简介 系统控制模块包括一些与其它外设无关的功能,如功率控制等;
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位定时器/计数器,具有捕获和匹配输出功能; 外部中断 TIMER0/1 ADC 具有4/8路10位ADC,可以设置为多路循环采样模式。10位转换时间最短为2.44us; 系统控制
43
(二)芯片内部各单元简介 5.3.1 内部结构 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 实时时钟
44
5.3.2 存储器分布和操作 (一) 概览 (二) 不同芯片内部存储器分布 (三) 片内FLASH (四) 片外Flash编程方法
(五) Boot Block
45
5.3.2 存储器分布和操作 VPB/AHB外设 (一)概览 片外存储器 BootBlock 片内SRAM 片内Flash
0xFFFF FFFF 4.0G VPB/AHB外设 片外存储器 BootBlock 片内SRAM 片内Flash 3.5G 0xE ARM7外设总线 2.0G 0x 0x 1.0G ARM7局部总线 0x 0.0G
46
5.3.2 存储器分布和操作 一个具体应用可能存在的物理存储器 地址空间 片外存储器 片内存储器 0xFFFFFFFF 0x80000000
外部存储器 0x7FFFE000 Boot Block 片内存储器 0x 内部SRAM 内部Flash
47
5.3.2 存储器分布和操作 (二)不同芯片内部存储器分布 16K 128K 16K 256K 16K LPC2210
0x40001FFF 0x 0x0003FFFF 0x0001FFFF 0x LPC2210 LPC2114/2212 LPC2124/2214 片内Flash 片内RAM
48
5.3.2 存储器分布和操作 (三)片内FLASH 1. 特点: (1)位于ARM7局部总线上; (2)50ns的访问速度;
(3)128位宽度; (4)存储器加速模块,零等待。 内部Flash控制器 内部Flash
49
5.3.2 存储器分布和操作 2. 片内Flash编程方法 1. 通过内置JTAG接口下载,方便调试;
2. 通过UART0实现在系统编程(ISP),可用于生产/升级。 3. 通过在应用编程(IAP),可用于数据存储或者现场固件升级。 串口 JTAG
50
5.3.2 存储器分布和操作 3. 片内Flash加密 向Flash地址0x1FC写入0x 即实现加密功能。 只有有效代码才能被加密。 加密后: (1)JTAG调试端口被禁止 (2)外部存储器引导被禁止 (3)ISP的读存储器、写RAM、运行和复制命令被禁止。 (4)芯片加密后,通过ISP全片擦除后方可JTAG调试。
51
5.3.2 存储器分布和操作 3. 片内Flash加密 启动代码中的加密设置: IF :DEF: EN_CRP
IF . >= 0x1fc INFO 1,"\n The data at 0x000001fc must be 0x \nPlease delete some source before this line." ENDIF CrpData WHILE . < 0x1fc NOP WEND CrpData1 DCD 0x ; /*当此数为0x 时,用户程序被保护*/
52
5.3.2 存储器分布和操作 3. 片内Flash加密 0x0000 0000 异常向量表 0x0000 0020 部分初始化代码 或
FIQ中断处理代码 NOP 0x FC DCD 0x 用户代码 能够实现加密的代码结构
53
5.3.2 存储器分布和操作 (四)片外FLASH 片外Flash通过外部存储器控制器连接,所用芯片和接法各异,因此编程算法也不相同,一般在CPU上运行一个装载程序(Loader,一般由用户编写),该程序通过串口/以太网口接收要烧写的数据,然后擦除编程Flash。 Loader 程序 外部 Flash 以太网口 串口
54
5.3.2 存储器分布和操作 (五)片内SRAM (1)位于ARM7局部总线上; (2)支持8/16/32位访问。 (3)带回写缓冲区。
55
5.3.2 存储器分布和操作 回写缓冲区作用 回写缓冲区,它总是保存着软件发送到SRAM的最后一个字数据。该数据只有在软件请求下一次写操作时才写入SRAM。如果发生芯片复位,实际的SRAM内容将不会反映最近一次的写操作。用于防止CPU在连续写操作的时候停止。 A B ? 写入B 写入A 写入A 写入地址 A ? 回写缓冲区 内部SRAM
56
5.3.2 存储器分布和操作 (六)Boot Block
LPC2000系列芯片内置BootLoader程序,用于引导芯片启动和初始化,并为应用提供Flash编程算法,实现ISP和IAP。大小为8/12K不等。用于存放BootLoader程序的存储器称为Boot Block。 Boot Block的位置:片内存储器最顶端。
57
RAM和Flash 的变化不会影响BootBlock的位置
5.3.2 存储器分布和操作 将Boot Block映射到片内存储器最顶端的原因 出于整个系列芯片的兼容性考虑。 不同芯片内置RAM和FLASH规格大小变化都不会影响Boot Block的位置。 Flash SRAM Boot Block AHB & VPB 映射位置固定在内部存储器顶端 0x G SRAM 0x G RAM和Flash 的变化不会影响BootBlock的位置 Flash 0x G 地址空间
58
5.3.3 存储器映射 (一) 基本概念 (二) 外设存储器映射 (三) 预取指中止和数据中止
59
5.3.3 存储器映射 (一)基本概念 (1) 地址映射 把ARM处理器产生的地址(虚拟地址)按照某种规则转换到另一个物理地址去的方法称为地址映射。这个物理地址表示了被访问的存储器的位置。它是一个地址范围,该范围内可以写入程序代码。 (2) 存储器映射 通过地址映射的方法将各存储器分配到特定的地址范围后,这时用户所看见的存储器分布为存储器映射。
60
5.3.3 存储器映射 (3)AHB总线和AHB外设 (4)VPB总线和VPB外设 接在AHB总线上的外设称为AHB外设。
AHB(Advanced High-performance Bus,先进的高性能总线)-用于连接高性能系统模块。支持64/128位总线配置。支持突发数据传送方式以及单个数据传送,所有时序都以单一时钟的沿为基准。 接在AHB总线上的外设称为AHB外设。 (4)VPB总线和VPB外设 VPB(VLSI Peripheral Bus,VLSI(高复杂度集成电路)外设总线)-用于连接片内外设。 接在VPB总线上的外设称为VPB外设。
61
5.3.3 存储器分布 (二)外设存储器映射 VPB/AHB外设 片外存储器 BootBlock 片内SRAM 片内Flash
0xFFFF FFFF 4.0G VPB/AHB外设 片外存储器 BootBlock 片内SRAM 片内Flash ARM7外设总线 3.5G 0xE 2.0G 0x 0x 1.0G ARM7局部总线 0x 0.0G
62
5.3.3 存储器映射 (二)外设存储器映射 VPB 外设 AHB 外设 保留 3.5GB 3.5GB+2MB 4.0GB-2MB 地址空间 4.0GB 0xE 0xE01FFFFF 0xFFE00000 0xFFFFFFFF 外设区域都为2M字节,可各分配128个外设。每个外设空间的规格都为16K字节,这样就简化了每个外设的地址译码。 VPB 外设 AHB 外设 均为128×16KB(2MB)范围
63
5.3.3 存储器映射 (1)AHB外设映射 0xFFFFFFFF 4.0G
地址空间 0xFFE00000 0xFFE04000 0xFFFF4000 0xFFFF8000 AHB 外设#125 AHB 外设#0 AHB 外设#1 0xFFFFF000 … 0xFFFFC000 向量中断控制器 AHB 外设#127 LPC2000系列芯片,目前仅使用了极少数AHB外设,其余尚未分配 4.0G-2M
64
5.3.3 存储器映射 (2)VPB外设映射 0xE01FFFFF 3.5G+2M 128VPB个外设,目前没有使用完,没有使用的为保留空间
地址空间 0xE 0xE 0xE 0xE000C000 VPB 外设#2 VPB 外设#0 VPB 外设#1 0xE01FC000 … VPB外设#127 看门狗定时器 定时器0 系统控制模块 定时器1 UART 0 128VPB个外设,目前没有使用完,没有使用的为保留空间 3.5G
65
5.3.3 存储器映射 (三)预取指中止和数据中止 如果试图访问一个保留地址或未分配区域的地址,ARM处理器将产生预取指中止或数据中止异常。
66
5.3.3 存储器映射 (1)发生条件/区域 1.特定的ARM器件所没有的存储器映射区域; 2. AHB外设空间中未分配的区域;
Flash SRAM Boot Block VPB 地址空间 AHB 1.特定的ARM器件所没有的存储器映射区域; 2. AHB外设空间中未分配的区域; 3. VPB外设空间中未分配的区域。
67
5.3.4 异常向量表 (一) 基本概念 (二) 异常向量表 (三) 启动代码 (四) 有效用户代码 (五) 异常向量表和存储器重新映射
68
5.3.4 异常向量表 (一)基本概念 对于每一个异常事件,都有一个与之相对应的处理程序,它们是关联在一起的,并以一张一维表的格式存储在存储器的固定单元中。这张指定了各异常中断及其处理程序的对应关系的表,称为异常向量表。
69
5.3.4 异常向量表 (二)异常向量表 各异常向量的固定位置 地址 异常 0x0000 0000 复位 0x0000 0004 未定义指令
软件中断 0x C 预取指中止(从存储器取指出错) 0x 数据中止(访问存储器数据出错) 0x 保留 * 0x IRQ 0x C FIQ LPC2000用于检测用户代码是否有效。
70
5.3.4 异常向量表 (三)启动代码 一般在32位ARM应用系统中,大多数采用C语言进行软件编程。但是在运行应用代码前需要进行系统初始化,为C程序提供运行环境。 常用一个汇编文件作启动代码,它可以实现异常向量表定义、堆栈初始化、系统变量初始化、中断系统初始化、I/O初始化、外围部件初始化、地址重映射等操作。
71
5.3.4 异常向量表 启动代码中的异常向量表 前32字节为异常入口 后32字节为跳转地址 异常向量表 CODE32
AREA vectors,CODE,READONLY ENTRY 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 0 FIQ_Addr DCD FIQ_Handler 前32字节为异常入口 后32字节为跳转地址
72
5.3.4 异常向量表 启动代码中的异常向量表 示例-发生未定义异常 异常向量表 1. 程序计数器(PC)指向0x00000004; 装入
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)指向0x ; 装入 2. 执行当前的指令,将Undefined地址值装入PC,实现至未定义异常处理程序的跳转。
73
5.3.4 异常向量表 启动代码中的异常向量表 注意 异常向量表中程序跳转使用LDR指令,而没有使用B指令。 异常向量表 原因:
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 ResetAddr 原因: 1. LDR指令可以全地址范围跳转,而B指令只能在前后32MB范围内跳转; 2. 芯片具有Remap功能。当向量表位于内部RAM或外部存储器中,用B指令不能跳转到正确的位置。
74
5.3.4 异常向量表 (四)有效用户代码 LPC2000系列微控制器规定 “内部Flash中向量表所有数据的32位累加和为零”时,判定内部Flash中的代码为有效可执行代码。即只有当向量表所有数据32位累加和为零时,用户的程序才能脱机运行。
75
5.3.4 异常向量表 有效用户代码的判别 异常入口 跳转地址 异常向量表 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 0 FIQ_Addr DCD FIQ_Handler 异常入口 跳转地址
76
5.3.4 异常向量表 有效用户代码的判别 异常入口 跳转地址 异常向量表反汇编代码 Reset
[0xe59ff018] ldr pc,ResetAddr [0xe59ff018] ldr pc,UndefinedAddr [0xe59ff018] ldr pc,SWI_Addr [0xe59ff018] ldr pc,PrefetchAddr [0xe59ff018] ldr pc,DataAbortAddr [0xb9205f80] dcd 0xb9205f80 [0xe51ffff0] ldr pc,0xfffff030 [0xe59ff018] ldr pc,FIQ_Addr ResetAddr [0x c] dcd x c UndefinedAddr [0x ] dcd x . . . FIQ_Addr [0x c] dcd x c 异常入口 跳转地址
77
5.3.4 异常向量表 有效用户代码的判别 指令的机器码 指令 异常向量表反汇编代码 Reset
[0xe59ff018] ldr pc,ResetAddr [0xe59ff018] ldr pc,UndefinedAddr [0xe59ff018] ldr pc,SWI_Addr [0xe59ff018] ldr pc,PrefetchAddr [0xe59ff018] ldr pc,DataAbortAddr [0xb9205f80] dcd 0xb9205f80 [0xe51ffff0] ldr pc,0xfffff030 [0xe59ff018] ldr pc,FIQ_Addr ResetAddr [0x c] dcd x c UndefinedAddr [0x ] dcd x . . . FIQ_Addr [0x c] dcd x c 指令的机器码 指令
78
5.3.4 异常向量表 有效用户代码的判别 8条指令的机器码累加和为0,表示用户代码有效 保留字的计算: 保留字
异常向量表反汇编代码 Reset [0xe59ff018] ldr pc,ResetAddr [0xe59ff018] ldr pc,UndefinedAddr [0xe59ff018] ldr pc,SWI_Addr [0xe59ff018] ldr pc,PrefetchAddr [0xe59ff018] ldr pc,DataAbortAddr [保留字] dcd 保留字 [0xe51ffff0] ldr pc,0xfffff030 [0xe59ff018] ldr pc,FIQ_Addr ResetAddr [0x c] dcd x c UndefinedAddr [0x ] dcd x . . . FIQ_Addr [0x c] dcd x c 8条指令的机器码累加和为0,表示用户代码有效 保留字的计算: 0xe59ff xe59ff xe59ff xe59ff xe59ff018 + 保留字 + 0xe51ffff0 + 0xe59ff018 = 0 保留字 =~(0xe59ff xe59ff xe59ff xe59ff xe59ff xe51ffff0 + 0xe59ff018) + 1 = 0xb9205f80
79
5.3.4 异常向量表 有效用户代码的判别 为什么要通过文字池的地址跳转表进行跳转? 异常入口 跳转地址 异常向量表 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 0 FIQ_Addr DCD FIQ_Handler 异常入口 为什么要通过文字池的地址跳转表进行跳转? 跳转地址
80
5.3.6 异常向量表 (五)异常向量表和存储器重新映射 存储器重新映射--将复位后用户所见的存储器中部分区域,再次映射到其它的地址上。
对于Philips的LPC系列ARM微控制器,存储器重新映射区域一共为64字节,分别为异常向量入口(32字节)和处理程序地址跳转表(32字节)。存储器重新映射的方法允许在不同模式下处理中断,重新映射的存储器区域在地址0x ~0x F处。
81
内容小结 本节主要讲述了如下几个方面的内容: (1)LPC2000内部结构和各单元简介 (2)存储器分布和映射 (3)各部分基本操作
(4)异常向量表、有效用户代码和重映射
82
模块和寄存器 寄存器分类 补充内容 芯片内部电路可以分成很多相对独立的模块,大部分模块都有自己的寄存器。
通常一个独立的模块,如果有相关的寄存器,按照功能可以分为如下几类(有的仅有部分寄存器): 1.控制寄存器-控制该模块使能/禁能,启动/停止,以及设置工作模式等。 2.参数设置寄存器-用于设置该模块在某种模式下工作所需要的参数,如时间、频率等。
83
模块和寄存器 寄存器分类 补充内容 3.状态寄存器-反映该模块当前工作模式或工作状态,以及相关参数设定状态。
4.中断相关寄存器-如果该模块能够产生中断,则有中断使能/禁能、中断标志寄存器等。有的模块没有独立的中断标志寄存器,只有相关标志位,依附于其它寄存器中。 5.其它寄存器-用于对该模块进行其它特殊设置/操作。
84
模块和寄存器 模块操作 补充内容 正常使用一个模块,通常都会有如下操作:
1.控制操作-模块的使能/禁能,启动/停止,以及工作模式的设置等,通过控制寄存器进行操作。 2.设定工作参数-设定在某种模式下工作所需要的参数,如时间、大小等,通过参数设置寄存器进行。 3.中断相关操作-设定是否产生中断、产生哪些中断以及在何种条件下产生中断等,通过中断相关寄存器进行设置。
85
模块和寄存器 模块操作 补充内容 4.状态查询-查询该模块的当前工作状态,如模式、参数设置等状态,通过状态寄存器进行查询。
5.其它操作-某些模块可能还有一些特殊的操作,通过相关的寄存器进行操作。
86
5.4 系统控制模块 5.4.1 系统控制模块概述 5.4.2 系统时钟 5.4.3 复位 5.4.4 唤醒定时器 5.4.5 外部中断
5.4.6 存储器重映射控制 5.4.7 功率控制
87
5.4.1 系统控制模块概述 系统控制模块内容 系统控制模块并不仅指一个独立的模块,而是很多模块的统称,包括一些系统构件和控制寄存器,它们具有众多与芯片内其它外设无关的功能。LPC2000芯片系统控制模块包括: (1)系统时钟单元 (4)存储器映射控制 (2)复位 (5)功率控制 (3)外部中断输入 (6)唤醒定时器*
88
5.4.2 系统时钟 (一) 系统时钟概述 (二) 时钟源 (三) 锁相环(PLL) (四) VPB分频器 (五) 系统时钟初始化
89
5.4.2 系统时钟 (一)系统时钟概述 LPC2000系列ARM芯片工作需要2个时钟:
CCLK-系统时钟,ARM7内核使用,最高60/70MHz。 PCLK-外设时钟,芯片外设使用。 注意 (1)两个时钟都由同一个时钟产生单元提供,整个芯片只需一个时钟/晶振信号输入。 (2)外设时钟PCLK可以低于系统时钟CCLK,降低功耗。
90
5.4.2 系统时钟 系统时钟示意图 ARM7核 桥 外设 时钟产生 单元 FCCLK FPCLK FOSC
91
5.4.2 系统时钟 时钟产生单元 时钟产生单元包括晶体振荡器、锁相环振荡器(PLL)和VPB分频器。 晶体 PLL 振荡器 VPB分频器
FCCLK FPCLK FOSC
92
5.4.2 系统时钟 (二)时钟源 LPC2000微控制器可以从外部引入时钟信号,也可以使用内部的晶体振荡器产生时钟信号,分别对应于从属模式和振荡模式。 LPC2000 X1 X2 Clock CX1 CX2 CC XTAL 从属模式 振荡模式
93
5.4.2 系统时钟 (1)从属模式 使用从属模式时,时钟信号通过X1引脚从外部输入,3点要求: LPC2000
Clock CC 从属模式 (1)频率范围:1~50MHz (2)幅度:不小于200mV rms。 (3)占空比:50%。
94
5.4.2 系统时钟 (2)振荡模式 使用振荡模式时,时钟信号由内部晶体振荡器和外部连接的晶体振荡产生,注意几点:
(1)频率范围:1~30MHz (2)匹配匹配电容选择 LPC2000 X1 X2 CX1 CX2 XTAL 振荡模式 Cx1/Cx2为晶体匹配电容
95
5.4.2 系统时钟 匹配电容Cx1/Cx2的选择 匹配电容选择的恰当与否直接影响系统的运行。其参数选择和系统所需要的基本频率和所选择的晶体有关。 晶体参数 基本频率-L 晶体负载电容-CL 晶体串连电阻-Rs 并联封装电容-Cp(<7pf) 这些参数都由晶体厂商提供。 外部晶体模型
96
Philips的推荐参数 5.4.2 系统时钟
97
5.4.2 系统时钟 注意事项 不管使用何种模式,如果需要使用ISP下载功能或者连接PLL提高频率,则输入的时钟频率范围必须在10~25(MHz)之间。 LPC2000 X1 X2 Clock CX1 CX2 CC XTAL 从属模式 振荡模式
98
5.4.2 系统时钟 (三)锁相环(PLL) 外部输入的时钟或者晶体振荡器输出的时钟信号,通过PLL升频,可以获得更高的系统时钟(CCLK)。 PLL接受的输入时钟频率范围为10~25MHz,通过一个电流控制振荡器(CCO)倍增到10~60/70MHz,分别供给内核和外设使用。 PLL 晶体 振荡器 VPB分频器 FCCLK FPCLK FOSC PLL 10MHz~60/70MHz 10MHz~25MHz
99
电流控制振荡器,根据输入电流控制振荡频率
5.4.2 系统时钟 PLL内部结构 FOSC 相位频率 检测 CCO 2P 分频 1 1 FCCLK FCCO 1 M 分频 晶体振荡器输入时钟 对输入的两路时钟信号进行相位频率检测,将两者差值以电流形式输出 连接 电流控制振荡器,根据输入电流控制振荡频率 2P分频 和M倍频 使能
100
5.4.2 系统时钟 PLL内部结构 使能 连接 回路锁定条件: 两个时钟频率相等、相位差固定。 相位频率 2P CCO 检测 分频 M
FOSC FCCO / 2P 相位频率 检测 CCO 2P 分频 1 1 FCCLK FCCO 1 M 分频 FCCLK / M 使能 连接 回路锁定条件: 两个时钟频率相等、相位差固定。
101
5.4.2 系统时钟 PLL相关操作 正确使用PLL必须掌握如下操作: (1) 控制PLL,包括使能和连接PLL;
(2) 配置PLL,包括设定PLL M倍频和2P分频 值; (3) 获取PLL当前状态; (4) 保护PLL。 相关操作都有对应的寄存器。
102
5.4.2 系统时钟 (1)控制PLL 有使能和连接PLL两种操作,通过PLL控制寄存器(PLLCON)进行操作,如下所示。
位 7 6 5 4 3 2 1 功能 - PLLC PLLE PLL连接 1-PLL连接到CPU 0-直接使用振荡器 PLL使能 1-PLL被激活 注意(1)只有使能后才能对PLL进行操作; (2)只有在PLL回路锁定后才能进行连接。
103
5.4.2 系统时钟 PLL内部结构 (1)使能 (3)连接 (2)等待回路锁定: 两个时钟频率相等、相位差固定。 相位频率 2P CCO
FOSC FCCO / 2P 相位频率 检测 CCO 2P 分频 1 1 FCCLK FCCO 1 M 分频 FCCLK / M (1)使能 (3)连接 (2)等待回路锁定: 两个时钟频率相等、相位差固定。
104
5.4.2 系统时钟 (2)配置PLL 根据计算公式和各参数的限定条件正确设定PLL的分频系数P和倍频系数M,将正确的参数写入PLL配置寄存器(PLLCFG)。 位 7 6 5 4 3 2 1 功能 - PSEL[1:0] MSEL[4:0] 2P分频值 P M倍频值 (M-1)
105
5.4.2 系统时钟 计算公式 FCCLK = FOSC×M 相位频率 检测 CCO 2P 分频 M 分频
FCCO / 2P 相位频率 检测 CCO 2P 分频 1 1 FCCLK FCCO 1 M 分频 FCCLK / M 回路锁定后:FOSC = FCCLK / M FCCLK = FCCO / 2P FCCLK = FOSC×M 必须满足的条件: FOSC范围:10MHz~25MHz; FCCLK范围:10MHz~60/70MHz; FCCO范围:156MHz~320MHz;
106
5.4.2 系统时钟 计算实例 系统要求:FOSC=10MHz、CCLK= 60MHz 1.计算M值:M= CCLK / FOSC =6 ;
2.设置MSEL位:写入值为(M-1)=5; 3. 设置PSEL位: P=FCCO/(CCLK×2) =(156~320)/120=1.3~2.67 P取整数2,PSEL写入值为2。
107
5.4.2 系统时钟 (3)查询PLL当前状态 查询当前PLL是否已经使能、连接或者锁定,以及PLL的分频值、倍频值的大小,通过读取PLL状态寄存器(PLLSTAT)进行。 位 15 : 11 10 9 8 7 6 : 5 4 : 0 功能 - PLOCK PLLC PLLE PSEL[1:0] MSEL[4:0] 锁定 连接 使能 2P分频值 P M倍频值 (M-1)
108
PLL中断标志:PLL锁定时,该位置1,可产生中断
5.4.2 系统时钟 (4)PLL中断 PLL模块可以产生中断(中断号12),但PLL没有独立的中断寄存器,只有中断标志PLOCK,位于PLL状态寄存器(PLLSTAT)中,如下所示。 位 15 : 11 10 9 8 7 6 : 5 4 : 0 功能 - PLOCK PLLC PLLE PSEL[1:0] MSEL[4:0] PLL中断标志:PLL锁定时,该位置1,可产生中断 注意:PLOCK位不能软件清除,只能通过禁止PLL中断返回。
109
5.4.2 系统时钟 (5)其它操作 主要指的是PLL的馈送序列操作。PLL直接影响整个系统工作,因而不能轻易更改或者发生意外。LPC2000系列芯片对PLL进行了保护,通过类似WDT的代码序列实现。相关寄存器为PLL馈送寄存器PLLFEED。 位 7 6 5 4 3 2 1 功能 PLLFEED[7:0] 馈送序列: 写0xAA到PLLFEED; 写0x55到PLLFEED。
110
5.4.2 系统时钟 馈送序列说明: (1) 发送馈送序列必须是连续的VPB总线周期,因而必须保证系统所有中断(IRQ/FIQ)都是禁止的。
(2) 只有发送了正确的馈送序列,才能使PLLCON和PLLCFG寄存器的值生效。 (3) 每更改一次PLLCON或者PLLCFG的值,都必须发送正确的馈送序列,将更改的值写入PLL硬件。 示例: 关闭所有中断 PLLFEED = 0xAA; PLLFEED = 0x55; 开启需要的中断
111
5.4.2 系统时钟 锁相环(PLL)计算流程 根据处理器的整体要求、需要支持的UART波特率等因素来决定。外围器件的时钟频率可以低于处理器频率。 1. 选择处理器的 工作频率(CCLK) CCLK 必须为FOSC的整数倍。 2. 选择振荡器 频率(FOSC) M = CCLK / FOSC,取值范围1~32。写入MSEL的值为(M-1)。 3. 计算M值 配置MSEL位 选择合适的P值,使FCCO在限制范围内。P只能取1、2、4或8。写入PSEL的值为P。 4. 计算P值 配置PSEL位
112
5.4.2 系统时钟 锁相环注意要点 (1) PLL在芯片复位或进入掉电模式时被关闭并旁路,在掉电唤醒后不会自动恢复PLL的设定;
113
5.4.2 系统时钟 (四)VPB分频器 VPB分频器将PLL输出的时钟信号分频后作为芯片外设的时钟。 晶体 PLL 振荡器 VPB分频器
FCCLK FPCLK FOSC VPB分频器
114
5.4.2 系统时钟 VPB分频器用途 VPB分频器决定处理器时钟(CCLK)与外设器件所使用的时钟(PCLK)之间的关系。
VPB用途1:通过VPB总线为外设提供所需的PCLK时钟,以便外设在合适的速度下工作; VPB用途2:在应用不需要任何外设全速运行时使功耗降低。
115
5.4.2 系统时钟 VPB分频器操作 操作VPB分频器只需设定分频系数即可。可以将VPB时钟设置为系统时钟的1/4,1/2或者和系统时钟相同。在VPB分频寄存器VPBDIV中设置。 位 7 6 5 4 3 2 1 功能 - XCLKDIV[1:0] VPBDIV[1:0] LPC2200的A23/XCLK时钟分频 分频编码
116
5.4.2 系统时钟 VPB分频编码 VPB分频寄存器(VPBDIV): 位 7 6 5 4 3 2 1 功能 - XCLKDIV[1:0]
功能 - XCLKDIV[1:0] VPBDIV[1:0] VPBDIV[1:0] 说明 00 VPB总线时钟为处理器时钟的1/4。 01 VPB总线时钟与处理器时钟相同。 10 VPB总线时钟为处理器时钟的1/2。 11 保留。写入该值将不改变分频值。
117
5.4.2 系统时钟 (五)系统时钟初始化流程 使能PLL 设置VPB 分频值 设置PLL 分频值 PLL馈送序列 等待PLL锁定
118
5.4.2 系统时钟 系统时钟初始化——启动代码实例 将系统内各时钟的频率定义为宏,方便用户操作。 设置晶振频率 设置内核工作频率
//晶振频率,10MHz~25MHz,应当与实际一致 #define Fosc //系统频率,必须为Fosc的整数倍(1~32),且<=60/70MHZ #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输出频率 设置外设工作频率
119
5.4.2 系统时钟 系统时钟初始化——启动代码实例 C代码分析:
使能PLL 设置VPB 分频值 PLL馈送序列 等待PLL锁定 设置PLL 分频值 连接PLL 使能PLL C代码分析: PLLCON = 1; #if (Fpclk / (Fcclk / 4)) == 1 VPBDIV = 0; #endif #if (Fpclk / (Fcclk / 4)) == 2 VPBDIV = 2; #if (Fpclk / (Fcclk / 4)) == 4 VPBDIV = 1; . . . 设置VPB 分频值 注意:在启动代码中很多地方使用了条件编译的方法,根据用户定义的宏来决定要设置的值,可以方便用户使用。
120
5.4.2 系统时钟 系统时钟初始化——启动代码实例 C代码分析: 使能PLL 设置VPB 分频值 PLL馈送序列 等待PLL锁定
. . . #if(Fcco/Fcclk)==2 PLLCFG=((Fcclk/Fosc)-1)|(0<<5); #endif #if(Fcco/Fcclk)==4 PLLCFG=((Fcclk/Fosc)-1)|(1<<5); #if(Fcco/Fcclk)== 8 PLLCFG=((Fcclk/Fosc)-1)|(2<<5); #if(Fcco/Fcclk)==16 PLLCFG=((Fcclk/Fosc)-1)|(3<<5); 设置PLL 分频值
121
5.4.2 系统时钟 系统时钟初始化——启动代码实例 C代码分析: 使能PLL 设置VPB 分频值 PLL馈送序列 等待PLL锁定
. . . PLLFEED = 0xaa; PLLFEED = 0x55; while((PLLSTAT & (1 << 10)) == 0); PLLCON = 3; PLL馈送序列 等待PLL锁定 连接PLL PLL馈送序列
122
5.4.3 复位 (一) 复位的分类 (二) 上电复位 (三) 外部复位 (四) 复位电路设计 (五) 复位后系统状态
123
5.4.3 复位 (一)复位的分类 上电复位—给芯片/系统加电引发的复位。
外部复位—把nRESET引脚拉为低电平,并保持一个最小时间,引发复位。 看门狗复位—通过设置看门狗相关寄存器,当看门狗定时器溢出后,引发复位。 掉电检测复位—部分芯片内部有掉电检测电路,当电源电压下降到一定电压的时候,将引发复位。
124
5.4.2 系统时钟 (一)复位的分类 复位源识别寄存器-RISR(部分芯片) 掉电检测复位 外部复位 上电复位 看门狗复位 位 7~4 3
1 功能 保留 BODR WDTR EXTR POR 掉电检测复位 外部复位 上电复位 看门狗复位
125
5.4.3 复位 (二)上电复位 1. 在芯片未上电时,芯片振荡器没有工作; LPC2xxx nRESET 电源输入 X1 X2 UX1 t
126
5.4.3 复位 (二)上电复位 2. 芯片上电后,晶体振荡器开始振荡。因为振荡从开始到稳定需要一过程,所以外部复位信号至少要保持10ms;选择复位芯片。 LPC2xxx nRESET 电源输入 X1 X2 >=10ms UX1 t 振荡器稳定需要一段时间
127
5.4.3 复位 (三)外部复位 外部复位引脚(nRESET)连接内部的施密特触发器,通过施密特触发器可以滤除引脚输入的干扰信号,保证复位的可靠性。如果外部复位信号一直有效,芯片将保持复位状态。 LPC2000系列芯片为低电平复位。
128
5.4.3 复位 (三)外部复位 在晶体振荡器保持稳定振荡,或者使用有源钟振时,外部复位信号可以缩短到不小于300ns; LPC2xxx
nRESET 电源输入 X1 X2 >=300ns UX1 t 此时振荡器稳定工作
129
5.4.3 复位 (四)复位电路设计 首先考虑是否需要调试功能-不需要JTAG调试的电路可以简化。研发阶段一般都需要调试接口。
最好使用专用复位芯片-简单的RC复位电路不可靠,ISP和JTAG不能正常工作。 看芯片是否有内部复位电路-在成品阶段,有内部上电复位电路的芯片,其复位电路可以简化。
130
5.4.3 复位 复位芯片选择 参数依据: 复位电平-低电平复位。 复位电压-3.3V系统一般选择2.93V复位电压。
手动复位-是否需要手动复位。 复位脉冲宽度-要满足芯片的最低要求。 Catalyst有一系列复位芯片可用于复位电路设计,如CAT809,CAT811,CAT102x系列,CAT116x系列芯片。Sipex也有很多复位芯片可供选择。
131
5.4.3 复位 (五)复位后系统状态 芯片被复位后,处理器和外设寄存器都恢复为默认状态。程序计数器(PC)值为0,即CPU复位后运行的第一条代码位于0x 处。此时位于该地址的程序并不位于片内Flash,而是来自Boot Block的异常向量表的重新映射。通过异常向量表的复位异常入口,程序跳转至Boot Block中执行Boot程序。
132
5.4.3 复位 (五)复位后系统状态 1. 复位后用户见到的存储器分布 0xFFFFFFFF AHB & VPB 0x80000000
Flash SRAM Boot Block AHB & VPB 0x 0xFFFFFFFF 0x 0x 地址空间
133
5.4.3 复位 (五)复位后系统状态 2. BootBlock中的异常向量表重新映射 0xFFFFFFFF AHB & VPB
Flash SRAM Boot Block AHB & VPB 0x 0xFFFFFFFF 0x 0x 复位异常入口 未定义异常入口 软件中断入口 . . . 0x 0x 0x 0x 地址空间
134
5.4.3 复位 (五)复位后系统状态 3. PC指向0x0000地址处,CPU执行复位后的第一条指令 PC指向 0xFFFFFFFF
Flash SRAM Boot Block AHB & VPB 0x 0xFFFFFFFF 0x 0x 0x . . . 0x 软件中断入口 0x 未定义异常入口 PC指向 复位异常入口 地址空间
135
5.4.3 复位 (五)复位后系统状态 4. 通过跳转指令,执行Boot程序。 PC指向 0xFFFFFFFF AHB & VPB
Flash SRAM Boot Block AHB & VPB 0x 0xFFFFFFFF 0x 0x 0x . . . 0x 软件中断入口 0x 未定义异常入口 PC指向 复位异常入口 地址空间
136
5.4.4 唤醒定时器 选讲 唤醒定时器 唤醒定时器指的是一个定时器,而并非唤醒某个定时器的事件或者动作。
唤醒定时器的用途:当给芯片复位或某个事件将处理器从掉电模式唤醒时,需要唤醒定时器来确保振荡器和芯片所需要的其它模拟电路在处理器开始执行指令之前能够正确工作。 唤醒定时器的工作完全由硬件控制,不需要用户干预。
137
5.4.4 唤醒定时器 选讲 唤醒定时器——与时钟的关系
在检测到第一个有效的时钟后,唤醒定时器需要对4096个时钟计数,这段时间可使Flash进行初始化。在Flash存储器初始化结束时,如果外部复位已撤除,处理器开始执行指令。 复位或掉电唤醒 振荡器输出 时钟产生单元 启动 唤醒定时器 启动 唤醒定时器 计数4096个时钟后控制开关闭合 复位或掉电唤醒 对输入时钟计数
138
5.4.4 唤醒定时器 选讲 唤醒定时器——与外部中断的关系
如果使能了外部中断唤醒功能,并且所选中断事件出现,那么唤醒定时器将被启动。如果向量中断控制器(VIC)的中断功能也使能,那么实际的中断在唤醒定时器停止后产生。
139
5.4.5 外部中断 (一) 外部中断介绍 (二) 外部中断操作 (三) 外部中断应用示例 (四) 外部中断使用要点
140
5.4.5 外部中断 (一)外部中断介绍 外部中断是通过引脚输入符合要求的信号而触发的中断。LPC2114/2124/2212/2214含有4个外部中断输入(由引脚连接模块控制)。外部中断可将处理器从掉电模式中唤醒。
141
5.4.5 外部中断 外部中断内部示意图 管脚 连接控制 外部中断 极性控制 方式控制 掉电 唤醒控制 中断标志 CPU 其它部件 (4)
PINSELx EXTPOLAR EXTMODE EXTINT EXTWAKE (4) 管脚 连接控制 掉电 唤醒控制 外部中断 极性控制 外部中断 方式控制 (1) 中断标志 (2) (3) (5) 1.可作为外部中断输入的引脚; 3.控制触发外部中断的信号波形; 2.控制某几个引脚作为外部中断输入; 4.控制外部中断产生后是否唤醒CPU; 5.外部中断产生后设置的标志位;
142
5.4.5 外部中断 (二)外部中断操作 正确使用LPC2000芯片的外部中断有如下操作: 设定触发条件 中断相关操作 CPU唤醒控制
引脚设置
143
5.4.5 外部中断 (1) 设定触发条件 模式设置:0-电平触发 1-边沿触发 外部中断模式寄存器(EXTMODE) 位 7 : 4 3
2 1 功能 - EXTMODE3 EXTMODE2 EXTMODE1 EXTMODE0 模式设置:0-电平触发 1-边沿触发
144
5.4.5 外部中断 (1) 设定触发条件 外部中断极性寄存器(EXTPOLAR) 极性设置:0-低电平/下降沿触发 1-高电平/上升沿触发
位 7 : 4 3 2 1 功能 - EXTPOLAR3 EXTPOLAR2 EXTPOLAR1 EXTPOLAR0 极性设置:0-低电平/下降沿触发 1-高电平/上升沿触发
145
5.4.5 外部中断 (1) 设定触发条件 根据模式寄存器和极性寄存器,可以组合得到不同的触发条件: 外部中断极性 控制寄存器
(EXTPOLAR) 外部中断方式 (EXTMODE) 外部中断触发信号 波形 说明 低电平 1 下降沿 高电平 上升沿
146
5.4.5 外部中断 (2) 中断相关操作 只要发生了外部中断,在外部中断标志寄存器相应的位就会置1。如果系统使能了相应中断(4个外部中断的通道号分别为14~17),将会产生中断异常。 位 7 : 4 3 2 1 功能 - EINT3 EINT2 EINT1 EINT0 外部中断标志:产生中断,该位置1,写入1清除中断标志 在电平触发方式下,只有在引脚处于无效状态时才能清除中断标志。 如设置为低电平中断,则只有在中断引脚恢复为高电平后才能清除中断标志。
147
5.4.5 外部中断 (2) 中断相关操作 void __irq IRQ_Eint0 (void) { ;中断处理
/* 等待外部中断信号恢复为高电平 若信号保持为低电平,中断标志会一直置位。*/ while ((EXTINT & 0x01) != 0) EXTINT = 0x01; /* 清除EINT0中断标志*/ } VICVectAddr = 0; /* 向量中断结束 */
148
5.4.5 外部中断 (3) CPU唤醒控制 外部中断唤醒寄存器(EXTWAKE) 1-使能CPU唤醒功能
位 7 : 4 3 2 1 功能 - EXTWAKE3 EXTWAKE2 EXTWAKE1 EXTWAKE0 1-使能CPU唤醒功能 实现掉电唤醒不需要在向量中断控制器(VIC)中使能相应的中断。
149
5.4.5 外部中断 (4)外部中断引脚设置 通过软件设置引脚选择寄存器(PINSELx),可以将多个引脚同时作为同一个外部中断的输入引脚。EINT3~EINT0外部中断的逻辑电路接受所有与之相连引脚的状态和信号。
150
5.4.5 外部中断 (4)外部中断引脚设置 根据其方式位和极性位的不同,外部中断逻辑处理如下:
低电平触发方式: 作为EINT功能的全部引脚的 状态相与后作为输入信号; 高电平触发方式: 作为EINT功能的全部引脚的状态相或后作为输入信号; 边沿触发方式: 只使用GPIO端口号最低的那个引脚,并且与极性设置无关。
151
5.4.5 外部中断 (三)外部中断应用示例 例1:设置EINT0为低电平触发中断 步骤:
1.设置引脚连接模块,将P0.16设置为外部中断功能; 2.设置中断方式寄存器,将外部中断0设置为电平触发; 3.设置中断极性寄存器,将外部中断0设置为低电平触发; C代码: ... PINSEL1 = (PINSEL1 & 0xFFFFFFFC) | 0x01; EXTMODE &= 0x0E; EXTPOLAR &= 0x0E; (1) (2) (3)
152
5.4.5 外部中断 (三)外部中断应用示例 例2:设置EINT0为下降沿触发中断 步骤:
1.设置引脚连接模块,将P0.16设置为外部中断功能; 2.设置中断方式寄存器,将外部中断0设置为边沿触发; 3.设置中断极性寄存器,将外部中断0设置为下降沿触发; C代码: ... PINSEL1 = (PINSEL1 & 0xFFFFFFFC) | 0x01; EXTMODE |= 0x01; EXTPOLAR &= 0x0E; (1) (2) (3)
153
5.4.5 外部中断 (四)外部中断使用要点 (1)把某个引脚设置为外部中断功能后,该引脚为输入模式,由于没有内部上拉电阻,所以必须外接一个上拉电阻,确保引脚不被悬空; (2)除了引脚连接模块的设置,还需确设置VIC模块,才能产生外部中断,否则外部中断只能反映在EXTINT寄存器中。 (3)要使器件进入掉电模式并通过外部中断唤醒,软件应该正确设置引脚的外部中断功能,再进入掉电模式。
154
5.4.6 存储器重映射控制 (一) 存储器重映射的必要性 (二) 异常向量表来源 (三) 存储器重映射操作 (四) 存储器重映射原理和效果
(五) BOOT程序和存储器重映射 (六) 存储器重映射应用
155
5.4.6 存储器重映射控制 (一)存储器重映射的必要性
发生异常后,内核程序将跳转到0x ~0x F的地方,寻找异常向量表,寻找对应的异常入口。 异常向量表 AREA vectors,CODE,READONLY ENTRY Reset LDR PC, ResetAddr LDR PC, UndefinedAddr LDR PC, SWI_Addr LDR PC, PrefetchAddr LDR PC, DataAbortAddr . . . 0x 开始 复位入口 指令未定义中止入口 软件中断入口 预取指中止入口 取数据中止入口 . . .
156
5.4.6 存储器重映射控制 (一)存储器重映射的必要性
(2)如果程序代码在内部SRAM中,则其异常向量表位于0x ~0x F上,但内核寻址依然是0x ~0x F,显然不能找到异常向量表,不能实现正确跳转。 异常向量表 AREA vectors,CODE,READONLY ENTRY Reset LDR PC, ResetAddr LDR PC, UndefinedAddr LDR PC, SWI_Addr LDR PC, PrefetchAddr LDR PC, DataAbortAddr . . . 0x 开始 复位入口 指令未定义中止入口 软件中断入口 预取指中止入口 取数据中止入口 . . .
157
5.4.6 存储器重映射控制 (一)存储器重映射的必要性
(2)如果程序代码在内部SRAM中,则其异常向量表位于0x ~0x F上,但内核寻址依然是0x ~0x F,显然不能找到异常向量表,不能实现正确跳转。 0x ~0x F 实际向量 表地址 0x F SRAM 0x 0x ~0x F 内核寻址 0x F 0x
158
5.4.6 存储器重映射控制 (一)存储器重映射的必要性
(2)如果程序代码在外部存储器中,则其异常向量表位于0x ~0x F上,但内核寻址依然是0x ~0x F,显然不能找到异常向量表,不能实现正确跳转。 异常向量表 AREA vectors,CODE,READONLY ENTRY Reset LDR PC, ResetAddr LDR PC, UndefinedAddr LDR PC, SWI_Addr LDR PC, PrefetchAddr LDR PC, DataAbortAddr . . . 0x 开始 复位入口 指令未定义中止入口 软件中断入口 预取指中止入口 取数据中止入口 . . .
159
5.4.6 存储器重映射控制 (一)存储器重映射的必要性
(2)如果程序代码在外部存储器中,则其异常向量表位于0x ~0x F上,但内核寻址依然是0x ~0x F,显然不能找到异常向量表,不能实现正确跳转。 0x ~0x F 外部存储器 实际向量 表地址 0x F 0x 0x ~0x F 内核寻址 0x F 0x
160
5.4.6 存储器重映射控制 (一)存储器重映射的必要性 如何解决异常向量表和ARM内核寻址不一致的问题,这就引入了存储器重映射机制。
0x ~ 0x F 外部存储器 0x F 实际向量 表地址 0x 将其它地方的异常向量表重新映射到ARM内核寻址区域。 存储器重映射 0x ~ 0x F 内核寻址 0x F 0x
161
5.4.6 存储器重映射控制 (二)异常向量表来源 异常向量表 可能存在的程序存储器 复位后用户看见的地址空间 Flash SRAM
BootBlock VPB外设 AHB外设 0x 0xFFFFFFFF 0x 0xE 0x 片外存储器 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 片外存储器 可能存在的程序存储器
162
5.4.6 存储器重映射控制 (二)异常向量表来源 异常向量表 可以来自 内部Flash 复位后用户看见的地址空间 0xFFFFFFFF
SRAM BootBlock VPB外设 AHB外设 0x 0xFFFFFFFF 0x 0xE 0x 片外存储器 AREA vectors,CODE,READONLY ENTRY Reset LDR PC, ResetAddr LDR PC, UndefinedAddr LDR PC, SWI_Addr LDR PC, PrefetchAddr LDR PC, DataAbortAddr . . .
163
5.4.6 存储器重映射控制 (二)异常向量表来源 异常向量表 可以来自 内部SRAM 复位后用户看见的地址空间 0xFFFFFFFF
Flash SRAM BootBlock VPB外设 AHB外设 0x 0xFFFFFFFF 0x 0xE 0x 片外存储器 AREA vectors,CODE,READONLY ENTRY Reset LDR PC, ResetAddr LDR PC, UndefinedAddr LDR PC, SWI_Addr LDR PC, PrefetchAddr LDR PC, DataAbortAddr . . .
164
5.4.6 存储器重映射控制 (二)异常向量表来源 异常向量表 可以来自 Boot Block 复位后用户看见的地址空间
Flash SRAM BootBlock VPB外设 AHB外设 0x 0xFFFFFFFF 0x 0xE 0x 片外存储器 AREA vectors,CODE,READONLY ENTRY Reset LDR PC, ResetAddr LDR PC, UndefinedAddr LDR PC, SWI_Addr LDR PC, PrefetchAddr LDR PC, DataAbortAddr . . .
165
5.4.6 存储器重映射控制 (二)异常向量表来源 异常向量表 可以来自 外部存储器 复位后用户看见的地址空间 0xFFFFFFFF
Flash SRAM BootBlock VPB外设 AHB外设 0x 0xFFFFFFFF 0x 0xE 0x 片外存储器 AREA vectors,CODE,READONLY ENTRY Reset LDR PC, ResetAddr LDR PC, UndefinedAddr LDR PC, SWI_Addr LDR PC, PrefetchAddr LDR PC, DataAbortAddr . . .
166
5.4.6 存储器重映射控制 (三)存储器重映射操作 异常向量表有3/4个来源(内部Flash、内部RAM、BootBlock和外部存储器),在何种情况下选择哪一个向量表映射到0x ~0x F,通过存储器映射控制寄存器实现。 位 7 6 5 4 3 2 1 功能 - MAP[1:0] 重映射控制:决定向量表的来源
167
5.4.6 存储器重映射控制 (三)存储器重映射操作 Boot装载程序模式。异常向量表从Boot Block重新映射。
MAP[1:0] 映射方式 00 Boot装载程序模式。异常向量表从Boot Block重新映射。 01 片内Flash模式。异常向量表不重新映射,它位于Flash中。 10 片内RAM模式。异常向量表从静态RAM重新映射。 11 外部存储器模式。异常向量表从外部存储器重新映射。该模式仅适用于LPC2200系列。 在芯片复位时,MEMMAP值为0。 注意:重映射后,异常向量表仍继续出现在初始位置。
168
5.4.6 存储器重映射控制 存储器重映射效果 转换前 内核地址总线值 MEMMAP值 转换后 存储器地址总线值
0x ~0x F 00 0x7FFFE000~0x7FFFE03F 01 10 0x ~0x F 11 0x ~0x F 0x ~0xFFFFFFFF 任意 对应不变
169
5.4.6 存储器重映射控制 存储器重映射效果 复位后用户看见的地址空间 0xFFFFFFFF AHB外设 VPB外设 0xE0000000
Flash SRAM BootBlock VPB外设 AHB外设 0x 0xFFFFFFFF 0x 0xE 0x 片外存储器 MEMMAP[1:0]= 0 1 1 0 1 1 0 0 不重新映射
170
5.4.6 存储器重映射控制 (五) Bootloader和存储器重映射
芯片复位时,MEMMAP值为0。运行的Boot程序,Boot程序根据下表最左栏的判断条件来修改MEMMAP值,控制程序运行。 判断条件 MAP[1:0] 说明 微控制器型号 片内Flash中用户代码有效 01 从内部Flash执行用户程序 LPC2114/2124 1.引脚BOOT1:0不全为高电平 2.芯片没有加密 11 从外部Flash执行程序 LPC2210/2212/2214 1.引脚BOOT1:0全为高电平 2.片内Flash中用户代码有效 从内部Flash执行程序 2212/2214
171
5.4.6 存储器重映射控制 (五) Bootloader和存储器重映射 LPC2100 Bootloader在此检测特定引脚
复位后 MEMMAP=00 进入ISP状态吗? (P0.14为低) 复位 运行ISP服务程序 看门狗复位 根据硬件 (P1.20、P1.26) 配置 初始化 用户代码 是否有效 执行用户代码 (片内Flash: 0x ) N Y 复位 LPC2100 Bootloader在此检测特定引脚 检测用户代码是否有效 用户代码有效且P0.14为高电平 设定MEMMAP=01 执行用户代码 (片内Flash: 0x ) 其它情况下 MEMMAP=00 运行ISP服务程序
172
5.4.6 存储器重映射控制 (五) Bootloader和存储器重映射 LPC2200 Bootloader在此检测特定引脚
复位后 MEMMAP=00 复位 看门狗复位 进入ISP模式? (P0.14为低) 初始化 用户代码 是否有效 芯片加密 允许调试 外部引导 运行ISP服务程序 执行外部用户代码 (0x ) 执行内部用户代码 (0x ) N Y 复位 LPC2200 Bootloader在此检测特定引脚 检测用户代码是否有效 芯片未加密且 BOOT引脚不全为高 MEMMAP=11 BOOT引脚全为高且 用户代码有效 MEMMAP=01 其它情况下 MEMMAP=00 执行外部用户代码 (0x ) 执行内部用户代码 (0x ) 运行ISP服务程序
173
5.4.6 存储器重映射控制 (六) 存储器重映射应用 动态修改异常向量表
在某些应用中,为了能动态修改异常向量表的内容,需要把异常向量表放在RAM中,并设置存储器映射控制寄存器(MEMMAP)。
174
5.4.6 存储器重映射控制 (六) 存储器重映射应用 动态修改异常向量表 操作流程
1.将异常向量表从Flash中复制到内部SRAM的0x 到0x F地址处,并修改。 2.设置MEMMAP值为2,即从内部SRAM重映射,使用修改后的向量表。
175
5.4.6 存储器重映射控制 (六) 存储器重映射应用 动态修改异常向量表 程序代码 操作流程
. . . cp1 = uint32(Vectors); cp2 = 0x ; for(i=0; i<16; i++) { *cp2++ = *cp1++; } MEMMAP = 2; 操作流程 1.将异常向量表从Flash中复制到内部SRAM的0x 到0x F地址处,并修改。 2.设置MEMMAP值为2,即从内部SRAM重映射,使用修改后的向量表。
176
5.4.6 存储器重映射控制 存储器重映射说明 (1)重映射允许在不同情况下处理异常 (2)BOOT程序会根据硬件设置重映射关系
(3)在调试模式下,重映射完全由用户控制
177
5.4.7 功率控制 (一) 功率控制实现方式 (二) 功率控制操作 (三) 功率控制要点
178
5.4.7 功率控制 (一)功率控制实现方式 LPC2000系列芯片功耗很低,具有多种能耗管理方式: (1)空闲模式 (2)掉电模式
(3)独立的外设功耗管理。
179
5.4.7 功率控制 (1)空闲模式 在该模式下,内核停止执行指令,直到发生复位或中断为止,但系统时钟CCLK一直有效。外设功能在空闲模式下继续保持并可产生中断使处理器恢复运行。空闲模式使处理器、存储器系统和相关控制器以及内部总线不再消耗功率。
180
5.4.7 功率控制 (2)掉电模式 在该模式下,振荡器关闭,这样芯片没有任何内部时钟。处理器状态和寄存器、外设寄存器以及内部SRAM值在掉电模式下被保持。芯片引脚的逻辑电平保持掉电时的状态。复位或特定的不需要时钟仍能工作的中断可终止掉电模式并使芯片恢复正常运行。由于掉电模式使芯片所有的动态操作都挂起,因此芯片的功耗降低到几乎为零。
181
5.4.7 功率控制 功耗与IO口的状态有关。 (3)两种模式对比 模式类别 内部时钟 外设工作 芯片状态 唤醒方式 功耗 空闲 有 是
保持 复位、任何中断 低 掉电 无 需要时钟支持的外设停止工作 复位、不需要时钟支持的中断 几乎为零 功耗与IO口的状态有关。
182
5.4.7 功率控制 (二)功率控制操作 (1)模式控制 掉电模式 空闲模式
控制芯片进入空闲或者掉电模式,通过功率控制寄存器(PCON)进行。 位 7 6 5 4 3 2 1 功能 - PD IDL 掉电模式 空闲模式
183
5.4.7 功率控制 (2)外设功率控制 实现方式: (1)对于需要时钟的外设,关闭特定外设的时钟源。
(2)不需要时钟的外设,有独立的功耗控制位。 关闭选定外设的时钟源来禁止该外设功能以降低功耗。芯片中有部分外设不能被关闭,分别为看门狗定时器、GPIO、引脚连接模块和系统控制模块。 应用: 在使用外设的时候才使该能外设,不使用的时候关闭以降低功耗,动态管理功耗。
184
5.4.7 功率控制 外设功率控制寄存器 外设功率控制寄存器(PCONP)——2112/2114: 位 功能 控制外设 - 保留 1
- 保留 1 PCTIM0 定时器0 2 PCTIM1 定时器1 3 PCURT0 串口0 4 PCURT1 串口1 5 PCPWM0 PWM0 6 7 PCI2C I2C 位 功能 控制外设 8 PCSPI0 SPI0 9 PCRTC RTC 10 PCSPI1 SPI1接口 11 - 保留 12 PCAD A/D转换器 13 14 15
185
5.4.7 功率控制 外设功率控制寄存器 外设功率控制寄存器(PCONP)——2210/2212/2214:
位 功能 控制外设 - 保留 1 PCTIM0 定时器0 2 PCTIM1 定时器1 3 PCURT0 串口0 4 PCURT1 串口1 5 PCPWM0 PWM0 6 7 PCI2C I2C 位 功能 控制外设 8 PCSPI0 SPI0 9 PCRTC RTC 10 PCSPI1 SPI1接口 11 PCEMC EMC部件 12 PCAD A/D转换器 13 - 保留 14 15 注意:在运行片外存储器的程序时,不要设置PCEMC为0,否则由于EMC关闭,会导致程序运行错误。
186
5.4.7 功率控制 (三)功率控制注意要点 (1)芯片复位后,硬件设置PCONP的值为使能芯片内所有的接口和外围模块。
187
本节重点 本节主要讲述了LPC2000 ARM系统控制部分的内容,重点内容有: (1)时钟部分的PLL和分频器操作 (2)复位电路
(3)外部中断 (4)存储器重映射 (5)功率控制
188
5.5 存储器加速模块(MAM) 5.5.1 存储器加速的必要性 5.5.2 存储器加速作用的实现 5.5.3 MAM使用操作
5.5.4 存储器加速实验
189
5.5.1 存储器加速的必要性 FLASH速度和系统性能瓶颈
LPC2000系列ARM内核工作频率为60/70MHz,普通Flash访问速度为70/90/120ns,LPC2000系列ARM内置Flash为50ns。使用50ns的Flash,其最高访问速度为20MHz,远远低于ARM工作速度,在这种情况下,Flash的访问瓶颈极大的影响了系统性能。提高Flash的性能成为关键问题。 Philips为提高系统性能使用的方法: (1)扩展总线宽度; (2)使用存储器加速模块。两者结合使用,业内最快的ARM7。
190
5.5.2 存储器加速作用的实现 (一)MAM结构 总线 LPC2000系列芯片的MAM具有两种不同的结构。 接口
存储器数据 LPC2000系列芯片的MAM具有两种不同的结构。 (1)只使用1个Flash存储器组。 (2)使用两个Flash存储器组; Flash 存储器组 ARM局部总线 缓冲区 存储器数据 只有1个存储器组的MAM
191
5.5.2 存储器加速作用的实现 (一)MAM结构 总线 接口 Flash 存储器组0 存储器组1
分支跟踪缓存 总线 接口 Flash 存储器组0 存储器组1 预取指缓存 数据缓存区 选择 ARM局部总线 2×128位 (一)MAM结构 LPC2000系列芯片的MAM具有两种不同的结构。 (1)只使用1个Flash存储器组。 (2)使用两个Flash存储器组; 具有2个存储器组的MAM
192
5.5.2 存储器加速作用的实现 (一)MAM结构 总线 接口 Flash 存储器组0 存储器组1 不管什么结构,都包含3个缓冲区:
分支跟踪缓存 总线 接口 Flash 存储器组0 存储器组1 预取指缓存 数据缓存区 选择 ARM局部总线 2×128位 (一)MAM结构 不管什么结构,都包含3个缓冲区: (1)预取指缓冲区 (2)分支跟踪缓冲区 (3)数据缓冲区 具有2个存储器组的MAM
193
5.5.2 存储器加速作用的实现 使能MAM模块后,ARM内核将通过MAM模块访问Flash存储器。
(1) LPC2000内部Flash和MAM都是128位宽度,每次读取128位数据/指令,即4条ARM指令或者8条Thumb指令。 (2) 将取指得到的指令和数据分类,分别放入预取指缓冲区、分支跟踪缓冲区和数据缓冲区。 -预取指缓冲区,存放将要执行的指令 -分支跟踪缓冲区,存放分支跳转指令 -数据缓冲区,存放数据
194
5.5.2 存储器加速作用的实现 (3) 发生跳转后,试图从缓冲区中取指 -当程序向前跳转时,尝试从预取指缓冲区取指。
-当程序向后跳转时,尝试从分支跟踪缓冲区取指。 -连续数据则从数据缓冲区中取数 (4) 如果程序跳转出缓存的范围,CPU将要停止,等待若干个周期,直到正确的指令从Flash中被读出。 说明:这里的若干个周期就是MAM操作所要设定的。
195
5.5.3 MAM使用操作 MAM缓冲区的加速作用对于用户是透明的,无需用户干预,但是当程序跳转出缓存的范围,CPU将要停止等待若干个周期,直到正确的指令从Flash中被读出。这个时间是必须由用户设定的。只有正确操作MAM才能让其发挥加速作用,正确使用MAM有如下相关操作: (1)控制MAM-包括使能/禁能MAM; (2)设置MAM-设置MAM的时间参数。
196
5.5.3 MAM使用操作 (1)控制MAM 控制MAM功能的使用状况:禁能、部分使能还是完全使能。通过存储器加速模块控制寄存器(MAMCR)进行操作。 位 7 6 5 4 3 2 [1 : 0] 功能 - 模式控制 MAMCR[1:0] 描述 00 禁止MAM功能 01 部分使能MAM功能 10 完全使能MAM功能 11 保留
197
5.5.3 MAM使用操作 (2)设置MAM 当程序跳转出缓存的范围,CPU将要停止等待若干个周期。这个周期数通过MAM定时寄存器(MAMTIM)设定。 位 7 6 5 4 3 [2 : 0] 功能 - 取指周期控制 MAMTIM[2:0]:决定使用多少个CCLK周期访问Flash存储器,这样可以调整MAM时序使其匹配处理器操作频率,具体关系如下表。
198
5.5.3 MAM使用操作 (2)设置MAM 标准:使CPU访问速度低于/等于Flash速度。 周期设定表格
MATIM[2:0] 描述 000 保留 100 取指周期为4个CCLK 001 取指周期为1个CCLK 101 取指周期为5个CCLK 010 取指周期为2个CCLK 110 取指周期为6个CCLK 011 取指周期为3个CCLK 111 取指周期为7个CCLK 设定值决定CPU访问Flash的频率,CCLK/N。 标准:使CPU访问速度低于/等于Flash速度。 如果设定后CPU访问Flash的频率已经低于Flash所允许的最高频率,则设定值越大,执行越慢。
199
5.5.3 MAM使用操作 (2)设置MAM 举例:CPU时钟CCLK=60MHz
MAMTIM=3,则访问Flash的频率降低为60/3=20MHZ,和Flash匹配,速度最快。 如果设置MAMTIM=4,其访问速度只有15MHz,速度下降。 但是,如果设定MAMTIM=2。其访问速度30MHz>20MHz,速度还是慢。
200
5.5.3 MAM使用操作 (2)设置MAM 操作流程: (1)将MAMCR设置为0,关闭MAM; (2)将定时值写入MAMTIM;
201
5.5.3 MAM使用操作 (3)MAM使用要点 (1)注意:存储器加速模块只对内部Flash有效,对内部SRAM和外部Flash或者外部SRAM都无效。 (2)推荐参数: -对于低于20MHz的系统时钟,建议使用1CCLK ; -对于20~40MHz的系统时钟,建议使用2CCLK; -对于40~60MHz的系统时钟,建议使用3CCLK; -对于60~80MHz的系统时钟,建议使用4CCLK。
202
5.5.3 MAM使用操作 (4)启动代码中的MAM C代码: 设置步骤: 1.关闭MAM模块;
. . . MAMCR = 0; #if Fcclk < MAMTIM = 1; #else #if Fcclk < MAMTIM = 2; MAMTIM = 3; #endif MAMCR = 2; 1.关闭MAM模块; 2.根据用户定义的系统时钟频率决定MAM定时寄存器的值; 系统时钟(CCLK) MAM定时值 < 20MHz 1 20~40MHz 2 40~60MHz 3 3.打开MAM模块,完全使能MAM模块;
203
5.5.4 存储器加速实验 演示使用和不使用MAM的效果差别
204
5.6 外部存储器控制器(EMC) 5.6.1 EMC概述 5.6.2 总线接口 5.6.3 参数设置 5.6.4 总线连接
205
5.6.1 EMC概述 外部存储器控制器(EMC)是一个AHB总线上的从模块 。 只有LPC2200系列的微控制器含有EMC模块 。
ARM7TDMI-S CPU AHB To VPB 桥 EMC VIC I2C串行接口 SPI串行接口 UART0 & 1 CAN 看门狗定时器 系统控制 外部中断 TIMER0/1 ADC 通用I/O PWM0 实时时钟 SRAM Flash AHB总线 ARM7 局部总线 系统功能 外部存储器控制器(EMC)是一个AHB总线上的从模块 。 EMC 只有LPC2200系列的微控制器含有EMC模块 。 EMC模块为AHB系统总线和外部存储器件之间提供了一个接口。
206
5.6.1 EMC概述 特性 (1)支持静态存储器,包括RAM、ROM、Flash、Burst ROM以及一些外部I/O器件。
(2)可支持数据宽度:8/16/32位,支持字节定位 (3)寻址地址范围:64M(A25:0) (4)支持4个存储器组,每个为16M (5)4个存储器组相互独立 (6)总线切换周期可编程 (7)可编程写保护
207
5.6.1 EMC概述 外部存储器地址空间 VPB/AHB外设 片外存储器 BootBlock 片内SRAM 片内Flash
0xFFFF FFFF 4.0G VPB/AHB外设 3.5G 0xE 片外存储器 2.0G 0x BootBlock 片内SRAM 0x 1.0G 片内Flash 0x 0.0G
208
5.6.1 EMC概述 EMC地址空间 2.0G+64M 0x83FF FFFF 存储器组3 (Bank3) 0x8300 0000
存储器组2 (Bank2) 0x 2.0G+32M 0x81FF FFFF 存储器组1 (Bank1) 0x 2.0G+16M 存储器组0 (Bank0) 0x80FF FFFF 0x 2.0G
209
5.6.2 总线接口 总线接口描述 引脚名 类型 引脚描述 D[31:0] 输入/输出 外部存储器数据线 A[23:0] 输出
外部存储器地址线 OE 输出使能信号,低有效 BLS 字节定位选择信号,低有效 WE 写使能信号,低有效 CS[3:0] 芯片选择信号,低有效(选择存储器组)
210
5.6.3 EMC参数设置 4个存储器组相互独立,每个组都有下列配置选项: (1)一个存储器组内部读写访问切换时间-总线竞争
(2)两个存储器组访问切换时间-总线竞争 (3)读访问长度(设定需要插入的等待周期数) (4)写访问长度(设定需要插入的等待周期数) (5)存储器组是否写保护 (6)总线宽度设置:8/16/32位
211
5.6.3 EMC参数设置 存储器组配置寄存器(BCFG3~0) 写访问长度 字节定位 读访问长度 空闲周期 总线宽度 写保护 位
23:16 15:11 10 9:5 4 3:0 功能 保留 WST2 RBLE WST1 IDCY 写访问长度 字节定位 读访问长度 空闲周期 位 31:30 29:28 27 26 25 24 功能 AT MW BM WP WPERR BUSERR 总线宽度 写保护
212
5.6.3 EMC参数设置 注意事项 (1)读写访问周期设置不能超过Flash实际能达到的最高访问速度。
(2)总线宽度设置复位值由管脚BOOT1:0决定,如果更改了配置寄存器的操作,必须保证寄存器所设定宽度和硬件一致。 (3)只有Bank0能程序引导启动。
213
5.6.3 EMC参数设置 启动代码中的EMC设置 C代码: 在LPC2200的启动代码中包含总线的初始化设置。 设置步骤:
. . . LDR R0, =PINSEL2 IF :DEF: EN_CRP LDR R1, =0x0f814910 ELSE LDR R1, =0x0f814914 ENDIF STR R1, [R0] LDR R0, =BCFG0 LDR R1, =0x1000ffef 1.设置引脚连接模块,将P2口用于外部存储器总线接口。 2.设置BANK0,将其设置为16位总线接口,使能字节定位功能,并把读写周期设置为最大,以兼容不同速度的外部存储器,实际应用中根据存储器的实际速度进行调整;
214
5.6.3 EMC参数设置 启动代码中的EMC设置 C代码: 3.设置BANK1,与BANK0的设置值相同;
. . . LDR R0, =BCFG1 LDR R1, =0x1000ffef STR R1, [R0] ; LDR R0, =BCFG2 ; LDR R1, =0x2000ffef ; STR R1, [R0] ; LDR R0, =BCFG3 3.设置BANK1,与BANK0的设置值相同; 4.BANK2和BANK3被设置为32位宽度其它与BANK0相同。因为在暂时没有使用到这两个BNAK,所以在此被屏蔽,需要使用时再进行设置;
215
5.6.4 总线连接 (1)如果存储器组配置成32位宽度,地址线A0和A1无用,可作为GPIO使用(由PINSEL2设置);
(3)如果存储器组配置成8位宽度,并且使能字节定位功能(RBLE=1),存储器的写信号由BLS[0]提供,否则由WE信号提供; (4)各存储器组相互独立,可配置为不同宽度和速度,但同一存储器组的器件宽度必须一致。
216
5.6.4 总线连接 思考: BANK0--16位 BANK1--32位 BANK2--8位 各存储器组该如何设置?
217
5.6.4 总线连接 连接示例—32位宽度 由1片32位宽度的存储器芯片构成32位存储器 由2片16位宽度的存储器芯片构成32位存储器
由4片8位的存储器芯片构成32位存储器
218
使用字节定位引脚BLS[0]作为写使能信号
连接示例——8/16位宽度 5.6.4 总线连接 由1片16位宽度的存储器芯片构成16位存储器 由2片8位宽度的存储器芯片构成16位存储器 使用字节定位引脚BLS[0]作为写使能信号 由1片8位宽度的存储器芯片构成8位存储器
219
5.7 引脚连接模块 内容概述 (一) 引脚连接模块的作用 (二) 如何使用引脚连接模块
220
5.7 引脚连接模块 (一)引脚连接模块的作用 LPC2000系列微控制器的大部分管脚都具有多种功能,但是同一引脚在同一时刻只能使用其中一个功能,通过配置相关寄存器控制多路开关来连接引脚与片内外设。 GPIO TXD0 PWM1输出 P0.0 通过引脚连接模块控制引脚功能
221
5.7 引脚连接模块 (二)如何使用引脚连接模块 LPC2000芯片,通过管脚连接模块来管理这些多功能管脚,对相应寄存器位进行正确设置即可。
5.7 引脚连接模块 (二)如何使用引脚连接模块 LPC2000芯片,通过管脚连接模块来管理这些多功能管脚,对相应寄存器位进行正确设置即可。 P0.15~P0.0-通过PINSEL0寄存器控制,每2位控制1个管脚。 P0.31~P0.16-通过PINSEL1寄存器控制,每2位控制1个管脚。 P1、P2和P3-通过PINSEL2控制。
222
5.7 引脚连接模块 P0口选择(PINSEL0) 表示寄存器中某两位的设定值 如PINSEL0[1:0]=01时,连接TXD0
5.7 引脚连接模块 PINSEL0 引脚名称 00 01 10 11 复位值 1:0 P0.0 GPIO P0.0 TxD0 PWM1 保留 3:2 P0.1 GPIO P0.1 RxD0 PWM3 EINT0 5:4 P0.2 GPIO P0.2 SCL 捕获0.0 7:6 P0.3 GPIO P0.3 SDA 匹配0.0 EINT1 9:8 P0.4 GPIO P0.4 SCK0 捕获0.1 11:10 P0.5 GPIO P0.5 MISO0 匹配0.1 13:12 P0.6 GPIO P0.6 MOSI0 捕获0.2 15:14 P0.7 GPIO P0.7 SSEL0 PWM2 EINT2 17:16 P0.8 GPIO P0.8 TxD1 PWM4 19:18 P0.9 GPIO P0.9 RxD1 PWM6 EINT3 21:20 P0.10 GPIO P0.10 RTS 捕获1.0 23:22 P0.11 GPIO P0.11 CTS 捕获1.1 25:24 P0.12 GPIO P0.12 DSR 匹配1.0 27:26 P0.13 GPIO P0.13 DTR 匹配1.1 29:28 P0.14 GPIO P0.14 CD 31:30 P0.15 GPIO P0.15 RI 表示寄存器中某两位的设定值 如PINSEL0[1:0]=01时,连接TXD0 PINSELx的每2位控制一个管脚: [9:8]表示PINSEL0寄存器的第9和8位
223
如:PINSEL[19:18]设置为01时,引脚P0.9的功能为RXD1
P0口选择(PINSEL0) 5.7 引脚连接模块 PINSEL0 引脚名称 00 01 10 11 复位值 1:0 P0.0 GPIO P0.0 TxD0 PWM1 保留 3:2 P0.1 GPIO P0.1 RxD0 PWM3 EINT0 5:4 P0.2 GPIO P0.2 SCL 捕获0.0 7:6 P0.3 GPIO P0.3 SDA 匹配0.0 EINT1 9:8 P0.4 GPIO P0.4 SCK0 捕获0.1 11:10 P0.5 GPIO P0.5 MISO0 匹配0.1 13:12 P0.6 GPIO P0.6 MOSI0 捕获0.2 15:14 P0.7 GPIO P0.7 SSEL0 PWM2 EINT2 17:16 P0.8 GPIO P0.8 TxD1 PWM4 19:18 P0.9 GPIO P0.9 RxD1 PWM6 EINT3 21:20 P0.10 GPIO P0.10 RTS 捕获1.0 23:22 P0.11 GPIO P0.11 CTS 捕获1.1 25:24 P0.12 GPIO P0.12 DSR 匹配1.0 27:26 P0.13 GPIO P0.13 DTR 匹配1.1 29:28 P0.14 GPIO P0.14 CD 31:30 P0.15 GPIO P0.15 RI 如:PINSEL[19:18]设置为01时,引脚P0.9的功能为RXD1
224
5.7 引脚连接模块 P0口选择(PINSEL1) PINSEL1 引脚名称 00 01 10 11 复位值 1:0 P0.16
5.7 引脚连接模块 PINSEL1 引脚名称 00 01 10 11 复位值 1:0 P0.16 GPIO P0.16 EINT1 匹配0.2 保留 3:2 P0.17 GPIO P0.17 捕获1.2 SCK1 匹配1.2 5:4 P0.18 GPIO P0.18 捕获1.3 MISO1 匹配1.3 7:6 P0.19 GPIO P0.19 MOSI1 9:8 P0.20 GPIO P0.20 SSEL1 EINT3 11:10 P0.21 GPIO P0.21 PWM5 13:12 P0.22 GPIO P0.22 捕获0.0 匹配0.0 15:14 P0.23 GPIO P0.23 17:16 P0.24 GPIO P0.24 19:18 P0.25 GPIO P0.25 21:20 P0.26 23:22 P0.27 GPIO P0.27 AIN0 捕获0.1 匹配0.1 25:24 P0.28 GPIO P0.28 AIN1 捕获0.2 27:26 P0.29 GPIO P0.29 AIN2 捕获0.3 匹配0.3 29:28 P0.30 GPIO P0.30 AIN3 31:30 P0.31
225
5.7 引脚连接模块 P1/P2/P3选择(PINSEL2) PINSEL2 描述 复位值 1:0 保留 00 2
5.7 引脚连接模块 PINSEL2 描述 复位值 1:0 保留 00 2 为0时,P1.31:26作GPIO使用 为1时,P1.31:26作调试端口使用 复位时将P1.26引脚电平取反后作为该位复位值 3 为0时,P1.25:16作GPIO使用 为1时,P1.25:16作跟踪端口使用 复位时将P1.20引脚电平取反后作为该位复位值 5:4 控制数据总线和选通引脚的使用 复位时将BOOT1:0引脚电平作为该域的复位值 6 当数据总线不占用P3.29时: 为1时,P3.29作GPIO使用 为0时,P3.29作AIN6使用 1 7 当数据总线不占用P3.28时: 为1时,P3.28作GPIO使用 为0时,P3.28作AIN7使用 8 为1时,P3.27作GPIO使用 为0时,P3.27作WE使用
226
5.7 引脚连接模块 P1/P2/P3选择(PINSEL2) PINSEL2 描述 复位值 10:9 保留 — 11
5.7 引脚连接模块 PINSEL2 描述 复位值 10:9 保留 — 11 为1时,P3.26作CS1使用 为0时,P3.26作GPIO使用 12 13 当地址总线不占用P3.23引脚时: 为1时,P3.23作外部总线时钟输出(XCLK)使用 为0时,P3.29作GPIO使用 15:14 为00时,P3.25作GPIO使用 为01时,P3.25作CS2使用 其它设置值保留 00 17:16 为00时,P3.24作GPIO使用 为01时,P3.24作CS3使用 19:18
227
5.7 引脚连接模块 P1/P2/P3选择(PINSEL2) PINSEL2 描述 复位值 20 当数据总线没有占用P2.29:28时:
5.7 引脚连接模块 PINSEL2 描述 复位值 20 当数据总线没有占用P2.29:28时: 为0时,P3.29:28作GPIO使用 为1时,保留 21 当数据总线没有占用P2.30时: 为0时,P2.30作GPIO使用 为1时,P2.30作AIN4使用 1 22 当数据总线没有占用P2.31时: 为0时,P2.31作GPIO使用 为1时,P2.31作AIN5使用 23 为0时,P3.0作GPIO使用 为1时,P3.0作地址线A0使用 复位时,BOOT1:0引脚都为低电平时,该位为1 24 为0时,P3.1作GPIO使用 为1时,P3.1作地址线A1使用 复位时,BOOT1引脚为低电平时,该位为1 27:25 控制P3.23/A23和P3.22/A2中的地址总线的数目 复位时,BOOT1:0引脚都为高电平时,该域为000,否则为111 31:28 保留
228
5.7 引脚连接模块 PINSEL2和总线宽度
229
5.7 引脚连接模块 PINSEL2和总线宽度 PINSEL2 [27:25] 000 001 010 011 100 101 110
5.7 引脚连接模块 PINSEL2和总线宽度 PINSEL2 [27:25] 000 001 010 011 100 101 110 111 地址总线宽度 无 A3:2 A5:2 A7:2 A11:2 A15:2 A19:2 A23:2
230
5.7 引脚连接模块 总线宽度设置总结 思考:BANK0--16位、BANK1--32位、BANK2--8位,各参数该如何设置?
5.7 引脚连接模块 总线宽度设置总结 1:BOOT1:0--设置CS0的宽度 2:PINSEL2--设置系统最宽宽度 3:BCFG3:0--设置各BANK宽度 思考:BANK0--16位、BANK1--32位、BANK2--8位,各参数该如何设置?
231
5.7 引脚连接模块 PINSEL2和JTAG调试 PINSEL2的Bit2是JTAG使能/禁能位,若该位为0,JTAG功能被禁止;若该位为1,则可进行JTAG调试。 LPC2000系列工程模板已经进行了正确设置。
232
5.7 引脚连接模块 使用示例 将P0.8、P0.9设置为TxD1、RxD1。
5.7 引脚连接模块 使用示例 将P0.8、P0.9设置为TxD1、RxD1。 通过查阅PINSEL0寄存器设置表,得到P0.9和P0.8的控制位为PINSEL0[19:16],当该域设置为[0101](0x05)时选择 RxD1和 TxD1 。 C代码: PINSEL0 = 0x05 << 16; 为了不影响别的管脚连接设置,通常选择下面的设置方法,即“读-改-写”的方法。 C代码: PINSEL0 = (PINSEL0 & 0xFFF0FFFF) | (0x05 << 16);
233
5.7 引脚连接模块 启动代码中的管脚设置 LPC2200系列微控制器是总线开放型芯片,其总线宽度可设置为8位、16位或32位,对于没有使用到的总线引脚(比如16位总线宽度时,D16~D31位没有使用),可作为GPIO使用。
234
5.7 引脚连接模块 启动代码中的管脚设置 C代码:
5.7 引脚连接模块 启动代码中的管脚设置 C代码: . . . LDR R0, =PINSEL2 IF :DEF: EN_CRP LDR R1, =0x0f814910 ELSE LDR R1, =0x0f814914 ENDIF STR R1, [R0] 如果在工程目标中选择RelInChip项,编译器将会预定义EN_CRP宏,PINSEL2被设置为0x0f814910,禁止JTAG调试(Bit2为0)。 当没有预定义EN_CRP宏时,PINSEL2被设置为0x0f814914,使能JTAG调试(Bit2为1)。
235
内容小结 前面3节主要讲述了MAM、EMC和管脚连接模块,重点内容有: (1)MAM参数设置 (2)EMC和总线 (3)如何选择管脚连接
236
5.8 向量中断控制器(VIC) 5.8.1 VIC概述 5.8.2 FIQ 5.8.3 向量IRQ 5.8.4 非向量IRQ
237
5.8.1 VIC概述 (一) VIC特性 (二) VIC的作用 (三) 中断源 (四) 中断分类
238
5.8.1 VIC概述 (一)VIC特性 (1)ARM PrimeCellTM向量中断控制器 (2)最多32个中断请求输入
(3)16个向量IRQ中断 (4)16个优先级,可动态分配 (5)可产生软件中断
239
5.8.1 VIC概述 (二)VIC作用 LPC2000芯片内部的大部分外围模块都可以产生中断,有的还有多个中断,如何管理这些中断?向量中断控制器的作用就是允许哪些中断源可以产生中断、产生哪类中断、中断产生后执行哪段服务程序(必须使能内核中断)。 ARM7TDMI-S IRQ FIQ VIC 中断请求输入0 中断请求输入31 . . .
240
5.8.1 VIC概述 (三)中断源 模块 可产生中断的标志 VIC通道号 WDT 看门狗中断(WDINT) — 保留给软件中断 1
— 保留给软件中断 1 ARM内核 EmbeddedICE,DbgCommRx 2 EmbeddedICE,DbgCommTx 3 定时器0 匹配0~3(MR0,MR1,MR2,MR3) 捕获0~3(CR0,CR1,CR2,CR3) 4 定时器1 5 UART0 Rx线状态(RLS),发送保持寄存器空(THRE) Rx数据可用(RDA),字符超时指示(CTI) 6
241
5.8.1 VIC概述 (三)中断源 模块 可产生中断的标志 VIC通道号 UART1 Rx线状态(RLS),发送保持寄存器空(THRE)
Rx数据可用(RDA),字符超时指示(CTI) 7 PWM0 匹配0~6 (MR0,MR1,MR2,MR3,MR4,MR5,MR6) 8 I2C SI(状态改变) 9 SPI0 SPI中断标志(SPIF),模式错误(MODF) 10 SPI1 11 PLL PLL锁定(PLOCK) 12 RTC 计数器增加(RTCCIF),报警(RTCALF) 13
242
5.8.1 VIC概述 (三)中断源 中断相关寄存器和通道号有对应关系。 模块 可产生中断的标志 VIC通道号 系统控制
外部中断0(EINT0) 14 外部中断1(EINT1) 15 外部中断2(EINT2) 16 外部中断3(EINT3) 17 A/D A/D转换器 18 保留 19~31 中断相关寄存器和通道号有对应关系。
243
5.8.1 VIC概述 (四)中断分类 (1) 快速中断(FIQ)-最高优先级,处理迅速,常用于重要/紧急事件。
-FIQ模式,私有寄存器多(ARM没有硬件堆栈) -单一入口,1次跳转
244
5.8.1 VIC概述 (四)中断分类 (2) 向量IRQ中断-中等优先级,处理比较迅速,常用于处理较重要的事件。 -IRQ模式
-一个入口,多个处理程序 -硬件确定中断源和处理地址,2步跳转
245
5.8.1 VIC概述 (四)中断分类 (3) 非向量IRQ中断-最低优先级,处理较慢,常用于处理一般中断事件。 -IRQ模式
-一个入口,多个处理程序 -2步跳转,软件判断中断源
246
FIQ (一) 如何选择一个中断为FIQ? (二) 如何编写FIQ服务程序? (三) FIQ跳转过程
247
5.8.2 FIQ (一)如何选择一个中断为FIQ中断?
通过中断选择寄存器(VICIntSelect)进行选择,将中断源对应的位置1即选择该中断为FIQ。 位 31 … 18 17 2 1 功能 保留 A/D转换器 外部中断3 ARM内核 — WDT 1-快速中断 0-IRQ中断
248
5.8.2 FIQ (二)如何编写FIQ中断服务程序?
FIQ有唯一的处理入口,在其处理函数位置编写代码即可。在LPC2000的模板中,直接在target.c的FIQ_Exception()函数处编写。
249
FIQ 异常向量表: 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 (三) FIQ跳转过程 一旦产生FIQ中断,微控制器切换到FIQ模式,并跳转到向量表0x001C地址执行指令,然后跳转到FIQ_Handler代码段。
250
当某位为1时表示对应位的中断源产生FIQ中断请求。
最好不要将多个中断源分配给FIQ。如果非要这样,只能在软件中判断中断源(通过FIQ状态寄存器VICFIQStatus),会增加FIQ处理延迟。 FIQ状态寄存器(VICFIQStatus): 位 [31:0] 功能 当某位为1时表示对应位的中断源产生FIQ中断请求。
251
FIQ FIQ实验 演示FIQ使用
252
5.8.3 向量IRQ (一) 如何选择一个中断为向量IRQ? (二) 如何为向量IRQ分配优先级?
253
5.8.3 向量IRQ (一)如何选择一个中断为IRQ中断?
通过中断选择寄存器(VICIntSelect)进行选择,将中断源对应的位清0即选择该中断为IRQ中断。默认情况下所有中断都为IRQ中断。 位 31 … 18 17 2 1 功能 保留 A/D转换器 外部中断3 ARM内核 — WDT 0-IRQ中断 1-快速中断
254
5.8.3 向量IRQ (二)如何为向量IRQ中断分配优先级?
通过向量控制寄存器(VICVectCntl15~0)进行设置,寄存器编号越小,优先级越高。中断不能嵌套。 位 7 6 5 [4:0] 功能 - EN 中断源序号 写入1-使能该通道IRQ中断 分配优先级的同时必须同时使能该位 写入0-中断变为非向量IRQ
255
5.8.3 向量IRQ (三)如何设置向量IRQ中断服务程序地址?
将处理程序的地址写入优先级对应的向量中断地址寄存器VICVectAddr15~0即可。 向量地址寄存器(VICVectAddr0~15): 位 [31:0] 功能 中断服务程序入口地址 该寄存器中存放对应优先级向量IRQ中断服务程序的入口地址。 必须和向量控制寄存器指定的优先级通道一致。
256
5.8.3 向量IRQ (四)如何初始化向量IRQ? 1)选择中断源为IRQ中断 2)分配向量IRQ优先级通道
3)设置该优先级通道的中断服务程序地址 4)清除该中断源的所有中断标志 5)使能该中断源
257
5.8.3 向量IRQ (四)如何初始化向量IRQ? 示例,将外部中断0设置为向量IRQ中断:
VICIntSelect = 0x ; /* 设置所有中断分配为IRQ中断*/ VICVectCntl0 = 0x20 | 0x0e; /* 分配外部中断0到向量通道0*/ VICVectAddr0 = (uint32)IRQ_Eint0; /*设置中断服务程序地址*/ EXTINT = 0x01; /* 清除EINT0中断标志*/ VICIntEnable = 1 << 0x0e; /* 使能EINT0中断*/ 两者必须配对
258
5.8.3 向量IRQ (五)如何编写向量IRQ中断服务程序? 1)中断处理 2)清除中断标志
3)写VICVectAddr,更新VIC硬件优先级,以响应下次中断。
259
5.8.3 向量IRQ (五)如何编写向量IRQ中断服务程序? 示例,外部中断0服务程序:
void __irq IRQ_Eint0(void) { 中断处理; EXTINT = 0x01; /*清除EINT0中断标志*/ VICVectAddr = 0; /*更新VIC硬件优先级*/ }
260
5.8.3 向量IRQ 使用向量IRQ注意事项 -不要将多个中断源分配同一个优先级
-中断处理完毕,必须向向量地址寄存器VICVectAddr执行写操作,以更新VIC硬件优先级。
261
向量IRQ (六)向量IRQ地址跳转 在发生向量IRQ中断后,VIC能将对应中断的服务程序地址存入VICVectAddr寄存器中。在异常向量表的IRQ异常入口处放置一条指令,将VICVectAddr寄存器的内容装入程序计数器(PC),就可以跳转到当前中断的服务函数。 这样的设计可以减小中断响应延时。 位 [31:0] 功能 中断服务程序入口地址 向量地址寄存器(VICVectAddr)
262
5.8.3 向量IRQ (六)向量IRQ地址跳转 1.正在执行用户程序; 用户程序 中断服务程序 异常向量表 2.发生向量IRQ中断;
0x 0xFFFF FFFF 用户程序 中断服务程序 异常向量表 2.发生向量IRQ中断; 3.VIC硬件将中断服务程序地址装入VICVectAddr寄存器; ④ ⑤ ① 4.程序跳转至异常向量表中IRQ入口0x0018处; ② 5.执行指令跳转至VICVectAddr寄存器中的中断服务地址; ⑥ IRQ_Eint0() 6.中断服务程序执行完毕,返回被中断的用户程序继续执行被中断的代码。 ③ IRQ_Eint0 ??? VICVectAddr0 VICVectAddr ⑤ LDR PC, [PC, #-0xff0]
263
向量IRQ 向量IRQ中断实验 演示向量IRQ中断的使用
264
非向量IRQ (一) 如何选择一个中断为非向量IRQ? (二) 如何初始化非向量IRQ?
265
5.8.4 非向量IRQ (一) 如何设置中断为非向量IRQ中断?
通过设置中断服务程序的地址实现。当把中断服务程序的地址放到默认向量地址寄存器VICDefVectAddr后,该中断就被分配为非向量IRQ。 默认向量地址寄存器(VICDefVectAddr): 位 [31:0] 功能 中断服务程序入口地址 VICDefVectAddr寄存器存放非向量中断服务程序的入口地址,当发生非向量中断时该寄存器中保存的地址存入VICVectAddr寄存器。
266
5.8.4 非向量IRQ (二) 如何初始化非向量IRQ中断? 1)选择中断源为IRQ中断
2)在VICDefVectAddr中设置中断服务程序地址 3)清除该中断源的所有中断标志 4)使能该中断源
267
5.8.4 非向量IRQ (二) 如何初始化非向量IRQ中断? 示例,将外部中断0设置为非向量IRQ中断:
VICIntSelect = 0x ; /*设置所有中断分配为IRQ中断*/ VICDefVectAddr = (int)IRQ_Eint0; /*设置中断服务程序地址*/ EXTINT = 0x01; /*清除EINT0中断标志*/ VICIntEnable = 1 << 0x0e; /*使能EINT0中断*/
268
5.8.4 非向量IRQ 使用非向量IRQ注意事项 -如果将多个中断源分配为非向量中断,必须在服务程序中判断中断源。
-中断处理完毕,必须向向量地址寄存器VICVectAddr执行写操作,更新VIC硬件优先级,以响应下次中断。
269
5.8.5 VIC其它操作 (一) 中断的使能和禁能 (二) 中断如何查询中断状态 (三) 软件中断 (四) 中断寄存器保护
(五) 中断返回 (六) 3种中断比较
270
VIC其它操作 (一)中断的使能和禁能 不管中断被分配为什么类型,通过中断使能寄存器VICIntEnable可将其使能,通过中断使能清零寄存器VICIntEnClr可禁止相应中断。 中断使能寄存器(VICIntEnable): 位 31 … 18 17 2 1 功能 保留 A/D转换器 外部中断3 ARM内核 — WDT 写入1-允许对应中断源产生中断
271
VIC其它操作 (一)中断的使能和禁能 不管中断被分配为什么类型,通过中断使能寄存器VICIntEnable可将其使能,通过中断使能清零寄存器VICIntEnClr可禁止相应中断。 中断使能清零寄存器(VICIntEnClr): 位 31 … 18 17 2 1 功能 保留 A/D转换器 外部中断3 ARM内核 — WDT 写入1-禁止对应中断源产生中断
272
5.8.5 VIC其它操作 (二)如何查询中断状态? 不分类-查询所有中断状态寄存器(VICRawIntr)。
FIQ-查询FIQ状态寄存器(VICFIQStatus)。 IRQ-查询IRQ状态寄存器(VICIRQStatus)。 所有中断状态寄存器(VICRawIntr): 位 [31:0] 功能 1:表示对应位的中断源产生中断请求,不管中断是否分类。 0:对应中断请求没有请求或者软件中断未声明。
273
当某位为1时表示对应位的中断源产生FIQ中断请求。
VIC其它操作 (二)如何查询中断状态? 不分类-查询所有中断状态寄存器(VICRawIntr)。 FIQ-查询FIQ状态寄存器(VICFIQStatus)。 IRQ-查询IRQ状态寄存器(VICIRQStatus)。 FIQ状态寄存器(VICFIQStatus): 位 [31:0] 功能 当某位为1时表示对应位的中断源产生FIQ中断请求。
274
当某位为1时表示对应位的中断源产生IRQ中断请求。
VIC其它操作 (二)如何查询中断状态? 不分类-查询所有中断状态寄存器(VICRawIntr)。 FIQ-查询FIQ状态寄存器(VICFIQStatus)。 IRQ-查询IRQ状态寄存器(VICIRQStatus)。 IRQ状态寄存器(VICIRQStatus): 位 [31:0] 功能 当某位为1时表示对应位的中断源产生IRQ中断请求。
275
5.8.5 VIC其它操作 (三)软件中断 在一些特殊场合或者调试时,可能需要使用软件强制产生某个中断请求。
软件中断寄存器(VICSoftInt): 位 [31:0] 功能 当某位为1时,将产生与该位相对应的中断请求。 软件中断清零寄存器(VICSoftIntClear): 位 [31:0] 功能 当某位为1时,将清零VICSoftInt寄存器中对应位
276
VIC其它操作 (四)中断寄存器保护 可通过使能VIC寄存器保护功能来增强系统的安全性。通过设置保护使能寄存器VICProtection实现。 保护使能寄存器(VICProtection): 位 [31:1] 功能 — 中断寄存器保护 写入1-VIC寄存器只能在特权模式下操作 写入0-VIC寄存器可以用户模式和特权模式下操作。
277
VIC其它操作 (五)中断返回 大多数中断处理完毕后,清除相应的中断标志,然后往向量地址寄存器VICVectAddr执行写操作即可返回,但某些中断标志无法清除,如WDT中断和PLL中断。该类中断只能通过禁止相应中断进行(中断使能清零寄存器VICIntEnClr)。
278
VIC其它操作 (六) 3种中断响应过程的比较 直接跳转 0x C FIQ入口 ;处理程序 发生FIQ异常 FIQ
279
5.8.5 VIC其它操作 (六) 3种中断响应过程的比较 VIC根据slot, 找到地址表 VICVectAddr0 程序0
程序1 0x IRQ入口 ;处理程序 VICVectAddr VICVectAddr2 程序2 ② ① 。。。 … VICVectAddr15 程序15 向量IRQ
280
5.8.5 VIC其它操作 (六) 3种中断响应过程的比较 ② ① 0x0000 0018 IRQ入口 ;处理程序 VICVectAddr
VICDefVectAddr 程序地址 ③ 在软件中查询,判断中断源 非向量IRQ
281
VIC其它操作 使用VIC的注意要点 (1)如果在片内RAM中调试程序,并使用了中断,那么必须将存储器映射控制设置为内部RAM模式; (2)将多个中断源设置为FIQ,将增加中断响应延时,所以建议FIQ中断只有一个中断源; (3)ADS1.2规定在定义中断服务函数(向量中断)时必须加入关键字“__irq”,保证函数返回时会切换处理器模式; (4)在退出中断服务程序时要清零相应外设的中断标志,以及VICVectAddr寄存器,为响应下次中断作好准备。
282
5.8.5 VIC其它操作 启动代码中的VIC设置 TargetResetInit函数:
... /* 初始化VIC */ VICIntEnClr = 0xffffffff; VICVectAddr = 0; VICIntSelect = 0; 在LPC2100、LPC2200的启动代码中包含有VIC初始化程序,默认是禁止所有中断。 处理器各模式堆栈设置: 在LPC2100、 LPC2200的启动代码中默认是关闭IRQ和FIQ中断的。如果用户需要使用这两个中断,则要设置CPSR寄存器的I位或F位,这需要在特权模式下处理。最简单的方法是在启动代码中设置(修改0xdf值)。 InitStack ... MSR CPSR_c,#0xdf LDR SP,=StackUsr MOV PC,R0
283
内容小结 本主要讲述了向量中断控制器,重点内容有: (1)中断的分类和标准 (2)各类中断的使用,向量IRQ (3)特殊应用
284
主题回顾 本主题主要讲述: 1. LPC2000系列ARM的特点 2. 各内部单元的特点、结构和使用
3. 特别注意PLL、MAM、VIC和管脚连接模块
Similar presentations