LPC1114时钟配置

发布者:吾道明亮最新更新时间:2016-08-23 来源: eefocus关键字:LPC1114  时钟配置 手机看文章 扫描二维码
随时随地手机看文章
要让LPC1114正常工作,首先要对它的时钟源进行配置。LPC1114的最高工作频率为50MHz,因此给它的主时钟频率最大不能超过50MHz。实际上,通常都是使用频率较低的晶振,以降低外部电磁干扰,然后再通过内部倍频的方式把主时钟频率提高。根据管方手册给出的数据,外部晶振的频率范围是1MHz~25MHz,一般情况下使用12MHz晶振,然后内部进行4倍频,主时钟工作频率为48MHz。

要对LPC1114的时钟进行配置,必须要了解它的时钟结构,先来看一下它的时钟结构图,如下图所示。

时钟配置 - 西区故事 - 松柏后凋

首先来看主时钟,给主时钟(main clock)提供选择有4个源,分别是:内部RC振荡器、未倍频之前的PLL时钟、内部看门狗时钟、经过PLL倍频之后的时钟。由对主时钟源选择寄存器(MAINCLKSEL)的操作来进行选择,同一时刻只能选择一种时钟做为主时钟。下面就给出MAINCLKSEL寄存器的位结构(要注意,因为LPC1114是32位的,所以所有的寄存器都是32位的),如下表所示。

 

符号

描述

复位值

1∶0

SEL

00

内部RC振荡器

0x00

01

PLL倍频之前的时钟

10

内部看门狗时钟

11

PLL倍频之后的时钟

31∶2

-

-

保留

0x00

 

前面说过,一般情况下CPU内部都是要进行倍频的,因此大多数时候该寄存器的值都会选择11(0x03),执行语句“SYSCON->MAINCLKSEL=0x00000003”就可以了。

接下来看系统PLL时钟,PLL即是频率锁相环的意思,PLL的功能很多,有兴趣的可自行参考其它资料,这里主要利用它来实现倍频的功能。从上图中可以看出,供给PLL选择的有2个源,一个是片内RC振荡器,另一个是晶体振荡器。由对系统PLL时钟选择寄存器(SYSPLLCLKSEL)的操作来进行选择,同一时刻只能选择一种时钟做为输入时钟。下面给出SYSPLLCLKSEL寄存器的位结构,如下表所示。

 

符号

描述

复位值

1∶0

SEL

00

内部RC振荡器

0x00

01

晶体振荡器

10

保留

11

保留

31∶2

-

-

保留

0x00

 

一般情况下,为了提高时钟精度都会选择01(0x01),以选择外部晶体振荡器做为时钟输入。执行语句“SYSCON->SYSPLLCLKSEL=0x00000001”就可以了。

在时钟结构图中还可以看出,主时钟分成6路供给不同的模块。其中一路主时钟经过系统时钟分频器(SYSAHBCLKDIV)后做为系统时钟,提供给AHB。在LPC1114中,只有通用输入输出端口(GPIO)需要AHB。为了给不同速度的模块(如内核、存储器、APB等)提供时钟,需要对SYSAHBCLKDIV寄存器进行操作,以对主时钟进行分频。下面给出SYSAHBCLKDIV寄存器的位结构,如下表所示。

 

符号

描述

复位值

7∶0

DIV

00000000

关闭系统时钟

0x01

00000001

1

00000010

2

……

……

11111111

255

 

31∶8

-

-

保留

0x00

 

从表中可以看出,分频的最大值是255分频。一般情况下,系统的默认值是1,即为AHB提供不分频的主时钟,也可执行语句“SYSCON->SYSAHBCLKDIV=0x00000001”来实现。剩余5个模块(SPI0、UART、SPI1、WDT、CLKOUT)的时钟也像系统时钟一样由主时钟来分频,只不过它们默认的分频值为0,即默认不提供时钟,也就是说剩余的5个模块默认状态下不工作,需要的时候再通过程序来打开,以降低功耗。

