lpc1114 SystemInit函数解释

2016-12-09 09:50:33来源: eefocus 关键字:lpc1114  SystemInit函数
  1. void SystemInit (void) {

  2. volatile uint32_t i;

  3. #if (CLOCK_SETUP)                                     /* Clock Setup           */

  4. #if ((SYSPLLCLKSEL_Val & 0x03) == 1)

  5. LPC_SYSCON->PDRUNCFG  &= ~(1 << 5);            /* Power-up System Osc */

  6. LPC_SYSCON->SYSOSCCTRL = SYSOSCCTRL_Val;

  7. for (i = 0; i < 200; i++) __NOP();

  8. #endif

  9. LPC_SYSCON->SYSPLLCLKSEL = SYSPLLCLKSEL_Val;     /*Select PLL Input            */

  10. LPC_SYSCON->SYSPLLCLKUEN  = 0x01;                /* Update Clock Source      */

  11. LPC_SYSCON->SYSPLLCLKUEN  = 0x00;                /* Toggle Update Register    */

  12. LPC_SYSCON->SYSPLLCLKUEN  = 0x01;

  13. while (!(LPC_SYSCON->SYSPLLCLKUEN & 0x01));        /* Wait Until Updated        */

  14. #if ((MAINCLKSEL_Val & 0x03) == 3)                      /* Main Clock is PLL Out    */

  15. LPC_SYSCON->SYSPLLCTRL    = SYSPLLCTRL_Val;

  16. LPC_SYSCON->PDRUNCFG     &= ~(1 << 7);          /* Power-up SYSPLL          */

  17. while (!(LPC_SYSCON->SYSPLLSTAT & 0x01));                /* Wait Until PLL Locked    */

  18. #endif

  19. #if (((MAINCLKSEL_Val & 0x03) == 2) )

  20. LPC_SYSCON->WDTOSCCTRL    = WDTOSCCTRL_Val;

  21. LPC_SYSCON->PDRUNCFG     &= ~(1 << 6);           /* Power-up WDT Clock      */

  22. for (i = 0; i < 200; i++) __NOP();

  23. #endif

  24. LPC_SYSCON->MAINCLKSEL    = MAINCLKSEL_Val;     /* Select PLL Clock Output    */

  25. LPC_SYSCON->MAINCLKUEN    = 0x01;                /* Update MCLK Clock Source */

  26. LPC_SYSCON->MAINCLKUEN    = 0x00;                /* Toggle Update Register     */

  27. LPC_SYSCON->MAINCLKUEN    = 0x01;

  28. while (!(LPC_SYSCON->MAINCLKUEN & 0x01));       /* Wait Until Updated     */

  29. LPC_SYSCON->SYSAHBCLKDIV  = SYSAHBCLKDIV_Val;

  30. #endif

  31. }

该函数位于KEIL自带的system_LPC11xx.c文件中,首先定义了一个变量,用来计数,然后一共使用了4个条件编译,其中1个总体的条件编译和3个嵌套条件编译。

  1. volatile uint32_t i;

定义了一个变量i

uint32_t 是指定义一个32位的无符号变量,把鼠标放到uint32_t的上面,单击鼠标右键,在弹出的菜单中选择“Go To Definition Of’uint32_t’”,如下图所示:

找keil定义

然后,stdint.h文件打开,在文件中,找到uint32_t的定义符,如下所示:

定义类型

可以看到,uint32_t 实际上是unsigned int类型,用typedef重新起了个类型名字而已。

在SystemInit()函数中,i的变量定义前面还加上了volatile关键字,其作用是不让编译器优化此变量,以免造成程序的错误。

第3行的#if和第30行的#endif共同组成了一个条件编译。

如果CLOCK_SETUP为1,则执行里面的语句,如果不为1,则从endif后面执行,在此函数中,endif后面没有任何语句了,所以,如果CLOCK_SETUP为0的话,系统时钟配置函数实际上什么也没有执行,如果想让单片机运行在默认的IRC 12MHz主频下,把CLOCK_SETUP定义为0即可。

