我前边发了4篇文章,时钟全部为默认时钟RC 12Mhz
这次发表怎么启用PLL到最高72Mhz
教程全部由我手工打造,一边学习一学发教程
全部写寄存器操作,便于理解,没有使用库。
- #include "lpc15xx.h"
- int main(void){
- LPC_SYSCON->SYSAHBCLKCTRL0|=1<<12|1<<13|1<<14|1<<15|1<<16; //开启swm,iocon,p0,p1,p2时钟
-
- SysTick_Config(6000000); //12mhz 0.5s,没有启用PLL,时钟默认是RC,12MHZ,
- LPC_GPIO_PORT->DIR[1]|=2; //p1.1紫色灯指示,设置为输出
- while(1);
- }
- void SysTick_Handler(){
- LPC_GPIO_PORT->NOT[1]=1<<1; //0.5s反向一次,即以1HZ频率闪烁。
- }
- void SystemInit(void){
- LPC_SYSCON->PDRUNCFG&=~(1<<21); //osc上电
- LPC_SYSCON->PDRUNCFG&=~(1<<22); //PLL上电
- LPC_SYSCON->SYSOSCCTRL=0; //主振荡器上电 1-20M范围输入
- LPC_SYSCON->SYSPLLCLKSEL=1; //PLL输入为外部晶振 Crystal Oscillator
- LPC_SYSCON->SYSPLLCTRL=5|(1<<6); //p76 12mhz*6
- while(!LPC_SYSCON->SYSPLLSTAT); //等待PLL锁定完成
- LPC_SYSCON->MAINCLKSELB=2; //pll out sel
-
- }
- //end
复制代码这次代码我用了上次的LED的示例,如果在12MHZ时钟下是一秒闪一次,在本例72MHZ时钟下,1秒闪6次,
前几次例程中SystemInit该函数都是空的,不能删,必须要,
因为在startup_lpc15xx.h中要调用该函数以及MAIN函数,
启用PLL中,首先要相关模块上电,默认PLL及外部晶振掉电,需上电,LPC_SYSCON->PDRUNCFG&=~(1<<21)
时钟图见下图
然后选择振荡器晶振输入范围,LPC_SYSCON->SYSOSCCTRL=0; //主振荡器上电 1-20M范围输入
选择PLL时钟为外部晶振输入,LPC_SYSCON->SYSPLLCLKSEL=1;
选择倍频,见手册76页,如图 LPC_SYSCON->SYSPLLCTRL=5|(1<<6); //p76 12mhz*6
等待PLL稳定,while(!LPC_SYSCON->SYSPLLSTAT);
切换时钟,LPC_SYSCON->MAINCLKSELB=2,
其实例程前2天就写好了,可就在这一句,LPC_SYSCON->MAINCLKSELB=2,,调试的时候鼠标不小心移动到前边几句了,然后编译,下载,结果下载不了啦,也不能擦除,今天才通过ISP擦除才成功。
再说一句,一定要等PLL稳定完成,所有时钟就绪,才能将系统主时钟切换至PLL输出,否则就死锁了,
如不小心锁住可下载ISP软件,通过串口擦除FLASH,软件如图
然后开启SYSTICK定时器,LED指示,
pll.zip
(137.72 KB, 下载次数: 10)
下载演示工程,
此系列教程全部由我原创
可在论坛搜索 LPC1500体验+@ 来查找我的其它教程
我的其它教程
1 LPC1500体验+@1-入门环境熟悉【系列教程】
2 LPC1500体验+@2-点亮LED【系列教程】
3 LPC1500体验+@3-GPIO中断【系列教程】
4.LPC1500体验+@4-systick系统滴达定时器【系列教程】
大家互相学习,如有问题可发表互相交流,
如果支持就多多回复,让我更有信心再继续发表。谢谢大家。