由上述可见,居于Cotex-M0内核的CPU由于强化了时钟配置,所以在一般情况下要使用该类型的CPU,首要的任务就是为其配置正确的时钟。下面就来讨论一下如何通过程序来配置LPC1114的时钟。

先给出一个时钟初始化的函数,如下:

void SysCLK_config(void)

{

       uint8_t i;

       LPC_SYSCON->PDRUNCFG &= ~(1 << 5);            //给系统振荡器上电

       LPC_SYSCON->SYSOSCCTRL = 0x00000000;        //系统振荡器未旁路,1~12MHz输入

       for (i = 0; i < 200; i++) __nop();                                    //延时等待振荡器稳定

       LPC_SYSCON->SYSPLLCLKSEL = 0x00000001;    //PLL输入选择外部晶体振荡

       LPC_SYSCON->SYSPLLCLKUEN = 0x00;

       LPC_SYSCON->SYSPLLCLKUEN = 0x01;              //先写0后写1更新时钟源

       while (!(LPC_SYSCON->SYSPLLCLKUEN & 0x01));     //等待更新完成

       LPC_SYSCON->SYSPLLCTRL = 0x00000013;        //M=4、P=2,倍频后的时钟为48MHz

       LPC_SYSCON->PDRUNCFG &= ~(1 << 7);           //给PLL上电

       while (!(LPC_SYSCON->SYSPLLSTAT & 0x01));    //等待PLL锁定

       LPC_SYSCON->MAINCLKSEL = 0x00000003;      //主时钟选择PLL倍频后的时钟

       LPC_SYSCON->MAINCLKUEN = 0x00;

       LPC_SYSCON->MAINCLKUEN = 0x01;                 //先写0后写1更新时钟源

       while (!(LPC_SYSCON->MAINCLKUEN & 0x01));        //等待更新完成

       LPC_SYSCON->SYSAHBCLKDIV = 0x00000001; //AHB为1分频,AHB时钟为48MHz

       LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);        //使能GPIO时钟

}

如果使用的是12MHz的外部晶振,该函数执行完后,LPC1114的时钟被设置成为主时钟48MHz,AHB时钟48MHz,输入输出端口(GPIO)时钟使能的状态。

在上述程序中,PLL输入选择寄存器(SYSPLLCLKSEL),主时钟选择寄存器(MAINCLKSEL),AHB分频选择寄存器(SYSAHBCLKDIV)均在前面讨论过,下面来看一下没讨论过的寄存器。先看“掉电配置寄存器(PDRUNCFG)”,下表是它的位结构。

 

符号

描述

复位值

0

IRCOUT_PD

(IRC振荡器输出掉电)

1

掉电

0

0

上电

1

IRC_PD

(IRC振荡器掉电)

1

掉电

0

0

上电

2

FLASH_PD

(Flash掉电)

1

掉电

0

0

上电

3

BOD_PD

(BOD掉电)

1

掉电

0

0

上电

4

ADC_PD

(ADC掉电)

1

掉电

1

0

上电

5

SYSOSC_PD

(系统振荡器掉电)

1

掉电

1

0

上电

6

WDTOSC_PD

(看门狗振荡器掉电)

1

掉电

1

0

上电

7

SYSPLL_PD

(系统PLL掉电)

1

掉电

1

0

上电

8

-

-

保留

1

9

-

0

保留,置0

0

10

-

-

保留

1

11

-

1

保留,置1

1

12

-

0

保留,置0

0

15∶13

-

-

保留

1

31∶16

-

-

保留

 

 

从表中可以看出,系统振荡器和系统PLL在默认情况下是掉电的,也就是说默认它们不处于工作状态,要让它们工作就必须给它们置0上电。所以要通过执行语句“SYSCON->PDRUNCFG &= ~(1 << 5)”和“SYSCON->PDRUNCFG &= ~(1 << 7)”来把SYSOSC和SYSPLL置0。

接下来看“系统振荡器控制寄存器(SYSOSCCTRL)”,下表是它的位结构。

 

符号

描述

复位值

0

BYPASS

