搜索
bottom↓
回复: 16

怎么实现MK22不用外部晶振,用内部32K时钟或4M时钟切换到IR...

[复制链接]

出0入0汤圆

发表于 2015-6-4 09:37:25 | 显示全部楼层 |阅读模式
本帖最后由 bailao99 于 2015-6-5 08:34 编辑

MK22内部有USB 48MHz时钟源,怎样配置才能实现无外部晶振情况下,使用内部USB 48MHz时钟,确保芯片正常运行?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2015-6-4 12:30:24 | 显示全部楼层
这个要看你的具体需求了,你是想复用内部IRC48M来作为系统的时钟源还是作为USB时钟源?

出0入0汤圆

 楼主| 发表于 2015-6-4 12:51:03 | 显示全部楼层
unknown 发表于 2015-6-4 12:30
这个要看你的具体需求了,你是想复用内部IRC48M来作为系统的时钟源还是作为USB时钟源? ...

复用内部IRC48M来作为系统的时钟源

出0入0汤圆

发表于 2015-6-4 16:23:33 | 显示全部楼层
8M外部晶振已跑到120M了,没外部的没有试过!

出0入0汤圆

发表于 2015-6-4 22:25:38 | 显示全部楼层
不焊的时候不是默认用内部的么

出0入0汤圆

 楼主| 发表于 2015-6-5 08:34:56 | 显示全部楼层
jinyi7016 发表于 2015-6-4 22:25
不焊的时候不是默认用内部的么

修改了帖子标题

出0入0汤圆

发表于 2015-6-5 09:31:56 | 显示全部楼层
请参考此图片

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2015-6-8 07:43:34 | 显示全部楼层
已测试不行的代码如下:
/* Configuration for HSRUN mode. Core clock = 80MHz. Clock source = 48 MHz IRC Oscillator */clock_manager_user_config_t MyClockConfigurations[] =
{   
  {
    .mcgConfig =
    {
      .mcg_mode           = kMcgModeFEE,   // Work in FEE mode.
      .irclkEnable        = true,  // MCGIRCLK enable.
      .irclkEnableInStop  = false, // MCGIRCLK disable in STOP mode.
      .ircs               = kMcgInternalRefClkSelSlow, // Select IRC32k.
      .fcrdiv             = 0U,    // FCRDIV is 0.

      .frdiv   = 7U,
      .drs     = kMcgDcoRangeSelHigh, // High frequency range
      .dmx32   = kMcgDmx32Default,    // DCO has a default range of 25%
      .oscsel  = kMcgOscselIrc        /* Selects 48 MHz IRC Oscillator */
    },
    .simConfig =
    {
      .PllFllSel = kClockPllFllSelIrc48M,     /*!< IRC48MCLK  */
      .er32kSrc  = kClockEr32kSrcLpo,     // ERCLK32K selection, use LPO.
      .outdiv1   = 0U,
      .outdiv2   = 1U,
      .outdiv4   = 3U,
    },
    .oscerConfig =
    {
      .Enable       = false,  // OSCERCLK disable.
      .EnableInStop = false, // OSCERCLK disable in STOP mode.
    }
  },
};

  (void)CLOCK_SYS_Init(MyClockConfigurations,0,NULL,0);
  (void)CLOCK_SYS_UpdateConfiguration(0,kClockManagerPolicyAgreement);

以上代码有外部晶振可实现CoreClock=80MHz,无晶振系统不运行

出0入0汤圆

发表于 2015-6-8 19:46:43 | 显示全部楼层
本帖最后由 unknown 于 2015-6-8 19:54 编辑

给你发一段配置到FEE mode, Core clock = 96MHz 的代码作参考吧


   /* Update clock divider, make sure core clock,
       bus clock, flexbus clock and flash closk
       is less than maximum support frequency
    */
     SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIV1(0x00) |
                  SIM_CLKDIV1_OUTDIV2(0x03) |
                  SIM_CLKDIV1_OUTDIV4(0x03); /* Update system prescalers */
   
     /* MCG_C2: RANGE = 3 */
     MCG_BWR_C2_RANGE(MCG, 0x03);

     MCG_BWR_DMX32(MCG, 1);
    /*
            Switch to FEE mode
    */
            
     // FRDIV=6, RANGE=3, divide IRC48M with 1280
     MCG_BWR_C1_FRDIV(MCG, 0x06);
            
     // Switch to external reference clock
     MCG_BWR_C6_PLLS(MCG, 0);
     MCG_BWR_C7_OSCSEL(MCG, 2);  // Enable IRC48M OSC
     MCG_BWR_C1_IREFS(MCG, 0);
     while(MCG_BRD_S_IREFST(MCG));
     MCG_BWR_DMX32(MCG, 0);
     MCG_BWR_DRST_DRS(MCG, 3);

出0入0汤圆

 楼主| 发表于 2015-6-9 06:45:48 | 显示全部楼层
unknown 发表于 2015-6-8 19:46
给你发一段配置到FEE mode, Core clock = 96MHz 的代码作参考吧

感谢楼上的热心指导!

出0入0汤圆

发表于 2015-6-9 12:26:32 | 显示全部楼层
bailao99 发表于 2015-6-9 06:45
感谢楼上的热心指导!

期待你能成功的用上这个内部的IRC48M

出0入0汤圆

 楼主| 发表于 2015-6-9 21:03:12 | 显示全部楼层
unknown 发表于 2015-6-9 12:26
期待你能成功的用上这个内部的IRC48M

只用IRC48M,不用外部晶振,测试通过。

以下代码基于KSDK V1.1.0,MDK V5.13
注释来源于楼上,根据注释用寄存器操作实现


  /*
  Update clock divider, make sure core clock,
  bus clock, flexbus clock and flash closk
  is less than maximum support frequency
  */
  SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIV1(0x00) |
                SIM_CLKDIV1_OUTDIV2(0x01) |
                SIM_CLKDIV1_OUTDIV4(0x03); /* Update system prescalers */

  /* MCG_C2: RANGE = 3 */
  /*Very high frequency range selected for the crystal oscillator*/
//  MCG_BWR_C2_RANGE(MCG, 0x03);
  MCG_C2 |= 0x30;
  /*DRST_DRS default value 0x00,Reference Range: 32.768 kHz,DCO Range 24MHz*/
//  MCG_BWR_DMX32(MCG, 1);
  MCG_C4 |= 0x80;
  /*
    Switch to FEE mode
  */
         
  /* FRDIV=6, RANGE=3, divide IRC48M with 1280 */
  /* if FRDIV=7, RANGE=3, divide IRC48M with 1536,Final Core Freq 80MHz*/
//  MCG_BWR_C1_FRDIV(MCG, 0x06);
//  MCG_BWR_C1_FRDIV(MCG, 0x07);
  MCG_C1 |= 0x38;
        
  /* Switch to external reference clock*/
//  MCG_BWR_C6_PLLS(MCG, 0);/*FLL is selected*/
  MCG_C6 |= 0x40;
//  MCG_BWR_C7_OSCSEL(MCG, 2);  /* Enable IRC48M OSC*/
  MCG_C7 |= 0x02;
//  MCG_BWR_C1_IREFS(MCG, 0);/*External reference clock is selected*/
  MCG_C1 &= ~0x04;
  /*IREFST=1,Source of FLL reference clock is the internal reference clock*/
//  while(MCG_BRD_S_IREFST(MCG));
  while(MCG_S&0x10);  
//  MCG_BWR_DMX32(MCG, 0);/*Reference Range: 31.25–39.0625 kHz*/
  MCG_C4 &= ~0x80;
//  MCG_BWR_DRST_DRS(MCG, 3);/*DRST_DRS=0x03,DCO Range 96MHz*/
  MCG_C4 |= 0x60;

