怎么实现MK22不用外部晶振,用内部32K时钟或4M时钟切换到IR...
本帖最后由 bailao99 于 2015-6-5 08:34 编辑MK22内部有USB 48MHz时钟源,怎样配置才能实现无外部晶振情况下,使用内部USB 48MHz时钟,确保芯片正常运行? 这个要看你的具体需求了,你是想复用内部IRC48M来作为系统的时钟源还是作为USB时钟源? unknown 发表于 2015-6-4 12:30
这个要看你的具体需求了,你是想复用内部IRC48M来作为系统的时钟源还是作为USB时钟源? ...
复用内部IRC48M来作为系统的时钟源 8M外部晶振已跑到120M了,没外部的没有试过! 不焊的时候不是默认用内部的么 jinyi7016 发表于 2015-6-4 22:25
不焊的时候不是默认用内部的么
修改了帖子标题 请参考此图片
已测试不行的代码如下:
/* 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: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);
unknown 发表于 2015-6-8 19:46
给你发一段配置到FEE mode, Core clock = 96MHz 的代码作参考吧
感谢楼上的热心指导! bailao99 发表于 2015-6-9 06:45
感谢楼上的热心指导!
期待你能成功的用上这个内部的IRC48M 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) */
bailao99 发表于 2015-6-9 21:03
只用IRC48M,不用外部晶振,测试通过。
以下代码基于KSDK V1.1.0,MDK V5.13
谢谢分享,SDK里貌似是可以通过定义 CLOCK_SETUP来选择是默认FEI模式还是切换到PEE模式 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
bailao99 发表于 2015-6-10 05:30
如果有外部晶振,可以切换到FEE,但是system_MK22F51212.h中所有CLOCK_SETUP值,都如下:
#define SYSTEM ...
哈哈,有可能,我一般不用SDK提供的这些clock 初始化,都是自己写 unknown 发表于 2015-6-10 11:31
哈哈,有可能,我一般不用SDK提供的这些clock 初始化,都是自己写
我一般能用SDK尽量用SDK。自己写效率高,只是要花时间调试和维护,文档编写也很耗时间。SDK厂商维护,省事。 非常感谢你关于Kinetis的技术问题。如果你没有其他问题,我们将此帖默认为已解决.
页:
[1]