把鼠标放到CLOCK_SETUP上面,单击鼠标右键,在弹出的菜单中选择“Go To Definition Of‘CLOCK_SETUP’”。

上图中看到,CLOCK_SETUP在文件中定义为1,所以里面的语句被编译执行。我们可以在这里把CLOCK_SETUP设置为0来禁止执行系统初始化函数.

第4行到到第8行,亦是一个条件编译,如果if括号中的条件为真,则执行

包含在里面的语句。由SYSPLLCLKSEL_VAL的值分析得出,这里是判断,是否需要启动系统振荡器。

在这里,涉及到了两个寄存器:PDRUNCFG和SYSOSCCTRL。

PDRUNCFG:掉电配置寄存器

符号描述复位值
0IRCOUT_PD
IRC 振荡器输出掉电0
0上电
1掉电
1IRC_PD
IRC 振荡器掉电0
0上电
1掉电
2FLASH_PD
Flash掉电0
0上电
1掉电
3BOD_PD
BOD掉电0
0上电
1掉电
4ADC_PD
ADC掉电1
0上电
1掉电
5SYSOSC_PD
系统振荡器掉电1
0上电
1掉电
6WDTOSC_PD
看门狗振荡器掉电1
0上电
1掉电
7SYSPLL_PD
系统PLL掉电1
0上电
1掉电
8
保留位. 只能给此位写1.1
9
保留位. 只能给此位写0.0
10
保留位. 只能给此位写1.1
11
保留位. 只能给此位写1.1
12
保留位. 只能给此位写0.0
15:13
保留位. 只能给此位写111.111
31:16
保留位

掉电控制寄存器中的bit0~bit7控制着7个模拟模块的掉电状态,对对应为写0上电,写1掉电。复位状态下,IRC、FLASH、BOD是上电状态,ADC模块、系统振荡器模块、看门狗振荡器模块、系统PLL是掉电状态。由此处就可以看到,为什么复位后是IRC在担当着单片机的工作时钟。

SYSOSCCTRL:系统振荡器控制寄存器

符号描述复位值
0BYPASS
系统振荡器控制位0x0
0系统振荡器有效
1系统振荡器失效。直接从XTALIN引脚输入外部时钟信号
1FREQRANGE
低功耗振荡器频率范围0x0
01 – 20 MHz 频率范围
115 – 25 MHz 频率范围
31:2保留0x00

 

系统振荡器控制寄存器只用到了bit0和bit1。

bit0 决定了是否启用系统振荡器。

bit0 = 0 代表启用,bit = 1代表不启用。

由复位值可以看到,默认是启用系统振荡器的。

在不启用系统振荡器的时候,可以用外部时钟信号直接输入到XTALIN引脚,就可以不使用外部晶振了。(所以,当你看到一个电路板上,某个单片机没有接晶振的时候,不要妄言断定它使用的是内部时钟,因为还有可能是使用外部时钟发生器来工作,或者是别的单片机产生的时钟输出引脚连接到了XTALIN引脚上。)

介绍完了这两个寄存器,再看程序第567行。

第5行,给寄存器PDRUNCFG寄存器的bit5写0,即给系统振荡器上电。(一眼看不出是给bit5写0的童鞋,请看第一章相关介绍)

第6行,把SYSOSCCTRL_VAL的值写到寄存器SYSOSCCTRL。

第7行,一个简单的延时函数,目的是等待系统振荡器上电完成。

第9行到第13行,设置PLL,涉及到两个寄存器:SYSPLLCLKSEL和SYSPLLCLKUEN。

SYSPLLCLKSEL:系统PLL时钟源选择寄存器

符号描述复位值
1:0SEL
系统PLL时钟源
0x0IRC振荡器
0x1系统振荡器
0x2保留
0x3保留
31:2
保留

