NXP Semiconductors LPC546 32 位微控制器 (MCU) 具有丰富的外设集、极低的功耗和增强的调试功能。
LPC546 MCU 系列采用 ARM® Cortex®-M4 内核,可提供以太网支持,并设有一个 TFT LCD 控制器和两个 CAN FD 模块。 LPC546 MCU 旨在提高灵活性和性能可扩展性,可提供高达 180MHz 的性能,同时保持低至 120uA/MHz 的功率效率。 LPC546 MCU 具有多达 21 个通信接口,可满足下一代物联网应用的人机界面和连接需求。
官方提供的示例一般开头如下所示:
- BOARD_InitPins();
- BOARD_BootClockFROHF48M();
- BOARD_InitDebugConsole();
意思 : 代码初始化 》》》 设置系统时钟工作频率48MHz 》》》 串口调试打印初始化
这是48MHz是怎么来的呢?,留个疑问
请往下看。。。。
用MCUXpresso Config Tools v4.0工具打开一个官方示例,进入时钟设置会如下所示:这可能就是默认设置
下面详细分析:Main clock select A主要有四个时钟来源,分别是fro_12m、clk_in、wdt_clk、fro_hf
其中
1)fro_12m 与 fro_hf 内部FRO时钟振荡器,不同的是fro_12m时钟频率为12Mhz,而fro_hf时钟频率作为高频输出,频率出厂设置为48MHz 与96Mhz两种高频输出。
下面来看看FRO控制寄存器的描述,用户手册截图如下:
大致意思是:该寄存器用于为高频时钟选择芯片上的振荡器,以及自动USB速率调整模式的配置。
这个修剪值是96 MHz振荡器的工厂预置,并由启动代码编写。
因此如选择fro_12m 与 fro_hf作为时钟频率,可以直接调用官方提供的函数
- void BOARD_BootClockFROHF48M(void);
- void BOARD_BootClockFROHF96M(void);
其选择如下:
2)clk_in是外部晶振时钟频率
3)wdt_clk是看门狗时钟,同样来看看看门狗时钟设置的寄存器描述
大致意思是:这个寄存器控制了监视器振荡器的频率,在6 KHz到1.5 MHz之间。这个振荡器连接到监视器定时器和微型计时器。该振荡器的低功耗特性限制了其在温度、电压和硅处理变化上的精度在±40%。
因此只要设置MAINCLKSELA寄存器的[1:0]就可以选择不同的时钟频率
00 -------- fro_12m
01 -------- clk_in
10 -------- wdt_clk
11 -------- fro_hf
通过如上的分析,相信大家对时钟选择有个基本了解。
但是设置系统频率还需要了解Main clock select B的频率选择,主要对应Main clock select A、pll_clk、32k_clk,如下所示:
1)Main clock select A通道的选择前面已经详细介绍了,这里就不详细介绍了
2)32k-clk是RTC振荡器输出的频率,32kHZ,寄存器设置截图如下所示;
设置比较简单,只需要设置RTCOSCCTRL寄存器0位为1就可以使能RTC时钟频率
3)pll-clk是由System PLL得频率而来,
PLL 时钟选择是由SYSPLLCLKSEL得[2:0]最低三位设置的,分别是fro_12m、clk_in、32k_clk与none(无时钟)
SYSTEM PLL的设置中包括倍频分频器,合理的设置倍频分频器数值可以达到设置系统合适的频率
这就是SYSTEM PLL系统内部,下面设置的数值是我设置的LPC54608工作的最高频率180MHz
到这里,系统时钟的选择与设置基本了解了,下面我们操作设置系统工作频率为180MHZ(最大频率,超频不考虑)
一)先看一张设置系统函数void BOARD_BootClockFROHF48M(void)时钟设置的由来,如下所示:
二)工作频率为180MHZ的设置
1)PLL 时钟选择fro_12m为输入时钟频率,你也可以选择外部时钟clk_in
2)Main clock select B的频率选择pll_clk,目的是激活
3)倍频后频率不得低于275MHz,不得高于550MHz,刚开始是想直接倍频设置为180MHz,后面就直通
参数设置如下所示
4)生成代码可以看到在右侧,时钟源代码中可以看到出现如下函数:
- void BOARD_BootClockPLL180M(void)
5)代码分析
-
- //使能FRO的电源是打开的
- POWER_DisablePD(kPDRUNCFG_PD_FRO_EN);
- //首先切换到12MHz,以确保我们能够在不意外的情况下改变电压以达到当前的速度
- CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);
-
- //使能系统振荡器的电源
- POWER_DisablePD(kPDRUNCFG_PD_SYS_OSC);
- //设置系统频率范围
- SYSCON->SYSOSCCTRL = ((SYSCON->SYSOSCCTRL & ~SYSCON_SYSOSCCTRL_FREQRANGE_MASK) |SYSCON_SYSOSCCTRL_FREQRANGE(0U));
- //设置高频输出的电压
- POWER_SetVoltageForFreq(12000000U);
- //将FLASH等待状态设置为核心
- CLOCK_SetFLASHAccessCyclesForFreq(12000000U);
-
- //设置PLL-clk,主要是设置倍频分频等
- const pll_setup_t pllSetup = {
- .pllctrl = SYSCON_SYSPLLCTRL_SELI(32U) | SYSCON_SYSPLLCTRL_SELP(16U) | SYSCON_SYSPLLCTRL_SELR(0U),
- .pllmdec = (SYSCON_SYSPLLMDEC_MDEC(8191U)),
- .pllndec = (SYSCON_SYSPLLNDEC_NDEC(770U)),
- .pllpdec = (SYSCON_SYSPLLPDEC_PDEC(98U)),
- .pllRate = 180000000U,
- .flags = PLL_SETUPFLAG_WAITLOCK | PLL_SETUPFLAG_POWERUP
- };
- //设置pll时钟输入作为系统源
- CLOCK_AttachClk(kFRO12M_to_SYS_PLL);
- CLOCK_SetPLLFreq(&pllSetup);
-
- //重置并且设置AHB总线分频为1
- CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);
-
- //转换main_clk的频率
- CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);
- SystemCoreClock = BOARD_BOOTCLOCKPLL180M_CORE_CLOCK;
到此为止,PLC54608时钟的通道的选择与分析,设置都说明了,并且应用MCUXpresso Config Tools v4.0工具设置了系统工作频率
其他外设的时钟分析都如上所示,希望以上分析对你有帮助,有什么不明白的可以留言,谢谢!
此内容由EEWORLD论坛网友冒险武者原创,如需转载或用于商业用途需征得作者同意并注明出处
本帖最后由 冒险武者 于 2018-1-28 11:37 编辑