查看: 5237|回复: 4

[分享] tower k60n512 kit时钟配置

[复制链接]

该用户从未签到

4

主题

14

帖子

0

新手上路

Rank: 1

积分
59
最后登录
1970-1-1
发表于 2011-8-1 17:29:32 | 显示全部楼层 |阅读模式
开发板自带的system_k60n512vmd100.c的时钟初始化使用的是内部时钟,频率是47.9Mhz.
程序的时钟可选项和实际板子上使用的50Mhz外部震荡起完全不一样,在MDK里面设置时钟频率也没有用,因为程序里面是设定死的,没有按设定时钟来计算,并且可选的选项都是使用的晶体,而不是外部振荡器。
#elif (CLOCK_SETUP == 1)
  #define CPU_XTAL_CLK_HZ                 50000000u /* Value of the external crystal or oscillator clock frequency in Hz */
  #define CPU_XTAL32k_CLK_HZ              32768u   /* Value of the external 32k crystal or oscillator clock frequency in Hz */
  #define CPU_INT_SLOW_CLK_HZ             32768u   /* Value of the slow internal oscillator clock frequency in Hz  */
  #define CPU_INT_FAST_CLK_HZ             4000000u /* Value of the fast internal oscillator clock frequency in Hz  */
  #define DEFAULT_SYSTEM_CLOCK            1000000000u /* Default System clock value */
于是我在这个文件上修改定义如上。
然后初始化部分,改成如下:
#elif (CLOCK_SETUP == 1)
  /* Switch to FBE Mode */
  /* OSC->CR: ERCLKEN=1,??=0,EREFSTEN=0,??=0,SC2P=0,SC4P=0,SC8P=0,SC16P=0 */
  OSC->CR = (uint8_t)0x80u;
  /* SIM->SOPT2: MCGCLKSEL=0 */
  SIM->SOPT2 &= (uint8_t)~(uint8_t)0x01u;
  /* MCG->C2: ??=0,??=0,RANGE=2,HGO=0,EREFS=0,LP=0,IRCS=0 */
  MCG->C2 = (uint8_t)0x20u;
  /* MCG->C1: CLKS=2,FRDIV=5,IREFS=0,IRCLKEN=1,IREFSTEN=0 */
  MCG->C1 = (uint8_t)0xAAu;      //50/1024=48k FLL
  /* MCG->C4: DMX32=0,DRST_DRS=0 */
  MCG->C4 &= (uint8_t)~(uint8_t)0xE0u;   //48*640=31.25M
  /* MCG->C5: ??=0,PLLCLKEN=0,PLLSTEN=0,PRDIV=19 */
  MCG->C5 = (uint8_t)0x13u;  //50/20=2.5M
  /* MCG->C5: PLLCLKEN=1 */
  MCG->C5 |= (uint8_t)0x40u;            /* Enable the PLL */
  /* MCG->C6: LOLIE=0,PLLS=0,CME=0,VDIV=16 */
  MCG->C6 = (uint8_t)0x10u;     //2.5X40=100
//  while((MCG->S & MCG_S_OSCINIT_MASK) == 0u) { /* Check that the oscillator is running */
//  }
  while((MCG->S & MCG_S_IREFST_MASK) != 0u) { /* Check that the source of the FLL reference clock is the external reference clock. */
  }
  while((MCG->S & 0x0Cu) != 0x08u) {    /* Wait until external reference clock is selected as MCG output */
  }
  /* Switch to PBE Mode */
  /* MCG->C1: CLKS=2,FRDIV=0,IREFS=0,IRCLKEN=1,IREFSTEN=0 */
  MCG->C1 = (uint8_t)0x82u;
//  MCG->C1 = (uint8_t)0xAAu;
  /* MCG->C6: LOLIE=0,PLLS=1,CME=0,VDIV=16 */
//  MCG->C6 = (uint8_t)0x40u;
  MCG->C6 = (uint8_t)0x50u;    //2.5X40=100M
  /* Switch to PEE Mode */
  /* MCG->C1: CLKS=0,FRDIV=0,IREFS=0,IRCLKEN=1,IREFSTEN=0 */
  MCG->C1 = (uint8_t)0x02u;
