LPC1754内部PLL0原理及应用设计详解

lpc175x作为nxp公司主推的cortex-m3内核芯片,广泛应用于各工控、电子计量、报警系统等领域,无论何种应用,根据实际需求选择合适的时钟源并配置合理的系统时钟频率都是必不可少的。
振荡器
以easyarm-1754m3开发板为例,lpc1754芯片外部晶体振荡器包含两个,一个频率为12mhz外部高速晶振和一个频率为32.768khz的外部低速晶振,两个都可以使用软件设置选用或不选用。此外lpc1754内部也包含三个独立的振荡器,他们分别是内部主振荡器,内部rc振荡器和内部rtc振荡器。实际应用当中常用的振荡器是外部高速晶体振荡器,和外部低速晶体振荡器。
lpc1754内部pll0原理简介
pll0包含多个寄存器,其中pll0时钟源的选择可在clksrcsel寄存器中设置,pll0将输入时钟进行倍频,然后再分频为cpu及芯片外设提供实时时钟信号。pll0可产生的时钟频率最高可达100mhz,是cpu所允许的最大值。
pll0内部结构可表示为下图,pll0的输出时钟信号即为pllclk,后经过cpu时钟分频器的分频,产生系统时钟,系统时钟再进入外设时钟分频器后输出多路的外设时钟。
应用举例
easyarm-1754m3开发板配套的所有例程使用统一的系统初始化函数systeminit()将系统时钟配置为96mhz,外设时钟配置为默认值24mhz。用户可在对此函数有一定理解的条件下,根据自身实际需求,对参数进行修改,可修改项一般包含时钟源、倍频系数、分配系数三个重要参数,系统初始化函数当中的pll0配置部分如下程序清单所示:
#if (clock_setup) /* clock setup */
lpc_sc->scs = scs_val;
if (scs_val & (1 lpc_sc->pclksel0 = pclksel0_val; /* peripheral clock selection */
lpc_sc->pclksel1 = pclksel1_val;
lpc_sc->clksrcsel = clksrcsel_val; /* 选取时钟源,clksrcsel_val值可改 */
#if (pll0_setup)
lpc_sc->pll0cfg = pll0cfg_val; /*pll0倍频值,pll0cfg_val值可改 */ lpc_sc->pll0con = 0x01; /* pll0 enable */
lpc_sc->pll0feed = 0xaa;
lpc_sc->pll0feed = 0x55;
while (!(lpc_sc->pll0stat & (1 lpc_sc->pll0feed = 0xaa;
lpc_sc->pll0feed = 0x55;
#endif lpc_sc->pconp = pconp_val; /* power control for peripherals */
lpc_sc->clkoutcfg = clkoutcfg_val; /* clock output configuration */
#endif 其中关键参数为pll0倍频系数pll0cfg_val、cpu时钟分频系数cclkcfg_val,由于寄存器值比实际值小1,因此它们实际值为16和4。另外每次想pll0相关寄存器写入新的数值时,需要向馈送寄存器当中写入馈送系列以后才能生效,通常是将0xaa和0x55先后写入pllxfeed寄存器。
将相关参数准备好之后,就要根据参数配置,判断选中的时钟源,并通过计算得出最后的系统时钟频率。在选用外部12mhz时钟源的条件下,程序会跳转到case1的位置运行,并结合此前所给参数,计算出系统时钟频率cclk=12m×2×16/1/4=96mhz。
case 1: /* main oscillator => pll0 */
systemfrequency = (osc_clk *
((2 * ((lpc_sc->pll0stat & 0x7fff) + 1))) / /*pll0stat的低15位是15,倍频值*/
(((lpc_sc->pll0stat >> 16) & 0xff) + 1) / /*pll0stat的16~23位是0,分频值*/
((lpc_sc->cclkcfg & 0xff)+ 1)); /*cclkcfg是系统分频值,3 */
break; 又例如使用32.768khz的外低速晶振作为时钟源,并同样产生96mhz的系统时钟,只需将clksrcsel_val、cclkcfg_val、pll0cfg_val分别改为0x02、0x02、0x1127(4391)即可,含义分别是选择外部低速晶振,系统分频为3(寄存器值比实际值小1),pll0倍频值为4392(而pll0分频值不设,默认为0),计算:32.768×2×4392÷3=95944.704khz,
约为96mhz。
时钟配置注意事项
在整个代码编写过程中要格外注意对馈送寄存器pllxfeed的操作,要严格遵循0xaa和0x55先后写入的顺序。另外要确保执行写入馈送序列时,不会出现任何一个中断服务程序,即在执行pll0馈送操作时,必须禁止中断,如果写入的值不正确、或者没有满足无中断发生的条件,那么对pll0cfg寄存器的更改都不会生效。
在根据自身需求配置所需系统时钟频率时,往往会使用仿真器的debug功能,观测相关参数,以验证时钟频率配置的正确与否。但不能在执行pll0馈送操作时,设置任何断点,否侧同样无法使配置生效。

二手频谱仪价格不透明?原来是这样!
从技术结构看工业互联网的应用场景
MOSFET安全工作区域SOA是啥?
一文解读语音识别的运行原理
锂电池产业链发展趋势与资本市场投资分析
LPC1754内部PLL0原理及应用设计详解
一种用于光学寻址系统的可拓展超透镜阵列设计
四种人工智能诈骗新手段千万要提防
采用多内核DSP多处理器的军事集成系统设计
甲类功放的功率计算_甲类功放的寿命有多长
信步科技SV3b-72026嵌入式主板介绍
被区块链改变的五大行业
预计到2023年,ASML公司的EUV光刻机带来的收入将比2020年的收入翻一番
膜式燃气表检定规程
工业4.0时代,增强现实技术如何变革制造业
ACEINNA发布新款传感器模块MTLT305D
人事再调整、静待5G机会 魅族能否崛起?
地平线正式开源Sparse4D算法
IT团队提升机器学习的五个技能分享
大数据是如何保护传输文件安全