ARM Cortex-M3嵌入式开发实例详解
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第2章 LPC17XX的硬件设计基础

设计嵌入式系统时,最开始接触的就是硬件部分,不管是用户自己去做硬件设计,还是利用开发板设计,都需要熟悉硬件的原理,最起码也应该知道引脚的连线关系。

本章是关于LPC17XX的硬件概述,是进行LPC17XX硬件选型/设计、软件开发的基础。本章内容主要有:

(1)LPC17XX的体系机构;

(2)LPC17XX各子系列的外设情况;

(3)时钟与功率控制;

(4)引脚情况。

2.1 LPC17XX概述

2.1.1 简介

LPC17XX系列Cortex-M3微控制器用于处理要求高度集成和低功耗的嵌入式应用。ARM Cortex-M3是下一代内核,在相同的时钟速率下能提供比ARM7TDMI更高的速率。它还提供了系统增强型特性,如现代化调试特性和更高级别的块集成特征。

目前,LPC17XX系列主要有LPC175X、LPC176X、LPC177X、LPC178X四种子系列。

LPC175X是LQFP80封装形式的,主要有LPC1751/52/54/56/58/59几款芯片。除了LPC1759外,其余的LPC175X的CPU时钟频率为100MHz。LPC1759的CPU时钟频率可为120MHz。

LPC176X是LQFP100封装形式的,主要有LPC1769/68/67/65/64/63几款芯片。除了LPC1769外,其余的LPC176X的CPU时钟频率为100MHz。LPC1769的CPU时钟频率可为120MHz。LPC176X具有70个GPIO引脚。

LPC177X主要有LPC1774/76/77/78几款芯片。CPU时钟频率为120MHz。

LPC178X主要有LPC1785/86/87/88几款芯片。CPU时钟频率为120MHz。

LPC177X/8X系列ARM Cortex-M3增加了硬件CRC计算及校验模块、LCD控制器(只针对LPC178X)、外部存储器扩展接口(EMC)、专用的SD卡接口。它最多有165个GPIO引脚。LPC177X与LPC23XX的引脚完全兼容,LPC178X与LPC24XX的引脚完全兼容。

LPC17XX可用于静电计、照明设备、工业网络、报警系统、白色家电、电机控制等领域。

LPC17XX各子系列的功能相近,本书选取LPC1768作为典型芯片进行讲解,兼顾其他芯片的功能。本书中若不做特别标注,都是以LPC1768为基础进行讲解的。使用其他LPC17XX芯片,在寄存器地址上及引脚方面会有所不同,一些外设功能也有所增减。对于具有相同功能的外设,使用NXP固件库进行编程的用户感受不到芯片的分类影响。

2.1.2 特性

(1)ARM Cortex-M3微控制器可在高至100MHz(其中LPC1769和LPC1759的频率可达120MHz)的频率下运行,并包含一个支持8个区的存储器保护单元(MPU)。

(2)内置嵌套的向量中断控制器(NVIC)。

(3)具有在系统编程(ISP)和在应用编程(IAP)功能的512KB片上Flash程序存储器。对增强型的Flash存储加速器和Flash存储器在CPU本地代码/数据总线上的位置进行整合,则Flash可提供高性能的代码。

(4)64KB片内SRAM包括:

① 32KB片内SRAM,可供高性能CPU通过本地代码/数据总线访问;

② 2个16KB SRAM模块,带独立访问路径,可进行更高吞量的操作。这些SRAM模块可用于以太网、USB、DMA存储器,以及通用指令和数据存储。

(5)AHB多层矩阵上具有8通道的通用DMA控制器,它可结合SSP、I2S、UART、模数和数模转换器外设、定时器匹配信号和GPIO使用,并可用于存储器到存储器的传输。

(6)多层AHB矩阵内部连接,为每个AHB主机提供独立的总线。AHB主机包括CPU、通用DMA控制器、以太网MAC和USB接口。它提供无仲裁延迟的通信,除非2个主机尝试同时访问同一个从机。

(7)分离的APB总线允许在CPU和DMA之间提供更多的带宽,更少的延迟。CPU无须等待APB写操作完成。

(8)以太网MAC,带RMII接口和相关的DMA控制器。

(9)USB 2.0全速从机/主机/OTG控制器,带有用于从机、主机功能的片内PHY和相关的DMA控制器。

(10)4个UART,带小数波特率发生功能、内部FIFO,支持DMA和RS-485。

(11)UART带有MODEM控制I/O并支持RS-485/EIA-485。全部的UART都支持IrDA。

(12)CAN控制器。

(13)SPI控制器,具有同步、串行、全双工通信和可编程的数据长度。

(14)SSP控制器,带有FIFO,可按多种协议进行通信。其中一个可选择用于SPI,并且和SPI共用中断。SSP接口可以与GPDMA控制器一起使用。

(15)增强型的I2C总线接口,其中1个具有开漏输出功能,支持整个I2C规范和数据速率为1Mbit/s的快速模式,另外2个具有标准的端口引脚。

(16)I2S(Inter-IC Sound)接口,用于数字音频输入或输出,具有小数速率控制功能。I2S接口可与GPDMA一起使用。I2S接口支持3-线的数据发送和接收或4-线的组合发送和接收连接,以及主机时钟输入/输出。

其他外设如下。

(1)通用I/O(GPIO)引脚,带可配置的上拉/下拉电阻。AHB总线上的所有GPIO可进行快速访问,支持新的、可配置的开漏操作模式;GPIO位于存储器中,它支持Cortex-M3位带操作并且由通用DMA控制器使用。

(2)12位模数转换器(ADC),可在8个引脚间实现多路输入,转换速率高达1MHz,并具有多个结果寄存器。12位ADC可与GPDMA控制器一起使用。

(3)10位数模转换器(DAC),具有专用的转换定时器,并支持DMA操作。

(4)4个通用定时/计数器,带共有8个捕获输入和10个比较输出每个定时器模块都具有一个外部计数输入。可选择特定的定时器事件来产生DMA请求。

