32位单片机LPC11C14学习
GPIOSetDir( PORT0, 1, 0 );
GPIOSetValue() 一个是设置端口方向,一个是设置输出的值,直接调用就可以了。
如果在片内RAM当中运行代码并且应用程序需要调用中断,那么必须将中断向量重新映射到Flash地址0x0。这样做是因为所有的异常向量都位于地址0x0及以上。通过将寄存器MEMMAP(位于系统控制模块当中)配置为用户RAM模式来实现这一点。
#ifdef __DEBUG_RAM
LPC_SYSCON->SYSMEMREMAP = 0x1;
#else
#ifdef __DEBUG_FLASH
LPC_SYSCON->SYSMEMREMAP = 0x2;
#endif
#endif
ARM 微控制器有一个显著的特点,就是都可以把时钟频率倍频到很高,具体到多高,每个系列的微控制器都有一个指标,我们现在要学的Cortex-M0内核处理器 LPC1114最高能到50MHz,当然,其它的ARM内核微处理器可以倍频到更高,现在好多手机都采用了ARM内核处理器,比如卖的很火的诺基亚 5233就是采用了ARM11处理器,ARM11的处理器的主频为433MHz,比Cortex-M0的50MHz高多了吧!所以Cortex-M0处理器被ARM称为入门级的内核!
要实现对系统时钟的配置,时钟配置图是必须要看懂的!因为它比文字更具有参考价值,看上这张图配置时钟,绝对不会出现漏洞!(我建议你把这张图打印出来贴到你的墙上,我就是这么做的,你看着办吧!)接下来,我将一步一步引领你彻底看懂这张“时钟配置图”。
注意了,要开始讲图了!(这张图就是数据手册说的时钟产生单元:CGU(Clock generationunit))
LPC1114 内部含有3个时钟振荡器:系统振荡器,IRC振荡器,看门狗振荡器。系统振荡器就是需要配合外部晶振工作的振荡器(这是任何一款单片机都有的);IRC振荡器就是内部RC振荡器,就是我在上面“总览LPC1114”中提到的那个LPC1114一上电就默认选择的12MHz时钟振荡器,它的精度没有配合外部晶振的系统振荡器高;看门狗振荡器就是给看门狗提供的时钟振荡器!这么说大家明白了吧,在接下来的叙述里面,一提到系统振荡器就是指利用外部晶振的时钟振荡器,IRC振荡器就是指LPC1114的内部时钟振荡器,可不要搞混了哦!
我们先从图的中心点看起,找到“主时钟”三个字,看“主时钟”的左面,有四条线到了“主时钟”的框上,这四条线就是“主时钟”的来源,它们分别是:IRC振荡器,看门狗振荡器,倍频之前的时钟(sys_pllclkin)和倍频之后的时钟(sys_pllclkout)。也就是主时钟可以在这四个时钟源当中选择一个做为主时钟!通过操纵(人家专业名词不叫“操纵”,叫“访问”)“主时钟源选择寄存器(MAINCLKSEL)”实现。这个32位的主时钟源选择寄存器MAINCLKSEL只用到了两位(谁让两位就可以表示四种状态呢!),剩下的全都是保留位,如下:
位(bit) 符号 值 描述 复位值
1:0 SEL 00 选择IRC振荡器 00
01 选择输入到PLL之前的时钟
10 选择看门狗振荡器
11 选择PLL之后的时钟
31:2 - - 保留 0
看复位值,系统默认情况下就是选择IRC振荡器作为系统的主时钟的。我们为了让LPC1114发挥出它最大的性能,就喜欢选择PLL(PLL就是倍频的意思)后的时钟,在程序中这样写:
SYSCON->MAINCLKSEL = 0x00000003;//主时钟源选择PLL后的时钟
接下来看图上,找到“系统PLL”方框,看它左面倒梯形方框的左面,有三条线,这三条线就是可以做为倍频时钟源的时钟源。这三个时钟源分别是:IRC振荡器,系统振荡器,看门狗振荡器。这不就是LPC1114的三个时钟振荡器么,原来它们都可以做为PLL的时钟源!该选择谁捏?这就要操纵“系统倍频时钟源选择寄存器(SYSPLLCLKSEL)”了。这个32位的寄存器也是只用到了两位:
(两位就可以表示四种状态了,三个状态当然是绰绰有余!)
位(bit) 符号 值 描述 复位值
1:0 SEL 00 选择IRC振荡器 00
01 选择系统振荡器
10 选择看门狗振荡器
11 保留
31:2 - - 保留 0
看复位值,系统默认情况下就是选择IRC振荡器作为PLL输入时钟源的。既然我们外部安插了精确的12M晶振,就是想把它做为时钟源的,选择上面表格当中的 01,就是选择了外部12M晶振!(我在先前提到过,“系统振荡器”就是代表外部的晶振,为了防止看的不仔细的朋友存在,我还是再说一遍吧!)
程序中这样写:
SYSCON->SYSPLLCLKSEL = 0x00000001;//PLL时钟源选择“系统振荡器”
当然,操作顺序应该是先选择PLL的时钟源,再选择主时钟源!
到现在,“主时钟”左面的部分就看完了,接下来看“主时钟”右面的!
右面部分从上往下看,首先呢,是“系统时钟分频器”方框,方框的右面横线上写着“系统时钟”四个字。怎么样!迷惑了吧!这里方框中所提到的“系统时钟分频器”其实就是“系统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。
到现在,这张图就看完了,你也应该看懂了!
除了上面提到的“选择寄存器”,还需要有“使能寄存器”的配合才能使选择的时钟源起作用。下面是一个典型的时钟配置函数:
关键词:
32位单片机LPC11C1
评论