查看: 5358|回复: 18

[已解决] 求教关于PLL作为时钟源的问题(已解决)

[复制链接]

该用户从未签到

10

主题

63

帖子

0

注册会员

Rank: 2

积分
194
最后登录
2018-3-31
发表于 2014-10-9 11:29:04 | 显示全部楼层 |阅读模式
本帖最后由 tovax 于 2014-10-11 17:05 编辑

初始化PLL的最后阶段有如下语句:
  1. //Now in PBE

  2. //Clear CLKS to switch CLKS mux to select PLL as MCG_OUT
  3. MCG_C1 &= ~MCG_C1_CLKS_MASK;

  4. //Wait for clock status bits to update
  5. for(i = 0 ; i < 2000 ; i++)
  6. {
  7.         //Jump out early if CLKST = 3 before loop finishes
  8.         if(((MCG_S & MCG_S_CLKST_MASK) >> MCG_S_CLKST_SHIFT) == 0x3) break;
  9. }

  10. //Check CLKST is set correctly and return with error if not
  11. if(((MCG_S & MCG_S_CLKST_MASK) >> MCG_S_CLKST_SHIFT) != 0x3) return 0x1B;

  12. //Now in PEE
复制代码
仿真发现,在"if(((MCG_S & MCG_S_CLKST_MASK) >> MCG_S_CLKST_SHIFT) == 0x3) break;"处程序跑飞了。
飞到这句代码的前边几句,然后再执行到这里,再跑飞,这样死循环。。。

屏蔽掉“MCG_C1 &= ~MCG_C1_CLKS_MASK;”这句之后,程序不会跑飞,但是PLL初始化不成功了,一直从“return 0x1B”处退出。


调用的官方代码 ( KINETIS512_V2_SC ) :
  1.        /* Set the system dividers */
  2.        /* NOTE: The PLL init will not configure the system clock dividers,
  3.         * so they must be configured appropriately before calling the PLL
  4.         * init function to ensure that clocks remain in valid ranges.*/  
  5.         SIM_CLKDIV1 = ( 0
  6.                             | SIM_CLKDIV1_OUTDIV1(0)
  7.                             | SIM_CLKDIV1_OUTDIV2(1)
  8.                             | SIM_CLKDIV1_OUTDIV3(1)
  9.                             | SIM_CLKDIV1_OUTDIV4(3) );

  10.        /* Initialize PLL */
  11.        /* PLL will be the source for MCG CLKOUT so the core, system, and flash clocks are derived from it */
  12.        mcg_clk_hz = pll_init(CLK0_FREQ_HZ,  /* CLKIN0 frequency */
  13.                                   LOW_POWER,     /* Set the oscillator for low power mode */
  14.                                  CLK0_TYPE,     /* Crystal or canned oscillator clock input */
  15.                                  PLL0_PRDIV,    /* PLL predivider value */
  16.                                  PLL0_VDIV,     /* PLL multiplier */
  17.                                  MCGOUT);       /* Use the output from this PLL as the MCGOUT */

  18.        /* Check the value returned from pll_init() to make sure there wasn't an error */
  19.        if (mcg_clk_hz < 0x100) while(1);
复制代码
我的宏定义如下:
#define    CLK0_FREQ_HZ    12000000
#define    CLK0_TYPE    CRYSTAL
#define    LOW_POWER    0
#define    HIGH_GAIN    1
#define    PLL0_PRDIV    6
#define    PLL0_VDIV    25
#define    PLL_ONLY    0
#define    MCGOUT    1
#define    CANNED_OSC    0
#define    CRYSTAL    1

SOC:MK10DN512VLQ10


请问这是怎么回事呢?




我知道答案 目前已有18人回答
回复

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2014-10-9 11:34:48 | 显示全部楼层
    看一下MCG_S寄存器的值是多少。
    这里是要等待时钟配置完成。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10

    主题

    63

    帖子

    0

    注册会员

    Rank: 2

    积分
    194
    最后登录
    2018-3-31
     楼主| 发表于 2014-10-9 11:58:10 | 显示全部楼层
    安 发表于 2014-10-9 11:34
    看一下MCG_S寄存器的值是多少。
    这里是要等待时钟配置完成。

    MCG_C1 = 0X20;
    MCG_S = 0X6E;

    是不是有相关的使能位需要打开呢?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    124

    主题

    3600

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5781
    最后登录
    1970-1-1
    发表于 2014-10-9 13:36:29 | 显示全部楼层
    tovax 发表于 2014-10-9 11:58
    MCG_C1 = 0X20;
    MCG_S = 0X6E;

    你好,楼主!
    我想确认几点:
    1. 请问你对官方例程有进行过修改吗,如果有的话,改了哪些地方?
    2. 外围电路如振荡器不稳等,也是很可能导致时钟模式不能设置成功的。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10

    主题

    63

    帖子

    0

    注册会员

    Rank: 2

    积分
    194
    最后登录
    2018-3-31
     楼主| 发表于 2014-10-9 14:28:35 | 显示全部楼层
    FSL_TICS_ZP 发表于 2014-10-9 13:36
    你好,楼主!
    我想确认几点:
    1. 请问你对官方例程有进行过修改吗,如果有的话,改了哪些地方?

    我弄错了,看到板子上一个32.768K,一个12M。
    我以为是12M可以用,看了原理图发现12M是给USB芯片用的,SOC就接了32.768K。
    32.768K是一样的倍频吗,可以倍频到多少,感觉这个数字这么不整齐,能到50M吗?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2014-10-9 14:35:46 | 显示全部楼层
    32.768应该是给RTC用的。你用的是哪个板子?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10

    主题

    63

    帖子

    0

    注册会员

    Rank: 2

    积分
    194
    最后登录
    2018-3-31
     楼主| 发表于 2014-10-9 15:05:27 | 显示全部楼层
    安 发表于 2014-10-9 14:35
    32.768应该是给RTC用的。你用的是哪个板子?

    买的开发板,武汉友联电子的,知道吗?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10

    主题

    63

    帖子

    0

    注册会员

    Rank: 2

    积分
    194
    最后登录
    2018-3-31
     楼主| 发表于 2014-10-9 15:09:01 | 显示全部楼层
    有没有靠谱的头文件呢,我在CW 10.6的安装目录下找的头文件MK10D10.h,竟然还有寄存器定义和数据手册不一样的。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    124

    主题

    3600

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5781
    最后登录
    1970-1-1
    发表于 2014-10-9 15:27:37 | 显示全部楼层
    tovax 发表于 2014-10-9 15:09
    有没有靠谱的头文件呢,我在CW 10.6的安装目录下找的头文件MK10D10.h,竟然还有寄存器定义和数据手册不一样 ...

    关于头文件寻找,请参考其经验分享!
    https://www.nxpic.org.cn/module/forum/thread-580460-1-1.html
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10

    主题

    63

    帖子

    0

    注册会员

    Rank: 2

    积分
    194
    最后登录
    2018-3-31
     楼主| 发表于 2014-10-9 15:29:24 | 显示全部楼层
    安 发表于 2014-10-9 14:35
    32.768应该是给RTC用的。你用的是哪个板子?

    看到了,板子上有个50M的振荡器。
    振荡器和外部晶体的操作不太一样吧,我的最终方案是用外部晶体的。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-9-8 03:40 , Processed in 0.109921 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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