(5)1个电机控制PWM,支持三相的电机控制。

(6)正交编码器接口,可监控一个外部正交编码器。

(7)1个标准的PWM定时器模块,带外部计数输入。

(8)实时时钟(RTC),带有独立的电源域。RTC通过专用的RTC振荡器来驱动。RTC模块包括20字节电池供电的备用寄存器,当芯片的其他部分掉电时,允许系统状态存储在该寄存器中。电池电源可由标准的3V锂电池供电。当电池电压掉至2.1V的低电压时,RTC仍会继续工作。

(9)看门狗定时器(WDT),该定时器的时钟源可在内部RC振荡器、RTC振荡器或APB时钟三者间进行选择。

(10)支持ARM Cortex-M3系统节拍定时器,包括外部时钟输入选项。

(11)重复性的中断定时器,提供可编程和重复定时的中断。

(12)标准JTAG测试/调试接口,以及串行线调试和串行线跟踪端口选项。

(13)仿真跟踪模块,支持实时跟踪。

(14)4个低功率模式:睡眠、深度睡眠、掉电、深度掉电。

(15)单个3.3V电源(2.4~3.6V),温度范围为-40~85℃。

(16)4个外部中断输入,可配置为边沿/电平触发。PORT0和PORT2上的所有引脚都可用做边沿触发的中断源。

(17)不可屏蔽中断(NMI)输入。

(18)时钟输出功能,可反映主振荡器时钟、IRC时钟、RTC时钟、CPU时钟或USB时钟的输出状态。

(19)当处于掉电模式时,可通过中断(包括外部中断、RTC中断、USB活动中断、以太网唤醒中断、CAN总线活动中断、PORT0/2引脚中断和NMI)将处理器从掉电模式中唤醒。

(20)每个外设都自带时钟分频器,以进一步节省功耗。

(21)带掉电检测功能,可对掉电中断和强制复位分别设置阈值。

(22)片内有上电复位电路。

(23)片内晶振工作频率为1~24MHz。

(24)4MHz内部RC振荡器可在±1%的精度内调整,可选择用做系统时钟。

(25)通过片内PLL,没有高频晶振,CPU也可以最高频率运转。用户可从主振荡器、内部RC振荡器或RTC振荡器三者中选择一个作为PLL时钟源。

(26)第二个专用的PLL可用于USB接口,以允许增加主PLL设置的灵活性;用户可在引脚对应的多种功能中进行选择。

表2-1给出了LPC17XX器件的外设信息。

表2-1 LPC17XX器件的外设信息表

2.1.3 LPC17XX的结构图

LPC17XX的结构图如图2-1所示。该结构图包含Cortex-M3内核、多层AHB矩阵,以及各LPC17XX外设。

图2-1 LPC17XX的结构图

ARM Cortex-M3包含三条AHB-Lite总线:一条系统总线,以及I-Code和D-Code总线。后两者的速率较快,且与测试/调试接口的用法类似:一条总线专用于指令取指(I-Code);另一条总线用于数据访问(D-Code)。这两条内核总线允许同时执行操作,即同时对不同的设备目标进行操作。

LPC1700系列Cortex-M3微控制器使用多层AHB矩阵来连接Cortex-M3总线,并以灵活的方式将其他总线主机连接到外设,允许多层AHB矩阵上的各外设(使用了不同的从端口)同时被不同的总线主机访问,从而获得最优化的性能。

APB外设使用多层AHB矩阵的独立从机端口通过两条APB总线连接到CPU上,这就减少了CPU和DMA控制器之间的争用,可实现更好的性能。APB总线桥配置为写缓冲区操作,使得CPU或DMA控制器无须等待APB写操作结束。

LPC17XX的Cortex-M3微控制器使用Cortex-M3 CPU的r2p0版本,包含如下系统方面与调试方面的特征。

1.系统方面的特征

(1)嵌套的向量中断控制器(NVIC):NVIC包括系统定时器。

(2)唤醒中断控制器(WIC):WIC可更有效地将CPU从低功耗模式中唤醒。

(3)存储器保护单元(MPU)。

(4)ROM表:ROM表提供了调试部件到外部调试系统的地址。

2.调试方面的特征

(1)JTAG调试接口。

(2)串行线调试:串行线调试允许仅使用两条线进行调试操作,简单的跟踪功能可增加第三条线。

(3)嵌入式跟踪宏单元(ETM):ETM提供指令跟踪功能。

(4)数据观察点和跟踪(DWT)单元:DWT允许数据地址或数据值匹配为跟踪信息或触发其他事件。DWT包含4个比较器和计数器以用于特定的内部事件。

(5)指令跟踪宏单元(ITM):软件可写ITM以发送信息到跟踪端口。

(6)跟踪端口接口单元(TPIU):TPIU编码并向外面提供跟踪信息,这可以在串行线浏览器引脚(Serial Wire Viewer pin)或4并行跟踪端口上实现。

(7)Flash修补和断点(FPB):FPB可产生硬件断点并且在代码空间中重新映射特定的地址到SRAM作为更改非易失性代码的暂时方法。FPB包括2个文字比较器(literal comparator)和6个指令比较器。

LPC1700系列Cortex-M3微控制器含有512KB的片上Flash存储器。一个新的2-端口Flash存储器加速器通过两条快速AHB-Lite总线将其使用性能扩至极限。该存储器可用于存放代码和数据。对Flash存储器的编写可通过若干种方式来实现。LPC1700系列Cortex-M3微控制器可通过串口进行在系统编程。应用程序也可以在运行时对Flash进行擦除和/或编程,从而给数据存储域的固件升级等操作带来极大的灵活性。

LPC1700系列Cortex-M3微控制器包含共计为64KB的片上静态RAM存储器,包括主32KB SRAM(CPU和高速总线上的3个DMA控制器均可对其进行访问),以及另外两个各为16KB的、位于AHB多层矩阵独立从机端口的SRAM模块。这种结构允许各自执行CPU和DMA访问操作,从而使得对总线主机的延迟变少或无延迟。

2.2 LPC17XX的时钟与功率控制

本节描述了LPC1700系列Cortex-M3微控制器所需的各种时钟和时钟源选择,以及功率控制和低功耗模式的唤醒。

2.2.1 振荡器

LPC1700系列Cortex-M3微控制器包括3个独立的振荡器,分别为主振荡器(osc_clk)、内部RC振荡器(irc_clk)和RTC振荡器(rtc_clk)。每个振荡器可根据特定的应用要求来选用,图2-2给出了每种振荡器生成不同时钟信号的过程。

图2-2 LPC1700系列Cortex-M3微控制器的时钟产生

复位后,LPC1700系列Cortex-M3微控制器自动选择内部RC振荡器作为系统的时钟源,用户可以通过软件方式修改时钟源来选择寄存器。这使得微控制器能在没有外部晶振的情况下运行,并允许Boot Loader代码在一个已知的频率下运行。

1.内部RC振荡器

内部RC振荡器(IRC)既可以用做看门狗定时器的时钟源,也可以用做驱动PLL0和CPU的时钟源。IRC的精度达不到USB接口的时间基准精度要求(USB接口需要一个更精确的时间基准以遵循USB规范)。而且如果CAN的波特率高于100kbit/s,则IRC不应用于CAN模块。IRC的额定频率为4MHz。

上电或任何芯片复位时,LPC1700系列Cortex-M3微控制器使用IRC作为时钟源。此后,软件可将其切换为另一种可用的时钟源。

2.主振荡器

主振荡器(外部晶体振荡器)可以用做CPU的时钟源(不管是否使用PLL0)。主振荡器工作在1~24MHz下。该频率可通过主PLL(PLL0)来提高,其值可高达CPU操作频率的最大值。振荡器的输出称为osc_clk。PLLCLKIN可用于PLL0输入时钟的选择。为了便于频率公式的书写及本节的描述,将ARM处理器时钟频率称为CCLK。在PLL0有效并连接前,PLLCKIN和CCLK的频率值相同。

LPC1700系列Cortex-M3微控制器的振荡器可工作在两种模式下:从属模式和振荡模式。

在从属模式下,输入时钟信号应该与一个100pF的电容(图2-3(a)中的Cc)相连,其幅值至少为200mVrms。在这种配置下,XTAL2引脚可以不连接。

图2-3 振荡器模式和模型

振荡模式下使用的外部元件和模型如图2-3的(b)和(c),以及表2-2和表2-3所示。由于片内集成了反馈电阻,所以只需要在外部连接一个晶体和电容Cx1、Cx2就可以形成基本模式的振荡电路(基本频率用L、CL和Rs来表示)。图2-3(c)中的电容Cp是并联封装电容,其值不能大于7pF。参数FoscCLRsCp都由晶体制造商提供。

表2-2 振荡模式下CX1、CX2的建议取值(晶体和外部元件参数)、低频模式(OSCRANGE=0)

表2-3 振荡模式下CX1、CX2的建议取值(晶体和外部元件参数)、高频模式(OSCRANGE=1)

由于芯片操作总是从内部RC振荡器开始的,且主振荡器在某些应用中并没有使用,所以主振荡器只能由软件请求来启动。通过把SCS寄存器中的OSCEN(SCS[5])置位可实现这种操作。主振荡器提供了一个状态标志(SCS[6]),使得程序可据此得知振荡器何时可用。待确定振荡器运行稳定后,软件可控制SCS[5]切换为主振荡器模式使其作为时钟源。在启动主振荡器之前,频率范围必须通过配置SCS寄存器中的OSCRANGE(SCS[4])位来选择。

3.RTC振荡器

RTC振荡器可提供1Hz~32kHz的RTC时钟输出,可用做PLL0、CPU和/或看门狗定时器的时钟源。

2.2.2 时钟源选择多路复用

某些时钟源可选择用来驱动PLL0、CPU和片内外围设备。这些可用的时钟源包括主振荡器、RTC振荡器和内部RC振荡器。

只有当PLL0断开连接时,才可以更换输入时钟源。

请注意下列有关时钟源选择的限制:

(1)IRC振荡器不应用做(通过PLL0)USB子系统的时钟源;

(2)如果CAN的波特率高于100kbit/s,则IRC振荡器不应用做(通过PLL0)CAN控制器的时钟源。

时钟源选择寄存器(CLKSRCSEL-0x400F C10C):时钟源选择寄存器包含了选择PLL0时钟源的位。时钟源选择寄存器的位描述如表2-4所示。

表2-4 时钟源选择寄存器的位描述

2.2.3 PLL0

PLL0支持从32kHz~25MHz范围内的输入时钟频率。时钟源在CLKSRCSEL寄存器中选择(见2.2.2节中的描述)。PLL将输入时钟倍频,然后再分频,以提供给CPU、外设或USB子系统使用的实际时钟。PLL0可产生的时钟频率高达100MHz,是CPU所允许的最大值。

PLL输入(频率范围为32kHz~50MHz)首先被一个“N”值分频,“N”值的范围为1~256。该输入分频在相同的输入频率下,提供更多种可能的输出频率范围。

PLL倍频器(见图2-4中的M倍频)的操作在PLL输入分频器之后进行。通过使用电流控制振荡器(CCO)由“M”的值(支持的M值范围为6~512,以及表2-12中所示的值)来倍频输入分频器的输出。因此,产生的频率必须在275~550MHz频率范围内。倍频器操作是先使用M值分频CCO输出,然后使用相位-频率检测器将分频后的CCO输出与倍频器输入相比较。可以根据比较的偏差值调节CCO的振荡频率。

图2-4 PLL0的方框图

表2-12 使用低频时钟输入的倍频值

PLL0的输出还连接有其他的分频器,使其频率下降到CPU、外设和USB子系统所需要的值。PLL0的方框图如图2-4所示。