(旁路系统振荡器)

0

未被旁路

0

1

被旁路

1

FREQRANGE

(低功耗振荡器确定频率范围)

0

1~20MHz

0

1

15~25MHz

31∶2

-

-

保留

0

 

从表中可以看出,如果要让系统振荡器工作,则其第0位就应该选择0,即不被旁路,只有在从外部直接输入振荡信号的情况下才会选择旁路(比如使用有源晶振)。第1位用于选择外部晶振的频率范围,使用12MHz时该位选择0。执行语句“SYSCON->SYSOSCCTRL = 0x00000000”就可以实现上述配置,但实际上复位后的值就是该配置,也可不执行该语句。

从上述程序中还可以看出,在配置了时钟后(无论是PLL时钟还是主时钟),都需要更新一下才能正常工作。而更新的操作则根据管方手册,必须要给相应的允许寄存器“toggle”一下(即先向其写0再紧接着写1)。“系统PLL时钟源更新允许寄存器(SYSPLLCLKUEN)”和“主时钟源更新允许寄存器(MAINCLKUEN)”的位结构是一样的,下表是MAINCLKUEN寄存器的位结构。

 

符号

描述

复位值

0

ENA

(允许主时钟源更新)

0

无变化

0

1

更新时钟源

31∶1

-

-

保留

0

 

在主时钟源及PLL时钟源更改后,要紧接着及时更新相应的允许寄存器才能让其正常工作。此外还要注意一点,“toggle”后需要查询相应的允许寄存器是否已更新,若没有就需要等待直到其更新为止(例如在更新PLL时钟源更新允许寄存器SYSPLLCLKUEN后要执行语句“while (!(LPC_SYSCON->SYSPLLCLKUEN & 0x01));”,以等待其更新完成)。

接下来看一下PLL的配置,要让PLL对输入时钟进行倍频或分频,就要配置“系统倍频控制寄存器(SYSPLLCTRL)”,下表是该寄存器的位结构。

 

符号

描述

复位值

4∶0

MSEL

(反馈分频器的值,

分频器的值M是MSEL+1)

00000

M=1

0x00

……

……

11111

M=32

6∶5

PSEL

(后分频器的值,

分频器的值为2×P)

00

P=1

0x00

01

P=2

10

P=4

11

P=8

31∶7

-

-

保留,不能写1

0x00

 

PLL的输出频率要符合下面的公式。

时钟配置 - 西区故事 - 松柏后凋

Fclkout为PLL的输出频率,Fclkin为外部晶振的频率,FCCO的值必须在156MHz ~320MHz之间,M为倍频的倍数,P值要符合要求。若以12MHz的晶振做为输入,系统主时钟要为48MHz,则M=4(MSEL=0011),P的值只能取2(PSEL=01)才能满足公式要求。因此寄存器SYSPLLCTRL的值应该为10011(0x13),所以要配置此项只需要执行语句“SYSCON->SYSPLLCTRL = 0x00000013”就可以了。

在改变了PLL的倍频之后,需要查询“倍频状态寄存器(SYSPLLSTAT)”,看PLL锁定了没有,若没有就需要等待直到其锁定为止(执行语句“while (!(LPC_SYSCON->SYSPLLSTAT & 0x01));”)。下面是“倍频状态寄存器(SYSPLLSTAT)”的位结构。

 

符号

描述

复位值

0

LOCK

(PLL锁定状态)

0

未锁定

0

1

已锁定

31∶1

-

-

保留

0

 

CPU要对GPIO进行操作,就必须给GPIO时钟信号,即需要使能GPIO的时钟。在默认情况下GPIO时钟是允许的,也可以对“系统AHB时钟控制寄存器(SYSAHBCLKCTRL)”中相应的位进行操作来选择允许时钟,下面是该寄存器的位结构。

 

符号

描述

复位值

0

SYS

(允许AHB时钟,只读)

0

保留

1

1

允许

1

ROM

(允许ROM时钟)

0

禁止

1

1

允许

2

RAM

(允许RAM时钟)

0

禁止

