• 沒有找到結果。

功率控制注意事项

在文檔中 1.1 嵌入式系统 (頁 166-169)

第5章 LPC2000系列ARM硬件结构

3. 功率控制注意事项

复位后,PCONP 的值设置成使能所有接口和外围功能。除了对外围功能相关的寄存器 进行配置外,用户应用程序不要访问PCONP 寄存器以便启动使用片内的任何外围功能。

在需要控制功率的系统中,只要将应用中用到的外围功能的对应在PCONP 寄存器的位 置1,寄存器的其它“保留”位或当前无需使用的外围功能对应在寄存器中的位都必须清零。

5.4.12 唤醒定时器 描述

唤醒定时器的用途是:确保振荡器和芯片所需要的其它模拟电路在处理器开始执行指令 之前能够正确工作。这在所有类型的复位以及任何原因所导致上述功能关闭时非常重要。由 于振荡器和其它功能在掉电模式下关闭了,所以处理器从掉电模式中唤醒时必须使用唤醒定 时器。

唤醒定时器通过检测晶振是否能可靠地开始代码的执行来对其进行监视。当给芯片加电 或某个事件使芯片退出掉电模式,振荡器需要一段时间来产生足够振幅的信号驱动时钟逻 辑。时间的长度取决于许多因素,包括Vdd 的上升速率(上电时)、晶振的类型及其电气特 性(如果使用石英晶振)、任何其它外部电路(例如电容)和振荡器在现有环境下自身的特 性。

唤醒定时器与时钟的关系

一旦检测到一个时钟,唤醒定时器则对4096 个时钟计数,这段时间可使 Flash 进行初 始化。当Flash 存储器初始化完毕时,如果外部复位已撤除,处理器开始执行指令。当系统 使用外部时钟源时,需要考虑的振荡器的启动延时可能很短甚至没有。唤醒定时器的设计确 保了芯片所需要的任何其它功能在程序运行之前都能够进行操作。

总之,LPC2114/2124/2210/2212/2214 唤醒定时器是根据晶振的情况来执行最短时间的 复位,它在从掉电模式中唤醒或任何复位产生时激活。

外部中断与唤醒定时器

如果使能了外部中断唤醒功能,并且所选中断事件出现,那么唤醒定时器将被启动。实 际的中断(如果有)在唤醒定时器停止后产生,由向量中断控制器(VIC)进行处理。

要使器件进入掉电模式并通过外部中断唤醒,软件应该对引脚的外部中断功能重新编 程,选择中断合适的方式和极性,再进入掉电模式。唤醒时软件应恢复引脚复用的外围功能。

如果软件要使器件退出掉电模式来响应多个引脚共用的同一个EINTi 通道的事件,中断 通道必须编程设定为低电平激活方式,因为只有在电平方式中通道才能使信号逻辑“或”来 唤醒器件。

5.4.13 启动代码相关部分

在 LPC2100、LPC2200 的启动代码中,target.c 文件包含目标板特殊的代码,包括异常

- - 157

处理程序和目标板初始化程序,此文件用户要根据程序的需要修改。

为了使系统基本能够工作,必须在进入main()函数前对系统进行一些基本的初始化工作,

这 些 工 作 由 函 数 TargetResetInit() 完 成 ( 在 target.c 文 件 中 ) 。 LPC2200 的 启 动 代 码 的 TargetResetInit()的示例见程序清单 5.8。

程序清单 5.8 TargetResetInit()示例—LPC2200 void TargetResetInit(void)

{

#ifdef __DEBUG

MEMMAP = 0x3; //remap (1)

#endif

#ifdef __OUT_CHIP

MEMMAP = 0x3; //remap (2)

#endif

#ifdef __IN_CHIP

MEMMAP = 0x1; //remap (3)

#endif

/* 设置系统各部分时钟 */

PLLCON = 1; (4)

#if (Fpclk / (Fcclk / 4)) == 1

VPBDIV = 0; (5)

#endif

#if (Fpclk / (Fcclk / 4)) == 2

VPBDIV = 2; (6)

#endif

#if (Fpclk / (Fcclk / 4)) == 4

VPBDIV = 1; (7)

#endif

#if (Fcco / Fcclk) == 2

PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5); (8)

#endif

#if (Fcco / Fcclk) == 4

PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5); (9)

#endif

#if (Fcco / Fcclk) == 8

PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5); (10)

#endif

#if (Fcco / Fcclk) == 16

PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5); (11)

#endif

- - 158

PLLFEED = 0xaa; (12)

PLLFEED = 0x55; (13)

while((PLLSTAT & (1 << 10)) == 0); (14)

PLLCON = 3; (15)

PLLFEED = 0xaa; (16)

PLLFEED = 0x55; (17)

}

LPC2210/2212/2214具有不同的存储器映射方式,必须根据硬件设置。程序清单5.8 (1)~