PLL0控制寄存器控制PLL有效。PLL0配置寄存器控制PLL0倍频器和分频器的值。为了避免程序对PLL0正在使用的相关参数进行意外修改或PLL失效,芯片厂商对这两个寄存器进行了保护。由于所有的芯片操作,包括看门狗定时器,在这种配置情况下都可能依赖于PLL0(如当PLL正在提供芯片时钟时),所以意外改变PLL0的设置将导致微控制器执行不期望或错误的操作。保护是由一个类似于操作看门狗定时器的代码序列来实现的,详情请参阅PLL0FEED寄存器的描述。

PLL0在系统进入掉电模式时会自动关闭并断开。PLL0必须通过软件配置、使能和连接到系统。

注意:一定要按照PLL0设置序列的设置步骤来进行,否则PLL可能不操作!

当在用户Flash中没有有效代码(由校验和字段决定)或在启动时拉低ISP使能引脚(P2.10)时,芯片将进入ISP模式,并且引导代码使用IRC设置PLL。因此,当用户启动JTAG来调试应用代码时,不能假设PLL被禁能。用户启动代码必须按照本章中说明的步骤来断开与PLL的连接。

1.PLL0寄存器的描述

PLL0由PLL0寄存器进行控制,如表2-5所示。

表2-5 PLL0寄存器

注:[1]复位值仅指在使用位中保存的数据,不包括保留位的内容。

注意:PLL0值的不正确设定会导致器件不能正确地操作!

1)PLL0控制寄存器(PLL0CON-0x400FC080)

PLL0控制寄存器包含了使能和连接PLL0的位。该寄存器可以使能PLL0,以允许它尝试锁定倍频器和分频器的当前设定值。连接PLL0的位,可以使PLL0的输出用做处理器和大多数片内外设的时钟源。对PLL0控制寄存器的更改,只有在对PLL0FEED执行了正确的PLL0馈送序列后才生效。

PLL0控制寄存器的位描述如表2-6所示。

表2-6 PLL0控制寄存器的位描述

PLL0在用做时钟源之前必须进行设置、使能并锁定。当PLL时钟源从振荡器时钟切换到PLL0输出或反过来操作时,为确保不产生问题,内部电路同步化该操作。此外,当PLL0脱离锁定状态时,硬件是不会主动断开PLL0连接的,这时振荡器很可能已变得不稳定,此时再断开PLL0也没用了。

2)PLL0配置寄存器(PLL0CFG-0x400F C084)

PLL0配置寄存器包含PLL0倍频器和分频器值。在执行正确的PLL馈送序列之前,改变PLLC0配置寄存器的值不会生效。

PLL0配置寄存器的位描述如表2-7所示。

表2-7 PLL0配置寄存器的位描述

3)PLL0状态寄存器(PLL0STAT-0x400FC088)

PLL0状态寄存器提供了当前生效的PLL0真实工作参数和状态,它是一个只读寄存器。PLL0STAT中的值可能与PLL0CON和PLL0CFG中的值不同,这是因为对这些寄存器的更改只有在执行了正确的PLL0馈送序列后才生效。

PLL0状态寄存器的位描述如表2-8所示。

表2-8 PLL0状态寄存器的位描述

PLL0STAT的PLOCK0位反映PLL0的锁定状态。当使能PLL0或改变参数时,PLL0在新的条件下需要一些时间来完成锁定。可通过监控PLOCK0位来确定连接PLL0的时间。当PLL参考频率(参考频率FREFN分频器输出的频率相等,即FREF=FIN/N)小于100kHz或大于20MHz时,PLOCK0的值可能不稳定。在这些情况下,可假设PLL启动后经过一段时间才稳定下来。当FREF大于400kHz时,这个时间为50s;当FREF小于400kHz时,这个时间为200/FREFs。

PLOCK0位连接到中断控制器,这样可使用软件使能PLL0,而无须等待PLL0锁定。当发生中断时,可以连接PLL0并禁止中断。

PLL0STAT[24]和PLL0STAT[25],即PLLC0和PLLE0的组合解释如表2-9所示。

表2-9 PLL0控制位的组合

4)PLL0馈送寄存器(PLL0FEED-0x400F C08C)

必须将正确的馈送序列写入PLL0FEED寄存器,才能使PLL0CON和PLL0CFG寄存器的更改生效。馈送序列如下:

① 将值0xAA写入PLL0FEED;

② 将值0x55写入PLL0FEED。

这两个写操作的顺序必须正确,而且必须在相同的地址空间(0x400F C000~0x400F FFFF)内没有其他寄存器访问。如果有一个中断服务程序在对该空间内的一个寄存器执行写操作,则在执行PLL0馈送操作时必须禁止中断。如果写入的值不正确或没有满足前两个条件,则对PLL0CON或PLL0CFG寄存器的更改都不会生效。

PLL0馈送寄存器的位描述如表2-10所示。

表2-10 PLL0馈送寄存器的位描述

2.PLL0和掉电模式

掉电模式会自动关闭并断开PLL0。从掉电模式唤醒不会自动恢复原先的PLL0参数,必须在软件中恢复PLL0。通常可以在中断服务程序的开始激活PLL0、等待锁定并连接PLL0,该中断服务程序也可以在掉电唤醒时调用。需要注意一点,那就是不要试图在掉电唤醒之后简单地执行馈送序列来重新启动PLL0,在建立PLL锁定之前,这种操作将会同时使能并连接PLL0。

3.PLL0的频率计算

在进行PLL0参数的设置时,需要的参数信息如表2-11所示。

表2-11 PLL0的参数信息

PLL0输出频率(当PLL0被激活且连接时)的计算公式为

FCCO=(2×M×FIN)/N

PLL输入和设定必须满足下面的条件。

(1)FIN的范围:32kHz~50MHz;

(2)FCCO的范围:275~550MHz。

可通过求解PLL等式来得到其他的PLL参数:

M=(FCCO×N)/(2×FIN)

N=(2×M×FIN)/FCCO

允许的M值:

FIN=(FCCO×N)/(2×M)