该寄存器只用到了前两位,可以选择IRC振荡器或者系统振荡器作为PLL的时钟源。注意:切换时钟的时候,两个振荡器必须同时上电工作,等待所选择的振荡器稳定工作以后,才可以关系另外一个振荡器,当然,不关也可以,对于对功耗有要求的,最好还是关闭用不着的时钟。当使用CAN模块,且CAN的通信速率大于100kbit/s时,必须选择系统振荡器工作。

SYSPLLCLKUEN:系统PLL时钟更新寄存器

符号描述复位值
0ENA
允许系统PLL时钟更新0x0
0没有改变
1更新时钟源
31:1保留0x00

当SYSPLLCLKSEL中的值改变以后,需要对此更新寄存器先写0再写1达到时钟更新的目的。

第9行,当SYSPLLCLKSEL_Val = 0x1,选择IRC时钟,当SYSPLLCLKSEL_Val = 0x2,选择系统振荡器时钟。

第10~12行,更新系统PLL时钟。

第13行,在时钟更新未成功时,一直在while循环;当时钟更新成功后,跳出while循环向下执行。

第14~18行,条件编译,如果主时钟选择PLL输出,则执行里面的语句。涉及到3个寄存器:SYSPLLCTRL、PDRUNCFG、SYSPLLSTAT

其中,PDRUNCFG寄存器在前面已经讲过。

SYSPLLCTRL:系统PLL控制寄存器

符号描述复位值
4:0MSEL
反馈分频值, M=MSEL+1


00000: M = 1

to

11111: M = 32.

0x000
6:5PSEL
后置分频比率0x00
0x0P = 1
0x1P = 2
0x2P = 4
0x3P = 8
31:7保留位,不准给这些位写10x0

该寄存器决定了PLL的乘数M和除数P,bit0~4决定了乘数M = MSEL +1,bit5和bit6决定了除数P。

 

SYSPLLSTAT:系统PLL状态寄存器

符号描述复位值
0LOCK
PLL 锁状态0x0
0PLL没有锁
1PLL 已锁
31:1
保留0x00

这是一个只读存储器,只用到了bit0,用来观察PLL是否锁定。只有当PLL锁定的时候,PLL才可以正常工作。

第15行,写入MSEL和PSEL值。

第16行,给PDRUNCFG的bit7写0,即PLL上电。

第17行,循环读取SYSPLLSTAT的值,直到PLL锁定后先下执行。

第19~23行,条件编译,如果主时钟源选择看门狗振荡器时钟,就执行里面的的语句。涉及到2个寄存器:WDTOSCCTRL和PDRUNCFG。

其中,PDRUNCFG寄存器前面以已经讲过。

WDTOSCCTRL:看门狗振荡器控制寄存器

符号描述复位值
4:0DIVSEL
Fclkana分频值


wdt_osc_clk = Fclkana/ (2 (1 + DIVSEL))

00000: 2 (1 + DIVSEL) = 2

00001: 2 (1 + DIVSEL) = 4

to

11111: 2 (1 + DIVSEL) = 64

0
8:5FREQSEL
看门狗振荡器模拟输出频率选择位(Fclkana).0x0
0x10.6 MHz
0x21.05 MHz
0x31.4 MHz
0x41.75 MHz


0x52.1 MHz
0x62.4 MHz
0x72.7 MHz
0x83.0 MHz
0x93.25 MHz
0xA3.5 MHz
0xB3.75 MHz
0xC4.0 MHz
[1] [2]

关键字:lpc1114  SystemInit函数

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/article_2016120932127.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:cortex m0 lpc1114 clkout配置程序
下一篇:最后一页

论坛活动 E手掌握
微信扫一扫加关注
论坛活动 E手掌握
芯片资讯 锐利解读
微信扫一扫加关注
芯片资讯 锐利解读
推荐阅读
全部
lpc1114
SystemInit函数

小广播

独家专题更多

东芝在线展会——芯科技智社会创未来
东芝在线展会——芯科技智社会创未来
2017东芝PCIM在线展会
2017东芝PCIM在线展会
TI车载信息娱乐系统的音视频解决方案
TI车载信息娱乐系统的音视频解决方案
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved