查看: 14593|回复: 13

[分享] k60时钟

[复制链接]

该用户从未签到

2

主题

9

帖子

0

新手上路

Rank: 1

积分
27
最后登录
1970-1-1
发表于 2011-9-27 13:44:40 | 显示全部楼层 |阅读模式
发的帖子不能删,麻烦。
花了几天的时间才弄清楚K60的时钟。非常零散。两张图是最重要的。然后具体的设置有层层嵌套的感觉。找了很长时间终于解决问题了。外接时钟首先考虑的是4种接法,然后是180页时钟图。其中MCGOUTCLK是系统时钟的来源。流程依次应该是OSC产生,PLL倍频,SIM_SCGC分频。
回复

使用道具 举报

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

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    373
    最后登录
    2023-8-16
    发表于 2011-9-30 11:41:43 | 显示全部楼层

    回复:k60时钟

    回复第 4 楼 于2011-09-29 03:13:23发表:
    回复第 3 楼 于2011-09-28 08:08:56发表:
    时钟配置确实不容易,我看看能不能写一个软件
     
    百思不得其解。keil自带例子的CLOCK_SETUP=1 又8MHZ输出48MHZ。仔细对照,例子中的PRDIV=3*,而下行的C5赋值是0x03,与pdf对不上。除此之外,VDIV的设置一直是0,完全没有倍频,不知48MHz怎么得出的。实在想不通。另外与pdf对不上的就是 HGO的设置与模式转换中的相悖。IRCLKEN=1出现几次都与模式转换中讲解的有差别。最重要的,OSC->CR = (uint8_t)0x00u 与第25章最后面的部分讲解有差别。
     

    M4首先要选择晶振源、再分频、然后再倍频,然后再倍频别的时钟总线。这个和M3是类似的。
    该会员没有填写今日想说内容.
    回复 支持 1 反对 0

    使用道具 举报

    该用户从未签到

    12

    主题

    136

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    256
    最后登录
    2021-1-15
    发表于 2011-9-28 09:52:19 | 显示全部楼层

    RE:k60时钟

    时钟确实比较复杂
  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    373
    最后登录
    2023-8-16
    发表于 2011-9-28 16:08:56 | 显示全部楼层

    RE:k60时钟

    时钟配置确实不容易,我看看能不能写一个软件来计算频率。
    该会员没有填写今日想说内容.

    该用户从未签到

    2

    主题

    9

    帖子

    0

    新手上路

    Rank: 1

    积分
    27
    最后登录
    1970-1-1
     楼主| 发表于 2011-9-29 11:13:23 | 显示全部楼层

    回复:k60时钟

    回复第 3 楼 于2011-09-28 08:08:56发表:
    时钟配置确实不容易,我看看能不能写一个软件
     
    之前面临的问题解决了一些,又出现了新的问题。

    该用户从未签到

    2

    主题

    9

    帖子

    0

    新手上路

    Rank: 1

    积分
    27
    最后登录
    1970-1-1
     楼主| 发表于 2011-10-4 13:57:15 | 显示全部楼层

    RE:k60时钟

    用keil调不顺。参考keil自带案例8M出48M.现在能出到72M.方法是3分频,27倍频。8/3 ×27=72 。再高就出问题了。继续调试,希望能到100M。时钟初始化比较复杂,我想如果没keil自带例程而参考pdf文档568页写初始化,估计根本用不了。

    该用户从未签到

    0

    主题

    20

    帖子

    0

    新手上路

    Rank: 1

    积分
    21
    最后登录
    1970-1-1
    发表于 2012-2-21 08:46:22 | 显示全部楼层

    回复:k60时钟

    xiexie
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    29

    帖子

    0

    新手上路

    Rank: 1

    积分
    23
    最后登录
    1970-1-1
    发表于 2012-11-20 11:29:24 | 显示全部楼层

    回复:k60时钟

    看看
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2021-8-31 12:39
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    26

    主题

    149

    帖子

    1

    高级会员

    Rank: 4

    积分
    551
    最后登录
    2024-1-15
    发表于 2013-6-21 23:38:07 | 显示全部楼层

    回复:k60时钟

     /* ----------------------------------------------------------------------------
       -- SystemCoreClockUpdate()
       ---------------------------------------------------------------------------- */
     
    void SystemCoreClockUpdate (void) 
    {
      uint32_t MCGOUTClock;                                                        /* Variable to store output clock frequency of the MCG module */
      uint8_t Divider;
     
      if ((MCG->C1 & MCG_C1_CLKS_MASK) == 0x0u) 
             {
              /* Output of FLL or PLL is selected */
              if ((MCG->C6 & MCG_C6_PLLS_MASK) == 0x0u) 
                    {
                      /* FLL is selected */
                      if ((MCG->C1 & MCG_C1_IREFS_MASK) == 0x0u) 
                            {
                                    /* External reference clock is selected */
                                    if ((SIM->SOPT2 & SIM_SOPT2_MCGCLKSEL_MASK) == 0x0u) 
                                          {
                                              MCGOUTClock = CPU_XTAL_CLK_HZ;                                       /* System oscillator drives MCG clock */
                                          } 
                                    else 
                                          { /* (!((SIM->SOPT2 & SIM_SOPT2_MCGCLKSEL_MASK) == 0x0u)) */
                                              MCGOUTClock = CPU_XTAL32k_CLK_HZ;                                    /* RTC 32 kHz oscillator drives MCG clock */
                                          } /* (!((SIM->SOPT2 & SIM_SOPT2_MCGCLKSEL_MASK) == 0x0u)) */
                                    Divider = (uint8_t)(1u C1 & MCG_C1_FRDIV_MASK) >> MCG_C1_FRDIV_SHIFT));
                                    MCGOUTClock = (MCGOUTClock / Divider);  /* Calculate the divided FLL reference clock */
                                    if ((MCG->C2 & MCG_C2_RANGE_MASK) != 0x0u) 
                                          {
                                              MCGOUTClock /= 32u;                                                  /* If high range is enabled, additional 32 divider is active */
                                          } /* ((MCG->C2 & MCG_C2_RANGE_MASK) != 0x0u) */
                            }
                      else 
                            { /* (!((MCG->C1 & MCG_C1_IREFS_MASK) == 0x0u)) */
                                  MCGOUTClock = CPU_INT_SLOW_CLK_HZ;                                     /* The slow internal reference clock is selected */
                            } /* (!((MCG->C1 & MCG_C1_IREFS_MASK) == 0x0u)) */
                      /* Select correct multiplier to calculate the MCG output clock  */
                      switch (MCG->C4 & (MCG_C4_DMX32_MASK | MCG_C4_DRST_DRS_MASK)) 
                            {
                              case 0x0u:
                                MCGOUTClock *= 640u;
                                break;
                              case 0x20u:
                                MCGOUTClock *= 1280u;
                                break;
                              case 0x40u:
                                MCGOUTClock *= 1920u;
                                break;
                              case 0x60u:
                                MCGOUTClock *= 2560u;
                                break;
                              case 0x80u:
                                MCGOUTClock *= 732u;
                                break;
                              case 0xA0u:
                                MCGOUTClock *= 1464u;
                                break;
                              case 0xC0u:
                                MCGOUTClock *= 2197u;
                                break;
                              case 0xE0u:
                                MCGOUTClock *= 2929u;
                                break;
                              default:
                                break;
                            }
                    } 
                else 
                      { /* (!((MCG->C6 & MCG_C6_PLLS_MASK) == 0x0u)) */
                            /* PLL is selected */
                            Divider = (1u + (MCG->C5 & MCG_C5_PRDIV_MASK));
                            MCGOUTClock = (uint32_t)(CPU_XTAL_CLK_HZ / Divider);    /* Calculate the PLL reference clock */
                            Divider = ((MCG->C6 & MCG_C6_VDIV_MASK) + 24u);
                            MCGOUTClock *= Divider;                       /* Calculate the MCG output clock */
                      } /* (!((MCG->C6 & MCG_C6_PLLS_MASK) == 0x0u)) */
          } 
      else if ((MCG->C1 & MCG_C1_CLKS_MASK) == 0x40u) 
            {
              /* Internal reference clock is selected */
              if ((MCG->C2 & MCG_C2_IRCS_MASK) == 0x0u) {
                MCGOUTClock = CPU_INT_SLOW_CLK_HZ;                                       /* Slow internal reference clock selected */
              } else { /* (!((MCG->C2 & MCG_C2_IRCS_MASK) == 0x0u)) */
                MCGOUTClock = CPU_INT_FAST_CLK_HZ;                                       /* Fast internal reference clock selected */
              } /* (!((MCG->C2 & MCG_C2_IRCS_MASK) == 0x0u)) */
            } 
      else if ((MCG->C1 & MCG_C1_CLKS_MASK) == 0x80u) 
            {
              /* External reference clock is selected */
              if ((SIM->SOPT2 & SIM_SOPT2_MCGCLKSEL_MASK) == 0x0u) {
                MCGOUTClock = CPU_XTAL_CLK_HZ;                                           /* System oscillator drives MCG clock */
              } else { /* (!((SIM->SOPT2 & SIM_SOPT2_MCGCLKSEL_MASK) == 0x0u)) */
                MCGOUTClock = CPU_XTAL32k_CLK_HZ;                                        /* RTC 32 kHz oscillator drives MCG clock */
              } /* (!((SIM->SOPT2 & SIM_SOPT2_MCGCLKSEL_MASK) == 0x0u)) */
            } 
      else 
            { /* (!((MCG->C1 & MCG_C1_CLKS_MASK) == 0x80u)) */
                    /* Reserved value */
                    return;
            } /* (!((MCG->C1 & MCG_C1_CLKS_MASK) == 0x80u)) */
      SystemCoreClock = (MCGOUTClock / (1u + ((SIM->CLKDIV1 & SIM_CLKDIV1_OUTDIV1_MASK) >> SIM_CLKDIV1_OUTDIV1_SHIFT)));
    }
     
     
    上面是keil的例程,这个时钟神怎样设置的啊?完全看不懂,他好像没有修改任何寄存器?!求一个高手解答!!!!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    92

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    285
    最后登录
    2022-4-14
    发表于 2013-11-15 23:07:30 | 显示全部楼层

    回复:k60时钟

    谢谢分享
    谢谢分享谢谢分享
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-5-8 09:27 , Processed in 0.139642 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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