(1)在较高的振荡器频率下(超过1MHz),允许M值的范围为6~512,这是支持主振荡器和IRC操作的整个M值范围;

(2)对于较低频率,特别是当RTC振荡器用来计时PLL0时,选择了65个M值用于支持波特率产生和CAN/USB操作,这些值在表2-12中给出。

4.确定PLL0频率参数的过程

通过使用NXP提供的电子数据表可简单确定PLL0参数。如果要手动确定PLL0参数,可按照下面的步骤来进行。

(1)确定是否需要使用USB,以及是否由PLL0驱动。USB要求一个占空比为50%的48MHz时钟源,也就是说,FCCO必须是48MHz的偶数整数倍(即96MHz的整数倍),误差范围极小。

(2)选择所需的处理器操作频率(FCCLK),这取决于处理器的吞吐量要求,所支持的特定的UART波特率等。外设可在较低时钟频率下运行,这个频率可以低于处理器的频率(见2.2.4节“时钟分频器”和2.2.5节“功率控制”)。找出与所需FCCLK的倍数接近的一个FCCO值,再与步骤(1)中USB所要求的FCCO值相比较,较低的FCCO值,处理器的功耗也更低。

(3)选择PLL输入频率(FIN)的值。可从主振荡器、RTC振荡器或片内RC振荡器中选择。使用USB功能时,需要选择主振荡器。如果使用PLL1而不是PLL0来驱动USB子系统,会影响选择主振荡器的频率。

(4)计算MN的值来产生十分精确的FCCO频率。将所需的M值减1(即M-1)写入PLL0CFG的MSEL0字段,将所需的N值减1(即N-1)写入PLL0CFG的NSEL0字段。

总的来说,建议使用一个较小的N值,这样可以降低FCCO的倍频数。由于在某些情况下很难找到最好的值,所以可以使用电子数据表或类似的方法来立即获得多种可能的值,再从中选择出一个最好的值。

5.PLL0的设置步骤

要想对PLL0进行正确的初始化,必须按照下列步骤操作。

(1)如果PLL0已被连接,则用一个馈送序列断开与PLL0的连接。

(2)用一个馈送序列禁止PLL0。

(3)如果需要,可在没有PLL0的情况下改变CPU时钟分频器的设置以加速操作。

(4)操作“时钟源选择控制寄存器”以改变时钟源。

(5)写PLL0CFG并用一个馈送序列使其有效。PLL0CFG只能在PLL0被禁止时更新。

(6)用一个馈送序列使能PLL0。

(7)改变CPU时钟分频器的设置,使之与PLL0一起操作。在连接PLL0之前完成这个操作是很重要的。

(8)通过监控PLL0STAT寄存器的PLOCK0位,或使用PLOCK0中断来等待PLL0实现锁定。此外,当使用低频时钟作为PLL0的输入时(也就是32kHz),需要等待一个固定的时间。当PLL参考频率(REFCLK的频率FREF与预分频器值分频所得的PLL输入频率相等)少于100kHz或大于20MHz时,PLOCK0的值可能不稳定。在这些情况下,启动PLL后等待一段时间即可。当FREF大于400kHz时,这个时间为500s;当FREF小于400kHz时,这个时间为200/FREFs。

(9)用一个馈送序列连接PLL0。

需要注意的是不要合并上面的任何一个步骤。例如,不能用相同的馈送序列同时更新PLL0CFG和使能PLL0。

2.2.4 时钟分频器

PLL0的输出经过分频后供CPU和USB子系统使用。由于提供了各自的分频器,所以可以单独确定USB子系统和CPU的频率。在正常操作下,USB子系统总是需要占空比为50%的48MHz频率。

如图2-5所示是PLL和时钟分频器。

图2-5 PLL和时钟分频器

1.CPU时钟配置寄存器(CCLKCFG-0x400FC104)

PLL0输出的时钟必须要经过分频才能提供给CPU使用,PLL0输出的分频由CCLKCFG寄存器进行控制。当PLL0被旁路时,可实现1分频。当PLL0正在运行时,输出必须经过分频,从而限定CPU时钟频率(CCLK)的运行范围。可使用一个8位分频器进行选择,包括降低CPU的操作频率来暂时节省功耗而无须关闭PLL0。

注意:当在应用中使用USB接口时,CCLK必须至少为18MHz以便于支持USB子系统的内部操作。CPU时钟配置寄存器的位描述如表2-13所示。

表2-13 CPU时钟配置寄存器的位描述

注意:当置位CCLKSEL位时使用偶数值(2,4,6,254),可能会导致操作错误。

CCLK从PLL0输出信号中得到,通过CCLKSEL+1分频。当CCLKSEL=1时,CCLK的频率是PLL0输出频率的一半;当CCLKSEL=3时,CCLK的频率是PLL0输出频率的四分之一,以此类推。

2.USB时钟配置寄存器(USBCLKCFG-0x400FC108)

注意:该寄存器仅在PLL1禁止时使用。如果PLL1使能,则其输出自动用做USB时钟源,且必须配置PLL1为USB子系统提供正确的48MHz时钟。

USBCLKCFG寄存器控制对PLL0输出时钟的分频,然后提供给USB子系统使用。PLL0的输出必须被分频以使USB时钟频率为48MHz,占空比为50%。在PLL操作范围内,4位的分频器允许从48MHz的任意偶数倍(即96MHz的任意倍数)中获得正确的USB时钟。

注意:内部RC时钟不应用做USB的时钟,这是因为USB规范需要更精确的时钟。USB时钟配置寄存器的位描述如表2-15所示。

表2-14 USB时钟配置寄存器的位描述

表2-15 IRC调整寄存器的位描述

USB时钟从PLL0输出信号中得到,通过USBSEL+1分频。当USBSEL=1时,USB的时钟频率是PLL0输出频率的一半。

3.IRC调整寄存器(IRCTRIM-0x400FC1A4)

该寄存器用于调整片内4MHz振荡器。IRC调整寄存器的位描述如表2-15所示。

