微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 32位单片机LPC11C14学习

32位单片机LPC11C14学习

时间:11-29 来源:互联网 点击:

LPC_SYSCON->

LPC_SYSCON->

就看完了,接下来看“主时钟”右面的!

右面部分从上往下看,首先呢,是“系统时钟分频器”方框,方框的右面横线上写着“系统时钟”四个字。怎么样!迷惑了吧!这里方框中所提到的“系统时钟分频器”其实就是“系统AHB时钟分频器(SYSAHBCLKdiv)”。这个寄存器的名字会把好多人迷惑的!因为这个分频器可不仅仅给 AHB(LPC1114的AHB只有GPIO,关于什么是AHB,什么是APB,去百度搜一下吧!介绍需要两页纸哦!)提供时钟的,它除了给AHB提供时钟,还给内核,存储器以及APB提供时钟。一定意义上说,它就是“系统时钟分频器”了,给这个寄存器写0,LPC1114就不工作了;给这个寄存器写 1,LPC1114的系统时钟就是主时钟除以1;写2,LPC1114的系统时钟就是主时钟除以2,以此类推!假如把外部晶振倍频了4倍作为主时钟,主时钟就是48MHz,对SYSAHBCLKdiv写4,系统时钟就是12MHz。这时候有人就会有疑问了:“神经病啊!既然都倍频起来了,还要缩小”!其实这是因为有时候我们的电路板上的其它芯片不能够在很快的频率下工作,否则就会出错,比如无线通信芯片NRF24L01的速率就不能超过10MHz,所以某些时候,需要多分频了。规定最多可以分频255,所以你就可以想到,这个寄存器只用8位就可以了:

位(bit) 符号 值 描述 复位值

7:0 div 00000000 关闭系统时钟 00000001

00000001 用1除

00000010 用2除

......

......

11111111 用255除

31:8 - - 保留 0

一般情况下,我们写1,程序如下:(这条语句可以不用写,因为默认值就是1)

SYSCON->SYSAHBCLKdiv = 0x01;//AHB时钟分频值为1

再往下看图,数一下,有6个分频器,这6个分频器是:SSP0分频器,SSP1分频器,UART分频器,SysTick分频器,看门狗分频器和CLKOUT引脚分频器。

这些分频器寄存器和SYSAHBCLKdiv是一样的,都是用了8位,都是可以最多分频255,我这里就不把表格画出来了,唯一不同的是,这6个分频器寄存器的复位值为0,而不是1。也就是说,在默认情况下,这些外设都是不工作的(没有时钟怎么工作!)这完全是为了节能做贡献,不用就不让它浪费电,用的时候再开!

看最后两个分频器!通过上面的介绍,你现在也可以看懂了,图上说:看门狗的时钟源可以有3个来源,不仅仅只有“看门狗振荡器”可以给它提供,还可以用主时钟或是IRC振荡器!多么灵活的LPC1114呀!

LPC1114上的第四引脚是:PIO0_1/CLKOUT/CT32B0MAT2。这个脚可以当做P0.1脚,CLKOUT引脚和32位定时器的输出脚。CLKOUT引脚,顾名思义,它是用来输出时钟的,输出时钟有什么用?

用处1:给别的需要时钟的芯片提供时钟;

用处2:用示波器观察此引脚上的频率可以判断你写的时钟配置程序是否正确。

这个引脚在默认的情况下是P0.1脚,假如你要看看到底有没有把外部的12MHz晶振倍频到48MHz,你可以把这只脚配置为CLKOUT引脚,用示波器观察观察!

由图中可知,它可以选择IRC振荡器,系统振荡器,看门狗振荡器以及主时钟源作为时钟源,选择谁作为它的时钟源,你就可以看到谁的频率到底是多少了。

(在下面会给出实现的程序,不要急哦!)我曾经用这个脚观察了一下IRC振荡器的频率,值在12.01MHz和12.00MHz之间来回跳!后来又看了一下外部晶振的频率,稳稳的显示12.00MHz。

到现在,这张图就看完了,你也应该看懂了!

除了上面提到的“选择寄存器”,还需要有“使能寄存器”的配合才能使选择的时钟源起作用。下面是一个典型的时钟配置函数:

void SysCLK_config(void)

{

uint8 i;

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

SYSCON->SYSOSCCTRL = 0x00000000;//振荡器未被旁路,1~20Mhz频率输入

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

SYSCON->SYSPLLCLKSEL = 0x00000001;//PLL时钟源选择“系统振荡器”

SYSCON->SYSPLLCLKUEN = 0x01;//更新PLL选择时钟源

SYSCON->SYSPLLCLKUEN = 0x00;//先写0,再写1达到更新时钟源的目的

SYSCON->SYSPLLCLKUEN = 0x01;

while (!(SYSCON->SYSPLLCLKUEN &0x01)); //确定时钟源更新后向下执行

SYSCON->SYSPLLCTRL = 0x00000023; //设置M=4;P=2;FCLKOUT=12*4=48Mhz

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

while (!(SYSCON->SYSPLLSTAT &0x01)); //确定PLL锁定以后向下执行

SYSCON->MAINCLKSEL = 0x00000003;//主时钟源选择PLL后的时钟

SYSCON->MAINCLKUEN = 0x01; //更新主时钟源

SYSCON->MAINCLKUEN = 0x00;//先写0,再写1达到更新时钟源的目的

SYSCON->

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top