(3)就是设置存储器映射方式的。当使用我们提供的LPC2200工程模板(for ADS1.2)建立工 程时,编译器会根据用户选择的Target项来预定义__DEBUG、__OUT_CHIP和__IN_CHIP三 个宏中的一个,而不同的Target代表着不同的工程配置。这样,当配置改变时就无需改动代 码。

时钟是芯片各部分正常工作的基础,虽然时钟可以在任何时候设置,但为了避免混乱,

最好在进入main()函数前设置(程序清单5.8 (4)~(17))。这段代码使用友好的接口正确的设 置系统个部分时钟,设置方法是在系统配置文件config.h中定义个部分的时钟,例子代码见程 序清单5.9。用户按照注释说明的要点设置即可,它们都是芯片的要求。程序首先允许PLL 但不连接PLL(程序清单5.8(4)),然后设置外设时钟(VPB时钟pclk)与系统时钟(cclk)

的分频比(程序清单5.8 (5)或(6)或(7))。接着设置PLL的乘因子和除因子(程序清单5.8 (8) 或(9)或(10)或(11))。设置完成后使用(程序清单5.8 (12)、(13))芯片要求的访问序列把 数据确实写入硬件,并等待PLL跟踪完成(程序清单5.8 (14))。最后,把使能PLL并使PLL 联上系统(程序清单5.8 (15)~(17))。

程序清单 5.9 设置系统时钟 /* 系统设置, Fosc、Fcclk、Fcco、Fpclk 必须定义*/

#define Fosc 11059200 //晶振频率,10MHz~25MHz,应当与实际一至

#define Fcclk (Fosc * 4) //系统频率,必须为 Fosc 的整数倍(1~32),且<=60MHZ

#define Fcco (Fcclk * 4) //CCO 频率,必须为 Fcclk 的 2、4、8、16 倍,范围为 156MHz~320MHz

#define Fpclk (Fcclk / 4) * 1 //VPB 时钟频率,只能为(Fcclk / 4)的 1、2、4 倍

值得注意的是Fcco 并没有联上内核,仅仅是 PLL 的频率,156MHz~320MHz 是 PLL 硬件的振荡频率范围。

5.5 存储器加速模块(MAM)

5.5.1 描述

存储器加速模块(MAM)将下一个需要的 ARM 指令锁存起来,以防止 CPU 取指暂停。

MAM 所使用的方法是将 Flash 存储器分成两组,每一组都可独立进行访问,这两个 Flash 组都有自己的预取指缓冲区和分支跟踪缓冲区,如图 5.19 所示。当一个组的预取指缓冲区 和分支跟踪缓冲区不能满足指令取指的需要,并且预取指还没有启动时,两个组的分支跟踪 缓冲区捕获两个128 位的 Flash 数据行。在 MAM 启动的预取指周期的结束时,每个预取指 缓冲区从它自身的Flash 组捕获一个 128 位指令行。若关闭 MAM,所有存储器请求都会直 接对Flash 操作。

- - 159

图 5.19 MAM 的一个存储器组连接示意图

每个128 位值包括了 4 个 32 位 ARM 指令或 8 个 16 位 Thumb 指令。在连续执行代码 时,通常一个 Flash 组包含或者当前正在取指的指令和包含该指令的整个 Flash 行。另一个 Flash 组则包含或正在预取指下一个连续的代码行。当一个代码行传送完最后一条指令时,

包含它的Flash 组开始对下一行进行取指。

分支和其它程序流的变化会导致前面所讲述的连续指令取指出现中断。当发生回溯分支 时,表示很有可能正在执行一个循环,分支跟踪缓冲区有可能已经包含了目标指令。如果是,

不需要执行Flash 读周期就可执行指令。对于一个前向分支,新的地址也有可能包含在其中 一个预取指缓冲区中。如果是,那么分支的执行不会有任何延迟。

当分支不在分支跟踪和预取指缓冲区当中时,则需要一个Flash 访问周期来装载分支跟 踪缓冲区。接下来将不再有取指的延迟,除非发生了另一个这样的“指令丢失”。

Flash 存储器控制器检测访问 Flash 存储器的数据并使用一个单独的缓冲区保存结果,

采用的方式类似于代码取指时使用的方式。这样就加快了按顺序访问数据的速度。数据访问 使用一个单行的缓冲区,和访问代码时提供两个缓冲区不同,因为数据访问不需要预取指功 能。

5.5.2 MAM 结构

存储器加速器模块分成以下几个功能块:

为每个存储器组提供 Flash 地址锁存。用于 Flash 组 0 地址锁存的增量器功能。

两个 Flash 存储器组

指令锁存,数据锁存,地址比较锁存 等待逻辑

图5.20 所示为存储器加速器模块数据通路的一个简化框图。

在下面的描述中,“取指”一词表示ARM 发出的一个直接的 Flash 读请求。“预取指”

一词表示对当前处理器取指地址之后的地址执行Flash 读操作。

在文檔中 1.1 嵌入式系统 (頁 166-169)