4.外设时钟选择寄存器0和1(PCLKSEL0-0x400F C1A8和PCLKSEL1-0x400F C1AC)

在外设时钟选择寄存器中,每组位控制了提供给对应外设的时钟信号的速率,如表2-16~表2-19所示。

表2-16 外设时钟选择寄存器PCLKSEL0的位描述

表2-17 外设时钟选择寄存器PCLKSEL11的位描述

表2-18 外设时钟选择寄存器的位描述

表2-19 功率控制寄存器

注:[1]复位值仅指在使用位中保存的数据,不包括保留位的内容。

注意:RTC模块的外设时钟固定为CCLK/8。

固件库提供了操作PCLKSEL寄存器的函数,即CLKPWR_SetPCLKDiv用于设置外设的pclk,如下所示。

void CLKPWR_SetPCLKDiv(uint32_t ClkType,uint32_t DivVal);//ClkType为被设置的外设,其

                      //参数选取参见表2-12和表2-18;DivVal是外设的分频,其参数选取参见表2-18

2.2.5 功率控制

功率控制类似于我们日常生活中的节约用电问题:为了能够达到节约用电的目的,我们经常将一些不使用的电器设备的电源关闭,只有在使用的情况,才打开这些设备的电源。

1.功率控制模式

LPC1700系列Cortex-M3微控制器支持四种功率控制的方式:睡眠模式、深度睡眠模式、掉电模式和深度掉电模式。CPU时钟速率可通过改变时钟源、重新配置PLL值和/或改变CPU时钟分频器值来控制,这就允许用户根据应用要求在功率和处理速度之间进行权衡。此外,“外设功率控制器”可以关断每个片上外设,从而对系统功耗进行良好的调整。

通过Cortex-M3执行WFI(等待中断)或WFE(等待异常)指令可以进入任何低功耗模式。Cortex-M3内部支持两种低功耗模式:睡眠模式和深度睡眠模式,它们通过Cortex-M3系统控制寄存器中的SLEEPDEEP位来选择。掉电模式和深度掉电模式通过PCON寄存器中的位来选择。

LPC1700系列Cortex-M3微控制器还具有一个独立电源域,可为RTC和电池RAM供电,以便在维持RTC和电池RAM正常操作时,关闭其他设备的电源。

1)睡眠模式

注意:LPC1700系列Cortex-M3微控制器的睡眠模式对应于LPC2XXX系列ARM器件的空闲模式。

当进入睡眠模式时,内核时钟停止,且PCON的SMFLAG位置位。从睡眠模式中恢复并不需要任何特殊的序列,但要重新使能ARM内核的时钟。

在睡眠模式下,指令的执行被中止,直至复位或中断出现。外设在CPU内核处于睡眠模式期间继续运转,并可产生中断使处理器恢复执行指令。在睡眠模式下,处理器内核自身、存储器系统、有关控制器及内部总线停止工作,因此这些器件的动态功耗会降低。

只要出现任何使能的中断,CPU内核就会从睡眠模式中唤醒。

2)深度睡眠模式

注意:LPC1700系列Cortex-M3微控制器的深度睡眠模式对应于LPC2300和LPC2400系列ARM器件的睡眠模式。

当芯片进入深度睡眠模式时,主振荡器掉电且所有内部时钟停止,PCON的DSFLAG位置位,IRC保持运行并且可配置为驱动看门狗定时器,允许看门狗唤醒CPU。由于RTC中断也可以用做唤醒源,所以32kHz的RTC振荡器不停止。同时,Flash进入就绪模式,这样可以实现快速唤醒,PLL自动关闭并断开连接,CCLK和USBCLK时钟分频器自动复位为0。

在深度睡眠模式期间,保存处理器状态及寄存器、外设寄存器和内部SRAM的值,并且将芯片引脚的逻辑电平保持为静态。可通过复位或某些的特定中断(能够在没有时钟的情况下工作)来终止深度睡眠模式和恢复正常操作。由于芯片的所有动态操作被中止,所以深度睡眠模式使功耗降低为一个极小的值。

在唤醒深度睡眠模式下,如果IRC在进入深度睡眠模式前被使用,则2位IRC定时器开始计数,并且在定时器超时(4周期)后,恢复代码执行和外设活动。如果使用主振荡器,则12位主振荡器定时器开始计数,并且在定时器超时(4096周期)时恢复代码的执行。用户必须记得在唤醒后重新配置所需的PLL和时钟分频器。

只要相关的中断使能,器件就可以从深度睡眠模式中唤醒。这些中断包括NMI、外部中断EINT0~EINT3、GPIO中断、以太网Wake-On-LAN中断、掉电检测、RTC报警中断、看门狗定时器超时、USB输入引脚跳变或CAN输入引脚跳变。

注意:外设的功率控制特性允许在应用中关闭不需要的外设,从而节省额外的功耗。该功能由PCONP寄存器实现。

3)掉电模式

掉电模式会执行在深度睡眠模式下的所有操作,但关闭了Flash存储器。进入掉电模式会使PCON中的PDFLAG位置位,这样节省了更多功耗。但是芯片被唤醒后,在访问Flash存储器中的代码或数据前,必须等待Flash恢复。

当芯片进入掉电模式时,IRC、主振荡器和所有时钟都停止。如果RTC已使能,则它继续运行。RTC中断也可用来唤醒CPU。同时,Flash被强制进入掉电模式;PLL自动关闭并断开连接;CCLK和USBCLK时钟分频器自动复位为0。

当芯片处于掉电模式下被唤醒时,如果在进入掉电模式前使用了IRC,则经过IRC的启动时间(60s)后,2位IRC定时器开始计数并且在4个周期内停止计数。如果用户代码在SRAM中,则在IRC计数4个周期后,用户代码会立即执行;如果代码在Flash中运行,则在IRC计数4个周期后,启动Flash唤醒定时器,100s后完成Flash的启动,开始执行代码。当定时器超时时,可以访问Flash。用户必须记得在唤醒后重新配置PLL和时钟分频器。

4)深度掉电模式

