查看: 3999|回复: 2

[分享] 【LPC11U68】系统时钟学习

[复制链接]
  • TA的每日心情
    开心
    2020-1-31 22:07
  • 签到天数: 29 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    20

    主题

    385

    帖子

    19

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2125
    最后登录
    2020-7-1
    发表于 2018-12-3 01:31:46 | 显示全部楼层 |阅读模式

    LPC11U68的系统时钟整体来说还是比较简单了,通过时钟树,就可以清晰明白的了解到LPC11U68的时钟结构。

    时钟.png


    其中,有两个时钟参数是比较重要的,这里就主要分析这两个时钟:main clock和system clock.

    main clock: 由图可知,主时钟可以有多种来源,包括内部内部振荡器IRC,看门狗振荡器,PLL等。锁相环可以输出一个稳定且频率较高的时钟。我们需要一个频率高于12MHz主时钟,所以使用PLL锁相环来产生main clock。

    system clock:系统时钟由主时钟分频而来,这个系统时钟主要是给CPU,AHB上面的各种外设提供时钟来源,系统时钟可以等于等于主时钟,但是系统时钟不能超过50MHz(主时钟不能超过100MHz,user manual描述如此)。

    时钟选择具体操作如下:

    首先我们知道,在IAR工程里面,相关的时钟初始化操作是在mian函数之前完成的。参考启动代码可知,在单片机启动过程中,会调用SystemInit()这个函数,这个函数里面就是时钟配置的相关代码。我们找到这个函数,将其修改为调用E3V_sysclock_init()函数,然后我们就可以开始编写自己的时钟初始化函数了。用为PLL的输入来源可以使单片机内部的12MHz IRC,也可以是来自外部的12MHz晶振,所以我们通过E3V_PLL_USE_IRC和E3V_PLL_USE_XTAL_12M这两个宏进行条件编译,用户可以自行选择采用哪个源来作为PLL的输入。

    xxx_pll_init()函数设置主时钟(main clock)的大小,之后再设置system clock的分频系数,得到系统时钟。

    1. /****************************************************************
    2. * 功能:初始化PLL得到main_clock,并将其分频得到system_clock
    3. * 参数:无
    4. * 修改:2018-11-28
    5. *****************************************************************/
    6. void E3V_sysclock_init(void)
    7. {
    8. #if   defined(E3V_PLL_USE_IRC)
    9.     E3V_irc_pll_init(E3V_MAIN_CLOCK_MHZ);
    10.       
    11. #elif   defined(E3V_PLL_USE_XTAL_12M)
    12.     E3V_xtal_pll_init(E3V_MAIN_CLOCK_MHZ);

    13. #else  
    14.     E3V_irc_pll_init(E3V_MAIN_CLOCK_MHZ);
    15.    
    16. #endif   
    17.     E3V_set_systemclock(E3V_SYSClK_DIV);
    18. }

    19. /****************************************************************
    20. * 功能:启动代码会调用这个函数,进行时钟初始化
    21. * 参数:无
    22. * 修改:2018-11-28
    23. *****************************************************************/
    24. void SystemInit(void)
    25. {
    26.    
    27.     E3V_sysclock_init();
    28.    
    29. }
    复制代码

    PLL倍频设置里面,有几个重要的参数,分别是:M, P, FCLKOUT, FCLKIN, FCCO。相关的寄存器主要是SYSPLLCTRL(里面的msel和psel)

    他们的关系可以用以下的等式来表示:

        /* M = msel + 1
         * P = 2^psel = 1,2,4,8 (pesl = 0,1,2,3)
         * FCLKOUT = FCLKIN * M = 12MHz * M
         * FCCO = FCLKOUT * 2 * P (FCCO range in 156 to 320 MHz)        
         */

    在在这里,里面有些参数已经是确定值了,而有些是有选择范围的:

    FCLKIN = 12 已确定;

    1<M<32,M为正整数;

    P = 1,2,4,8, 取值四选一;

    156<FCCO<320。

    通过这写约束条件,就可以得出FCLKOUT的几种输出的组合方式,在这里main clock = FCLKOUT, 所以可以通过用户设定的参数,设定main clock的大小,利用swich case语句进行不同的参数配置:

    1.     switch (mainclock)
    2.     {
    3.     case MAIN_CLOCK_24M:
    4.         Chip_Clock_SetupSystemPLL(1, 2);    //M = 2, P = 4
    5.         break;
    6.     case MAIN_CLOCK_36M:
    7.         Chip_Clock_SetupSystemPLL(2, 2);    //M = 3, P = 4
    8.         break;
    9.     case MAIN_CLOCK_48M:
    10.         Chip_Clock_SetupSystemPLL(3, 1);    //M = 4, P = 2
    11.         break;
    12.     case MAIN_CLOCK_60M:
    13.         Chip_Clock_SetupSystemPLL(4, 2);    //M = 5, P = 4
    14.         break;
    15.     case MAIN_CLOCK_72M:
    16.         Chip_Clock_SetupSystemPLL(5, 1);    //M = 6, P = 2
    17.         break;
    18.     case MAIN_CLOCK_84M:
    19.         Chip_Clock_SetupSystemPLL(6, 0);    //M = 7, P = 1
    20.         break;        
    21.     default:
    22.         break;
    23.     }
    复制代码

    main clock设置完成,对其分频即可得到system clock:

    1. void E3V_set_systemclock(uint8_t Div)
    2. {
    3.         /* 系数为1~255, system_clock = main_clock/Div */
    4.         Chip_Clock_SetSysClockDiv(Div);

    5.         /* 选择PLL作为main clock源 */
    6.         Chip_Clock_SetMainClockSource(SYSCTL_MAINCLKSRC_PLLOUT);
    7. }
    复制代码

    如此,LPC11U68的时钟初始化就完成了,然后我们通过相关的宏,即可完成不同的时钟配置选择:

    1. /****************************************************************
    2. * 定义: E3V_PLL_USE_IRC
    3. * 功能: 锁相环PLL的时钟源选择,共两个选项:内部振荡器IRC,外部12M晶振
    4. * 选项: E3V_PLL_USE_IRC, E3V_PLL_USE_XTAL_12M

    5. * 定义: E3V_MAIN_CLOCK_MHZ
    6. * 功能: 设置main_clock的大小,单位MHz
    7. * 选项: MAIN_CLOCK_72M,36M,48M,60M,72M,84M

    8. * 定义: E3V_SYSClK_DIV
    9. * 功能: 设置分频系数,main_clock分频得到system_clock
    10. * 选项: 1~255
    11. * 补充: 需要注意的是的 system_clock不能超过50MHz
    12. *   即: E3V_MAIN_CLOCK_MHZ/E3V_SYSClK_DIV <50
    13. *****************************************************************/
    14. #define E3V_PLL_USE_IRC

    15. #define E3V_MAIN_CLOCK_MHZ  MAIN_CLOCK_72M

    16. #define E3V_SYSClK_DIV      2
    复制代码

    简单测试一下,主时钟配置为72M, 然后两分频得到36M的系统时钟,通过串口打印出来:

    时钟test.png


    1.PLL实验.zip (313.57 KB, 下载次数: 5)

    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 10:39
  • 签到天数: 1873 天

    连续签到: 4 天

    [LV.Master]伴坛终老

    203

    主题

    3万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    112711
    最后登录
    2025-8-30
    发表于 2018-12-3 08:17:07 | 显示全部楼层
    不错,支持一下。不过文档说明上是说最高支持50MHz,是否会因为主频过高导致一些控制紊乱?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3930

    主题

    7550

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    40090
    最后登录
    2025-8-29
    发表于 2018-12-3 09:29:49 | 显示全部楼层
    长知识了
    qiandao qiandao
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-31 06:48 , Processed in 0.091363 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表