有一个特殊之处是:将上面的代码替换system_MK22F51212.c中以下代码
原因是:MK22默认使用外部晶振,检测不到外部晶振,代码将在以下代码的第一个while死循环

  MCG->SC = SYSTEM_MCG_SC_VALUE;       /* Set SC (fast clock internal reference divider) */
  MCG->C2 = (MCG->C2 & (uint8_t)(~(MCG_C2_FCFTRIM_MASK))) | (SYSTEM_MCG_C2_VALUE & (uint8_t)(~(MCG_C2_LP_MASK))); /* Set C2 (freq. range, ext. and int. reference selection etc. excluding trim bits; low power bit is set later) */
  OSC->CR = SYSTEM_OSC_CR_VALUE;       /* Set OSC_CR (OSCERCLK enable, oscillator capacitor load) */
  MCG->C7 = SYSTEM_MCG_C7_VALUE;       /* Set C7 (OSC Clock Select) */
  #if (MCG_MODE == MCG_MODE_PEE)
  MCG->C1 = (SYSTEM_MCG_C1_VALUE) | MCG_C1_CLKS(0x02); /* Set C1 (clock source selection, FLL ext. reference divider, int. reference enable etc.) - PBE mode*/
  #else
  MCG->C1 = SYSTEM_MCG_C1_VALUE;       /* Set C1 (clock source selection, FLL ext. reference divider, int. reference enable etc.) */
  #endif
  if ((((SYSTEM_MCG_C2_VALUE) & MCG_C2_EREFS_MASK) != 0x00U) && (((SYSTEM_MCG_C7_VALUE) & MCG_C7_OSCSEL_MASK) == 0x00U)) {
    while((MCG->S & MCG_S_OSCINIT0_MASK) == 0x00U) { /* Check that the oscillator is running */
    }
  }
  /* Check that the source of the FLL reference clock is the requested one. */
  if (((SYSTEM_MCG_C1_VALUE) & MCG_C1_IREFS_MASK) != 0x00U) {
    while((MCG->S & MCG_S_IREFST_MASK) == 0x00U) {
    }
  } else {
    while((MCG->S & MCG_S_IREFST_MASK) != 0x00U) {
    }
  }
  MCG->C4 = ((SYSTEM_MCG_C4_VALUE)  & (uint8_t)(~(MCG_C4_FCTRIM_MASK | MCG_C4_SCFTRIM_MASK))) | (MCG->C4 & (MCG_C4_FCTRIM_MASK | MCG_C4_SCFTRIM_MASK)); /* Set C4 (FLL output; trim values not changed) */




出0入0汤圆

发表于 2015-6-9 21:10:28 | 显示全部楼层
bailao99 发表于 2015-6-9 21:03
只用IRC48M,不用外部晶振,测试通过。

以下代码基于KSDK V1.1.0,MDK V5.13

谢谢分享,SDK里貌似是可以通过定义 CLOCK_SETUP来选择是默认FEI模式还是切换到PEE模式

出0入0汤圆

 楼主| 发表于 2015-6-10 05:30:07 | 显示全部楼层
unknown 发表于 2015-6-9 21:10
谢谢分享,SDK里貌似是可以通过定义 CLOCK_SETUP来选择是默认FEI模式还是切换到PEE模式 ...

如果有外部晶振,可以切换到FEE,但是system_MK22F51212.h中所有CLOCK_SETUP值,都如下:
#define SYSTEM_MCG_C7_VALUE          0x00U
上述定义表明:默认外部晶振存在
因此system_MK22F51212.c也是检测外部外部晶振,指令如下:
if ((((SYSTEM_MCG_C2_VALUE) & MCG_C2_EREFS_MASK) != 0x00U) && (((SYSTEM_MCG_C7_VALUE) & MCG_C7_OSCSEL_MASK) == 0x00U))
{
   while((MCG->S & MCG_S_OSCINIT0_MASK) == 0x00U)
  { /* Check that the oscillator is running */
  }
}

以上表明只定义 CLOCK_SETUP,无法实现无晶振运行,未做验证,以后有时间再做
考虑到#define SYSTEM_MCG_C7_VALUE          0x00U,也许可认为这是KSDK的一个Bug

出0入0汤圆

发表于 2015-6-10 11:31:12 | 显示全部楼层
bailao99 发表于 2015-6-10 05:30
如果有外部晶振,可以切换到FEE,但是system_MK22F51212.h中所有CLOCK_SETUP值,都如下:
#define SYSTEM ...

哈哈,有可能,我一般不用SDK提供的这些clock 初始化,都是自己写

出0入0汤圆

 楼主| 发表于 2015-6-10 12:41:27 | 显示全部楼层
unknown 发表于 2015-6-10 11:31
哈哈,有可能,我一般不用SDK提供的这些clock 初始化,都是自己写

我一般能用SDK尽量用SDK。自己写效率高,只是要花时间调试和维护,文档编写也很耗时间。SDK厂商维护,省事。

出0入0汤圆

发表于 2015-6-30 13:52:09 | 显示全部楼层
非常感谢你关于Kinetis的技术问题。如果你没有其他问题,我们将此帖默认为已解决.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 20:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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