在深度掉电模式下,关断整个芯片的电源(实时时钟、引脚、WIC和RTC备用寄存器除外)。进入深度掉电模式会使PCON中的DPDFLAG位置位。为了优化功率,用户可关闭额外选项,可保留32kHz振荡器的电源,或使用外部电路关闭片上调节器的电源。

当使用外部复位信号,或使能RTC中断和产生RTC中断时,可将器件从深度掉电模式中唤醒。

2.寄存器描述

功率控制寄存器如表2-19所示。

1)功率模式控制寄存器(PCON-0x400F C0C0)

低功耗模式通过功率模式控制寄存器来控制,如表2-20所示。

表2-20 功率模式控制寄存器的位描述

PCON中的PM1和PM0位在必要时允许进入低功耗模式。表2-21给出了LPC1700系列Cortex-M3微控制器支持的3种低功耗模式的编码。

表2-21 低功耗模式的编码

任何使能的中断均可将CPU从睡眠模式中唤醒。某些特定的中断可将处理器从深度睡眠模式或掉电模式中唤醒。

若特定的中断使能,则允许中断将CPU从深度睡眠模式或掉电模式中唤醒。唤醒后,将继续执行适当的中断服务程序。这些中断为NMI、外部中断EINT0~EINT3、GPIO中断、以太网Wake-On-LAN中断、掉电检测中断、RTC报警中断。此外,如果看门狗定时器由IRC振荡器驱动,则看门狗定时器也可将器件从深度睡眠模式中唤醒。

可以将CPU从深度睡眠或掉电模式中唤醒的其他功能有CAN活动中断(由CAN总线引脚上的活动产生)和USB活动中断(由USB总线引脚上的活动产生)。相关的功能必须映射到引脚且对应的中断必须使能,才能实现唤醒。

2)外设功率控制寄存器(PCONP-0x400FC0C4)

可通过PCONP寄存器关闭特定外设模块的时钟源来关闭外设,以实现节电的目的。有少数外设功能不能被关闭(看门狗定时器、引脚连接模块和系统控制模块)。

某些外设(特别是那些含有模拟功能的外设)的功耗可能与时钟无关。这些外设有独立的禁能控制,可通过关闭其电路来减少功耗。PCONP中的每个位都控制一个外设,如表2-22所示。

表2-22 外设功率控制寄存器的位描述

如果外设控制位为1,则外设被使能;如果外设控制位为0,则外设的时钟被禁能(关闭)以节省功耗。例如,如果位19为1,则I2C1接口使能;如果位19为0,则I2C1接口禁止。

注意:仅当外设在PCONP寄存器中使能时,才能够从外设寄存器中有效读取和有效写入外设寄存器。

注意:DAC外设在PCONP中没有控制位。要想使能DAC,必须通过配置PINSEL1寄存器在相关的引脚P0.26上选择其输出。

LPC17XX在固件库中提供操作PCONP寄存器的函数:

void CLKPWR_ConfigPPWR(uint32_t PPType,FunctionalState NewState);//PPType是设备类型,

                                          //对应于表2-22中的位信息;NewState代表使能或禁用

3.功率控制的注意事项

复位后,PCONP寄存器包含使能所选的接口和外设(由PCONP控制)的值。因此,除了对外设相关的寄存器进行配置外,用户的应用程序可能还需要访问PCONP寄存器,使能对应的外设。

在需要控制功率的系统中,需要在PCONP寄存器中使能必要的外设,而寄存器的其他“保留”位或当前不使用的外设所对应的位都必须清零。

2.3 LPC17XX的引脚

2.3.1 LPC17XX的引脚连接模块

LPC176X的100脚引脚封装如图2-6所示。

图2-6 LPC176X的100脚引脚封装

LPC17XX具有5路GPIO口,分别是P0、P1、P2、P3、P4。如表2-23所示是LPC176X的引脚描述。

表2-23 LPC176X的引脚描述

续表

续表

续表

续表

续表

续表

续表

P0口是一个32位I/O端口,每一位都具有独立的方向控制。P0口引脚的操作取决于引脚连接模块所选择的功能。P0口的12、13、14和31位不可用。

P1口是一个32位I/O端口,每一位都具有独立的方向控制。P1口引脚的操作取决于引脚连接模块所选择的功能。P1口的引脚P1.2、P1.3、P1.5、P1.6、P1.7、P1.11、P1.12和P1.13不可用。

P2口是一个32位I/O端口,每一位都具有独立的方向控制。P2口引脚的操作取决于引脚连接模块所选择的功能。P2口的引脚P2.14~P2.31不可用。

P3口是一个32位I/O端口,每一位都具有独立的方向控制。P3引脚的操作取决于引脚连接模块所选择的功能。P3口的引脚P3.0~P3.24、P3.27~P3.31不可用。

P4口是一个32位I/O端口,每一位都具有独立的方向控制。P4口引脚的操作取决于引脚连接模块所选择的功能。P4口的引脚P4.0~P4.27、P4.30和P4.31不可用。

只要不在表2-23中特别指出,LPC17XX的I/O端口均能承受5V电压,且具有输入滞后的特点。晶振引脚、电源引脚,以及参考电压引脚不能承受5V电压。如果引脚被选为ADC功能,且具有电压值不能超过VREFP引脚的电压,则此时它不能承受5V电压。

2.3.2 LPC17XX的引脚配置寄存器

LPC17XX的引脚功能是复用的。引脚连接模块使得LPC17XX的大部分引脚具有1个以上的功能。配置寄存器控制多路开关以实现引脚与片内外设之间的连接。

在使用外设时,外设应先连接到适当的引脚,再激活,需要时使能相关中断。任何一个没有映射到相关功能引脚的使能外设,都将被认为是未定义的。当选择了引脚上的1个功能时,该引脚上的其他可用功能无效。

引脚连接模块共有27个寄存器,分别是11个引脚功能寄存器、10个引脚模式寄存器、5个开漏模式控制寄存器、1个I2C引脚配置寄存器。

