bailao99 发表于 2015-6-4 09:37:25

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

本帖最后由 bailao99 于 2015-6-5 08:34 编辑

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

unknown 发表于 2015-6-4 12:30:24

这个要看你的具体需求了,你是想复用内部IRC48M来作为系统的时钟源还是作为USB时钟源?

bailao99 发表于 2015-6-4 12:51:03

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

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

orson 发表于 2015-6-4 16:23:33

8M外部晶振已跑到120M了,没外部的没有试过!

jinyi7016 发表于 2015-6-4 22:25:38

不焊的时候不是默认用内部的么

bailao99 发表于 2015-6-5 08:34:56

jinyi7016 发表于 2015-6-4 22:25
不焊的时候不是默认用内部的么

修改了帖子标题

FSL_TICS_ZP 发表于 2015-6-5 09:31:56

请参考此图片

bailao99 发表于 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,无晶振系统不运行

unknown 发表于 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);

bailao99 发表于 2015-6-9 06:45:48

unknown 发表于 2015-6-8 19:46
给你发一段配置到FEE mode, Core clock = 96MHz 的代码作参考吧




感谢楼上的热心指导!

unknown 发表于 2015-6-9 12:26:32

bailao99 发表于 2015-6-9 06:45
感谢楼上的热心指导!

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

bailao99 发表于 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) */




unknown 发表于 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模式

bailao99 发表于 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

unknown 发表于 2015-6-10 11:31:12

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

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

bailao99 发表于 2015-6-10 12:41:27

unknown 发表于 2015-6-10 11:31
哈哈,有可能,我一般不用SDK提供的这些clock 初始化,都是自己写

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

FSL_TICS_ZP 发表于 2015-6-30 13:52:09

非常感谢你关于Kinetis的技术问题。如果你没有其他问题,我们将此帖默认为已解决.
页: [1]
查看完整版本: 怎么实现MK22不用外部晶振,用内部32K时钟或4M时钟切换到IR...