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

32位单片机LPC11C14学习

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

LPC_SYSCON->

LPC_SYSCON->

SYSCON->

SYSCON->

SYSCON->

SYSCON->

SYSCON->

SYSCON->

while (!(SYSCON->

SYSCON->

SYSCON->

while (!(SYSCON->

SYSCON->

SYSCON->

SYSCON->

SYSCON->SYSCON->MAINCLKUEN = 0x01;

while (!(SYSCON->MAINCLKUEN &0x01)); //确定主时钟锁定以后向下执行

SYSCON->SYSAHBCLKdiv = 0x01;//AHB时钟分频值为1,使AHB时钟设置为48Mhz

}

程序详解:

在看程序详解之前,你最好先看一遍程序。

(如果你是一位刚刚从51单片机接触ARM单片机的朋友,你会发现这个函数里面的语句书写方式完全和以前写51程序不一样啊,以前给51的寄存器写值,是用这么一种形式:

SBUF = 0X88;

而现在是用这么一种形式:

SYSCON->MAINCLKSEL=0X00000001;

这里为什么不直接写成:

MAINCLKSEL=0X00000001;

这其实是因为在NXPLPC11XX.H文件中对系统寄存器的定义采用了结构体(Struct)的形式。现在,你可以在打开51单片机寄存器的定义文件REG51.H文件看一下,它对寄存器的地址定义是这样的:

sfr SBUF = 0x99;

现在你再打开一下LPC1114对寄存器地址定义的NXPLPC11XX.H文件!全都是结构体的定义,而且是纯C语言写的,再也找不到“sfr”这样的C51语言了。关于NXPLPC11XX.H文件请看瑞嵌制作的《NXPLPC11XX.H文件详解》。)

(在以后的程序中,我们会经常看到&=~(1<3)和|=(1<3);这样的句子,这些句子是对位操作用的。因为我们经常要对32位寄存器的某一位操作,还同时不影响其它位的值,所以才有了上面这样的形式。比如我们说我们要对某个寄存器的bit5(注意:可不是第5位,位是从0开始的)写0,这样写:

寄存器&=~(1<5);

对寄存器的bit5写1,这样写:

寄存器|=(1<5);

现在运用你的C语言知识分析一下,把十进制的1写成二进制32位数就是:

00000000000000000000000000000001

(1<5)就是把1右移5下,左面补零,执行完这句话以后数就变成:

00000000000000000000000000100000

~(1<5)就是再把这个数反相:

11111111111111111111111111011111

最后呢!再把这个数&给寄存器,&的操作即是遇到0与1等于0,1与0或1都还是1,所以执行完以后,除了bit5被改成了0,其它的位都没有变。按照相同的方法,你可以分析一下对bit5写1的操作。)

现在,我们首先来看一下函数里的第一个语句是对PDRUNCFG寄存器操作,如果你的英语好的话,一眼就看出来这个寄存器是干嘛的了,就是“掉电配置寄存器”,之所以不叫“上电配置寄存器”是因为它是对某位写“1”掉电,写“0”上电。这个寄存器的描述请看官方数据手册第三章。看这个寄存器的bit5,该位控制着系统振荡器的上电与掉电,默认是1,就是掉电状态,我们既然已经决定了要用外部晶振作为时钟源,那么现在就该把它上电了,于是就有了这条语句。

接下来这条语句是对SYSOSCCTRL寄存器操作,这个寄存器叫做“系统振荡器控制寄存器”。(在后面的学习中,你会经常看到,系统内部的模块需要好几道门槛配置以后才能用,除了上电,还得控制,有的还需要再允许一下。这样做看似麻烦,其实灵活!)系统控制寄存器只用了2个bit,bit0控制着系统振荡器有没有被旁路,bit1要根据外部晶振的值是多少来写1或0。先说bit0,“被旁路”的意思就是“让它不起作用”;“未被旁路”的意思就是“没有让它不起作用”。写0表示“未被旁路”,写1表示“被旁路”。那么什么时候被旁路呢?答:在有外部的“直接时钟源”的时候。如果你51单片机学的很棒的话,你现在就应该明白了,不明白的那就听我给你解释吧。其实51单片机也有不利用外部晶振而是利用“直接时钟源”的时候,电路图是这个样子的:

这里我们不需要旁路晶振,所以对该位写0。bit1是根据外部晶振的值来定的,对该位写0表示外部晶振频率值在1~20MHz范围内,写1表示外部晶振频率值在15~50MHz范围内。在我们的开发板上用的晶振为12MHz,所以对该位写0。

再往下是一条短暂延时程序,利用__nop();实现。给它一点时间完成任务。

再接下来的5条语句你可以把它看成一个整体,对PLL时钟源的更新都是这个样子的。关于SYSPLLCLKSEL寄存器,前面已经讲过了。 SYSPLLCLKUEN是PLL时钟源更新允许寄存器,根据官方数据手册上的规定,要想实现更新,需要对该寄存器toggle一下,也就是对该寄存器先写0,再写1。while语句等待我们刚才写的1运输到SYSPLLCLKUEN里面。时钟源的更新往往是需要一定时间的。

接下来,就该把选择的时钟源翻倍了。SYSPLLCTRL是系统倍频控制寄存器,通过它可以确定倍频的倍数。倍频器是一个很有特点的东西。它除了可以用在单片机当中,还可以用在好多需要它的地方,比如射频无线芯片当中可以用它来提高发射功率。倍频器运用了模拟电子技术和数字电子技术。有时集成到芯片当中,有时单独做成一块芯片!关于LPC1114的倍频器(PLL)的详细描述,请看官方数据手册第三章第九节。SYSPLLCTRL的bit0~bit4确定M 值,bit5和bit6确定P值,bit7是DIRECT位,bit8是BYPASS位。其它位保留。bit7和bit8我们现在还不深究(要深

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

网站地图

Top