注意:LPC177X/8X的寄存器使用与此不同,采用的是每个引脚有一个独立寄存器的形式。

1.引脚功能选择寄存器

PINSEL寄存器控制器件引脚的功能如表2-24所示。每个寄存器有32位,2比特为一组,寄存器中的每一组位对应着特定的器件引脚功能。以P0端口为例,PINSEL0寄存器的[1:0]位用于P0[0]引脚;[3:2]用于P0[1]引脚;[31:30]控制P0[15]。PINSEL1寄存器中的[1:0]用于P0[16]引脚;[3:2]用于P0[17]引脚;[31:30]用于P0[31]引脚。

表2-24 引脚功能选择寄存器的位描述

PINSEL0~PINSEL9寄存器,每两个寄存器控制一个端口组:PINSEL0用于P0[0:15];PINSEL1用于P0[31:16];PINSEL2用于P1[0:15];PINSEL3用于P1[31:16];PINSEL4用于P2[0:15];PINSEL5用于P2[31:16];PINSEL6用于P3[0:15];PINSEL7用于P3[31:16];PINSEL8用于P4[0:15];PINSEL9用于P4[31:16]。

仅当引脚选择GPIO功能时,GPIO寄存器中的方向控制位才有效。对于其他功能来说,方向是自动控制的。每个外围器件通常有不同的引脚配置,因此每个引脚可能有不同的功能组合。

既然一个特定的外设功能可以指派给一个或多个引脚,则原则上配置多个引脚执行相同功能是可行的。如果一个外设输出功能被配置到多个引脚上,它将在多个引脚上都输出外设功能信号。如果一个外设输入功能配置到多个引脚上,将读出最低端口号。例如,P0端口上的所有引脚优先级高于其余端口;所有端口中的引脚0的优先级高于本端口其他端口的优先级。

2.引脚模式选择寄存器(PINMODE)

如表2-25所示是引脚模式选择寄存器的位描述,该寄存器用于控制所有端口的工作模式,包括使用片内上拉/下拉电阻和特定的开漏操作。除用于I2C0接口的I2C引脚和USB引脚外,不管引脚选择用做何种功能,都可以为每一个端口引脚选择片内上拉/下拉电阻。使用三个位来控制端口引脚的模式,其中两个位于PINMODE中,另一个位于PINMODE_OD中。在PINSEL中未使用的引脚看成保留位。

表2-25 引脚模式选择寄存器的位描述

当引脚处于逻辑高电平时,中继模式使能上拉电阻;当引脚处于逻辑低电平时,使能下拉电阻。当引脚配置为输入且不是通过外部驱动时,引脚将保持上一个已知状态。

如表2-26所示是开漏引脚模式选择寄存器(PINMODE_OD)的位描述,该寄存器用于控制端口的开漏模式。当引脚被配置为输出且值为0时,开漏模式会正常地将引脚电平拉低。但是如果输出引脚值为1,则引脚的输出驱动关闭,等同于改变了引脚的方向。这样的组合就模拟了一个开漏输出。

表2-26 开漏引脚模式选择寄存器的位描述

如表2-27所示是引脚连接模块的寄存器总表。当外部复位、看门狗复位、上电复位(POR)和掉电检测复位(BOD)发生时,引脚连接模块中的所有寄存器均复位为“0”。

表2-27 引脚连接模块的寄存器总表

注:[1]复位值仅反映已使用位中保存的数据,不包含保留位的内容。

3.固件库函数

在lpc17xx_pinsel.c文件中包含了关于引脚配置的调用函数。主要有3个配置函数,分别是:

        void  PINSEL_ConfigPin(PINSEL_CFG_Type*PinCfg);实现端口配置,传递参数是PINSEL_
                                                  CFG_Type结构体类型的数据
        void PINSEL_ConfigTraceFunc(FunctionalState NewState);配置跟踪调试功能
        void PINSEL_SetI2C0Pins(uint8_t i2cPinMode,FunctionalState filterSlewRateEnable);设置I2C0引脚

下列程序给出了PINSEL_CFG_Type的定义,以及使用PINSEL_ConfigPin函数进行端口引脚配置时传递的结构体:

            typedef struct
            {
              uint8_t Portnum;//端口号,参数应该是PINSEL_PORT_x,其中x是0~4之间的数
              uint8_t Pinnum;//引脚号
              uint8_t Funcnum;//功能代码,参数范围是0~3
              uint8_t Pinmode;/*引脚模式 ,参数可能是
                                    - PINSEL_PINMODE_PULLUP:内部上拉电阻
                                    -PINSEL_PINMODE_TRISTATE: 既不上拉也不下拉电阻
                                    -PINSEL_PINMODE_PULLDOWN:内部下拉电阻 */
              uint8_t OpenDrain;/*开漏模式,参数可能是:
                                    -PINSEL_PINMODE_NORMAL: 正常模式
                                    -PINSEL_PINMODE_OPENDRAIN: 开漏模式*/
            } PINSEL_CFG_Type;

2.4 最小系统设计

本节结合前面介绍的硬件基础知识,给出LPC1768的最小系统设计原理图,如图2-7所示。由于LPC1768使用3.3V供电模式,所以这里使用了SPX117M模块将5V电源转换成3.3V电源。3.3V数字电源与数字地分别经过0Ω电阻隔离成3.3V模拟电源和模拟地,然后分别连接到VDDA、VREF、VSSA、VREFN。

图2-7 最小系统设计原理图

该设计采用了外部晶振的振荡模式,晶振为12MHz。LPC1768使用8个耦合电容,比NXP公司的LPC22XX系列小了很多,有利于进行PCB设计。

说明:这里的LPC17XX的原理图并不完整,仅给出了相关部分。

2.5 小结

本章是理解LPC17XX的基础。本章给出了LPC17XX的结构框图,晶振的使用、配置,以及LPC17XX的引脚,并结合以上知识,给出了LPC1768的最小系统设计原理图。

第3章将给出进行LPC17XX软件设计的基础。