//  MCG->C1 = (uint8_t)0x2Au;      //50/1024=48K
  /* MCG->C5: ??=0,PLLCLKEN=0,PLLSTEN=0,PRDIV=19 */
  MCG->C5 = (uint8_t)0x13u;      //50/20=2.5M
  /* MCG->C6: LOLIE=0,PLLS=1,CME=0,VDIV=16 */
 MCG->C6 = (uint8_t)0x50u;     //2.5X40=100M
  while((MCG->S & 0x0Cu) != 0x0Cu) {    /* Wait until output of the PLL is selected */
  }
  while((MCG->S & MCG_S_LOCK_MASK) == 0u) { /* Wait until locked */
  }
  /* SIM->CLKDIV1: OUTDIV1=0,OUTDIV2=0,OUTDIV3=1,OUTDIV4=1,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0 */
//  SIM->CLKDIV1 = (uint32_t)0x00110000u; /* Update system prescalers */
  SIM->CLKDIV1 = (uint32_t)0x01140000u; /* Update system prescalers */  
  //system/core clock=100Mhz bus clock=50Mhz flex clock=50Mhz flash clock=20Mhz
 
现在的情况是,在调试模式下可以运行,看到systemcoreclock也是100Mhz,但是,下载后不能独立运行。程序是下载到flash里面调试的。
奇怪的是,按道理flash clock应该设定为25Mhz,但是,只能设定到20Mhz,否者就死机。
回复

使用道具 举报

该用户从未签到

4

主题

14

帖子

0

新手上路

Rank: 1

积分
59
最后登录
1970-1-1
 楼主| 发表于 2011-8-1 17:35:16 | 显示全部楼层

RE:tower k60n512 kit时钟配置

在FBE模式,FLL参考分频不能设定到要求的31-39k,因为50Mhz除以可选的最大可选系数1024,也是48K左右,不知道有没有关系。这个系统设计也很奇怪,要进入到PEE模式必须要通过FBE-&gtBE-&gtEE,这个设计有点让人奇怪,并且很麻烦,

该用户从未签到

2

主题

224

帖子

0

版主

Rank: 7Rank: 7Rank: 7

积分
322
最后登录
1970-1-1
发表于 2011-8-2 11:41:58 | 显示全部楼层

RE:tower k60n512 kit时钟配置

你的问题在于:
1.clock divider应该在FBE模式下,或者进入PBE模式前设置,最好修改设置的语句能copy到ram中直行。
2.FBE模式下,FRDIV不必满足31.25k-39.0625k,只有下一个模式是FLL时才有此要求。
3.这样的设计确实麻烦,但是不奇怪。

该用户从未签到

4

主题

14

帖子

0

新手上路

Rank: 1

积分
59
最后登录
1970-1-1
 楼主| 发表于 2011-8-2 16:21:17 | 显示全部楼层

回复:tower k60n512 kit时钟配置

回复第 3 楼 于2011-08-02 03:41:58发表:
你的问题在于:
1.clock divider应该在FBE模式下,或者进入PBE模式前设置,最好修改设置的语句能copy到ram中直行。
2.FBE模式下,FRDIV不必满足31.25k-39.0625k,只有下一个模式是FLL时才有此要求。
3.这样的设计确实麻烦,但是不奇怪。 

1。是在进入PBE前设置的。
/* MCG->C5: ??=0,PLLCLKEN=0,PLLSTEN=0,PRDIV=19 */
  MCG->C5 = (uint8_t)0x13u;  //50/20=2.5M
  /* MCG->C5: PLLCLKEN=1 */
  MCG->C5 |= (uint8_t)0x40u;            /* Enable the PLL */
  /* MCG->C6: LOLIE=0,PLLS=0,CME=0,VDIV=16 */
  MCG->C6 = (uint8_t)0x10u;     //2.5X40=100
//  while((MCG->S & MCG_S_OSCINIT_MASK) == 0u) { /* Check that the oscillator is running */
//  }
  while((MCG->S & MCG_S_IREFST_MASK) != 0u) { /* Check that the source of the FLL reference clock is the external reference clock. */
  }
  while((MCG->S & 0x0Cu) != 0x08u) {    /* Wait until external reference clock is selected as MCG output */
  }
  /* Switch to PBE Mode */
  /* MCG->C1: CLKS=2,FRDIV=0,IREFS=0,IRCLKEN=1,IREFSTEN=0 */
  MCG->C1 = (uint8_t)0x82u;
//  MCG->C1 = (uint8_t)0xAAu;
  /* MCG->C6: LOLIE=0,PLLS=1,CME=0,VDIV=16 */