1

1

允许

3

FLASHREG

(允许flash寄存器接口时钟)

0

禁止

1

1

允许

4

FLASHARRAY

(允许flash阵列存取时钟)

0

禁止

1

1

允许

5

I2C

(允许I2C时钟)

0

禁止

0

1

允许

6

GPIO

(允许GPIO时钟)

0

禁止

1

1

允许

7

CT16B0

(允许16位计数/定时器0时钟)

0

禁止

0

1

允许

8

CT16B1

(允许16位计数/定时器1时钟)

0

禁止

0

1

允许

9

CT32B0

(允许32位计数/定时器0时钟)

0

禁止

0

1

允许

10

CT32B1

(允许32位计数/定时器1时钟)

0

禁止

0

1

允许

11

SSP0

(允许SPI0时钟)

0

禁止

1

1

允许

12

UART

(允许UART时钟)

0

禁止

0

1

允许

13

ADC

(允许ADC时钟)

0

禁止

0

1

允许

14

-

-

保留

0

15

WDT

(允许WDT时钟)

0

禁止

0

1

允许

16

IOCON

(允许IO配置模块时钟)

0

禁止

0

1

允许

17

-

-

保留

0

18

SSP1

(允许SPI1时钟)

0

禁止

0

1

允许

31∶19

-

-

保留

0x00

 

 

从表中可以看出,第6项就是“通用输入输出端口”的时钟配置项,执行语句“SYSCON->SYSAHBCLKCTRL |= (1<<6)”就可以开启GPIO的时钟。在打开了GPIO的时钟后,就可以使用P0~P3端口了。

上述的时钟配置程序是最基本的,也是必须的,因此在任何程序开始前,都应该先调用该时钟配置函数,以对LPC1114进行基本的时钟配置,为后续程序提供保障。

关键字:LPC1114  时钟配置 引用地址:LPC1114时钟配置

上一篇:时钟配置的仿真
下一篇:LPC11XX.h头文件解析

推荐阅读最新更新时间:2024-03-16 15:06

