[原创] LPC54608开发板时钟设置的解析

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

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复