//  MCG->C6 = (uint8_t)0x40u;
  MCG->C6 = (uint8_t)0x50u;    //2.5X40=100M
  /* Switch to PEE Mode */
  /* MCG->C1: CLKS=0,FRDIV=0,IREFS=0,IRCLKEN=1,IREFSTEN=0 */
  MCG->C1 = (uint8_t)0x02u;
//  MCG->C1 = (uint8_t)0x2Au;      //50/1024=48K
  /* MCG->C5: ??=0,PLLCLKEN=0,PLLSTEN=0,PRDIV=19 */
  MCG->C5 = (uint8_t)0x13u;      //50/20=2.5M
  /* MCG->C6: LOLIE=0,PLLS=1,CME=0,VDIV=16 */
 MCG->C6 = (uint8_t)0x50u;     //2.5X40=100M
并且是在切换到FBE前设置了一次,切换到PBE前设置了一次。不知道为啥要这样,我是在原来的程序上修改的,只是修改了参数,把原来使用osc的改为使用外部振荡器。修改了分频比。
目前是调试模式下正常,脱机运行就不行。

该用户从未签到

4

主题

14

帖子

0

新手上路

Rank: 1

积分
59
最后登录
1970-1-1
 楼主| 发表于 2011-8-2 16:21:17 | 显示全部楼层

回复:tower k60n512 kit时钟配置

回复第 3 楼 于2011-08-02 03:41:58发表:
你的问题在于:
1.clock divider应该在FBE模式下,或者进入PBE模式前设置,最好修改设置的语句能copy到ram中直行。
2.FBE模式下,FRDIV不必满足31.25k-39.0625k,只有下一个模式是FLL时才有此要求。
3.这样的设计确实麻烦,但是不奇怪。 

1。是在进入PBE前设置的。
/* MCG->C5: ??=0,PLLCLKEN=0,PLLSTEN=0,PRDIV=19 */
  MCG->C5 = (uint8_t)0x13u;  //50/20=2.5M
  /* MCG->C5: PLLCLKEN=1 */
  MCG->C5 |= (uint8_t)0x40u;            /* Enable the PLL */
  /* MCG->C6: LOLIE=0,PLLS=0,CME=0,VDIV=16 */
  MCG->C6 = (uint8_t)0x10u;     //2.5X40=100
//  while((MCG->S & MCG_S_OSCINIT_MASK) == 0u) { /* Check that the oscillator is running */
//  }
  while((MCG->S & MCG_S_IREFST_MASK) != 0u) { /* Check that the source of the FLL reference clock is the external reference clock. */
  }
  while((MCG->S & 0x0Cu) != 0x08u) {    /* Wait until external reference clock is selected as MCG output */
  }
  /* Switch to PBE Mode */
  /* MCG->C1: CLKS=2,FRDIV=0,IREFS=0,IRCLKEN=1,IREFSTEN=0 */
  MCG->C1 = (uint8_t)0x82u;
//  MCG->C1 = (uint8_t)0xAAu;
  /* MCG->C6: LOLIE=0,PLLS=1,CME=0,VDIV=16 */
//  MCG->C6 = (uint8_t)0x40u;
  MCG->C6 = (uint8_t)0x50u;    //2.5X40=100M
  /* Switch to PEE Mode */
  /* MCG->C1: CLKS=0,FRDIV=0,IREFS=0,IRCLKEN=1,IREFSTEN=0 */
  MCG->C1 = (uint8_t)0x02u;
//  MCG->C1 = (uint8_t)0x2Au;      //50/1024=48K
  /* MCG->C5: ??=0,PLLCLKEN=0,PLLSTEN=0,PRDIV=19 */
  MCG->C5 = (uint8_t)0x13u;      //50/20=2.5M
  /* MCG->C6: LOLIE=0,PLLS=1,CME=0,VDIV=16 */
 MCG->C6 = (uint8_t)0x50u;     //2.5X40=100M
并且是在切换到FBE前设置了一次,切换到PBE前设置了一次。不知道为啥要这样,我是在原来的程序上修改的,只是修改了参数,把原来使用osc的改为使用外部振荡器。修改了分频比。
目前是调试模式下正常,脱机运行就不行。
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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

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

GMT+8, 2025-7-19 16:48 , Processed in 0.096719 second(s), 23 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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