STM32 时钟RCC相关配置参考stm32f10x_rcc.h
1. 时钟使能配置: RCC_LSEConfig()、RCC_HSEConfig()、 RCC_HSICmd()、RCC_LSICmd()、RCC_PLLCmd()...... 2. 时钟源相关配置: RCC_PLLConfig()、RCC_SYSCLKConfig()、 RCC_RTCCLKConf()..... 3. 分频系数选择配置: RCC_HCLKConfig()、RCC_PCLK1Config()、RCC_PCLK2Config()...... 4. 外设时钟使能: RCC_APB1PeriphClockCmd(); // APB1线上外设时钟使能 RCC_APB2PeriphC
[单片机]
STM32 <font color='red'>时钟</font>RCC相关<font color='red'>配置</font>参考stm32f10x_rcc.h
stm32时钟配置
STM32时钟系统 在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 ①HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。 在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法 如果使用内部RC振荡器而不使用外部晶振,请按照下
[单片机]
STM32F1系列HAL库配置系统时钟
其实一开始对于时钟我也是知之甚少,在MSP432中我就一直忽视时钟配置,其实也是在STM32学习时落下的病根,现在趁有空补一下。 时钟简单讲解 对于时钟系统,在之前我写启动文件涉及到,其实,每个功能的实现都涉及到时钟。我们首先说明一下RCC RCC:复位和时钟控制 什么是复位,什么又是时钟?在STM32参考手册中文版我们可以看到 注意“除了时钟控制器的RCC_CSR寄存器中的复位标志位和备份区域中的寄存器(见图4)以外,系统复位将复位所有寄存器至它们的复位状态。”这句话告诉我们复位时,让寄存器(除了上述提及的CSR以及备份区域寄存器外)恢复至初始状态,也就是我们上电后寄存器的默认状态。 我们使用时也是在不断复位中使用的
[单片机]
STM32F1系列HAL库<font color='red'>配置</font>系统<font color='red'>时钟</font>
STM32基于官方库函数的时钟配置
stm32可选的时钟源 在STM32中,可以用内部时钟,也可以用外部时钟,在要求进度高的应用场合最好用外部晶体震荡器,内部时钟存在一定的精度误差。 准确的来说有4个时钟源可以选分别是HSI、LSI、HSE、LSE(即内部高速,内部低速,外部高速,外部低速),高速时钟主要用于系统内核和总线上的外设时钟。低速时钟主要用于独立看门狗IWDG、实时时钟RTC。 ①、HSI是高速内部时钟,RC振荡器,频率为8MHz,上电后默认的系统时时钟 SYSCLK = 8MHz,Flash编程时钟。 ①、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③、LSI是低速内部时钟,RC振荡器,频率为40kHz
[单片机]
STM32基于官方库函数的<font color='red'>时钟</font><font color='red'>配置</font>
STM32库程序编程出现的串口,时钟配置与实际的不同的问题
前些日子,到网上下了STM32的库文件,自己建了个工程,虽然工程建成功了,但是调试定时器与串口的时候,却出现了以下问题: 1、调i的时候,我设置定时1s钟,每秒让LED轮流亮灭,结果程序出现每2sLED轮流亮灭一次??? 2、调试串口的时候,我设置波特为115200,结果串口调试助手的波特率调到57600才那个正常收发??? 鉴于上两种正常的状态,可以总结出:期望与实际存在2倍的关系,可以肯定不是定时器货串口配置问题,而是时钟系统上出现了问题,所以在线仿真调试发现(我使用的外部时钟8M),在void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)函数中 RCC_Clocks-
[单片机]
RCC-使用HSE, HSI 配置时钟
本工程板级支持包文件适用于野火stm32f429 开发板。 编程要点 开启HSE/HSI,并等待HSE/HSI 稳定 设置AHB, APB2, APB1 的预分频因子 设置PLL 的时钟来源,设置VCO 输入时钟分频因子PLL_M,设置VCO 输出时钟倍频因子PLL_N,设置PLLCLK 时钟分频因子PLL_P,设置OTGFS, SDIO, RNG 时钟分频因子PLL_Q 开启PLL,并等待PLL 稳定 把PLLCLK 切换为系统时钟SYSCLK 读取时钟切换状态位,确保PLLCLK 被选为系统时钟 bsp_clk.c /** ************************************************
[单片机]
RCC-使用HSE, HSI <font color='red'>配置</font><font color='red'>时钟</font>
cortex-m0 lpc1114怎么切换引脚功能
1.引脚都有哪些功能该怎么看? 看具体引脚有什么功能,看上面的引脚图即可,这个图可以在LPC1114用户手册的第9章“Pin Configuration”找到。 2.默认的引脚功能是什么? 大部分的引脚默认功能都是GPIO,个别除外,例如P0.0引脚,默认是RESET。具体某个引脚的默认功能是什么,可以打开LPC1114用户手册第7章“I/O Configuration”查看引脚的寄存器。 例如,我们要看P0.2引脚的默认功能,首先打开LPC1114用户手册,然后找到第7章,打开7.4节前面的“+”号,把所有的引脚寄存器都展开,最后找到P0.2引脚的寄存器,就可以了。 该寄存器的前3位,也就是bit0~bit2,用
[单片机]
cortex-m0 <font color='red'>lpc1114</font>怎么切换引脚功能
msp430f149学习心得之一 时钟配置
近期要参加电子设计大赛,我们的微处理器选择了msp430(高性能不说,关键很多系列的芯片可到TI官网免费申请到),本人负责软件,之前并没有深入接触过msp430系列的单片机,但还稍稍有点51的底子,现将本人学习430的一点小心得与大家分享~ ********************************基于MSP430F169****************************** 在MSP430单片机中,一个时钟周期 = MCLK晶振的倒数。如果MCLK是8MHz,则一个时钟周期为1/8us。 MSP430单片机的时钟模块主要包括: 三个时钟:辅助时钟ACLK 、主时钟MCLK 、子系统时钟SMCLK 三
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved