K66 Clock Generation

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

K66 Clock Generation

跳至解决方案
1,066 次查看
mdrasool_yadwad
Contributor II

Hello,

I am using K66 controller MK66FX1M0VLQ18 . I want run at high speed of 180Mhz and write/read from the flash. I am not getting which all registers to configure. Please help me out

 

标签 (1)
0 项奖励
回复
1 解答
1,042 次查看
mjbcswitzerland
Specialist V

Hi

In HSRUN mode the flash can be read but it can't be erased or written.

Regards

Mark

在原帖中查看解决方案

0 项奖励
回复
3 回复数
1,059 次查看
mjbcswitzerland
Specialist V

Hi

Use the uTasker open source project as reference - https://github.com/uTasker/uTasker-Kinetis select FRDM_K66F and enable USE_HIGH_SPEED_RUN_MODE and it will generate you a project that runs at full speed and its simulator will show you the details and allow you to step the code (in Visual Studio) to see all steps needed.
Also follow https://www.utasker.com/kinetis/MCG.html which gives some practical insights into the workings of the MCG.
Beware that the high speed run mode is required to operate at 180MHz and flash programming is not possible in this mode. Ether you need to switch clocks to <= 120MHz and move to RUN mode each time programming is required or else you need to generally use RUN mode (limited to 120MHz).
The actual clock configuration for max. speed on all buses for the K66 (assuming 12MHz crystal source) is:

 

#define CLOCK_DIV 1
#define CLOCK_MUL 30                                                     // (((12 /1) * 30) / 2)) gives 128MHz
#define SYSTEM_CLOCK_DIVIDE 1                                            // 180MHz system clock
#define BUS_CLOCK_DIVIDE     3                                           // 180/3 to give 60MHz (max. 60MHz)
#define FLEX_CLOCK_DIVIDE    3                                           // 180/3 to give 60MHz (max. 60MHz)
#define FLASH_CLOCK_DIVIDE   7                                           // 180/7 to give 25.714MHz (max. 28MHz)

    MCG_C2 = (MCG_C2_RANGE_8M_32M | MCG_C2_EREFS | MCG_C2_LOCRE0);       // select crystal oscillator and select a suitable range
    MCG_C1 = (MCG_C1_CLKS_EXTERN_CLK | MCG_C1_FRDIV_32);                 // switch to external source (the FLL input clock is set to as close to its input range as possible, although this is not absolutely necessary if the FLL will not be used)
    _WAIT_REGISTER_FALSE(MCG_S, MCG_S_OSCINIT);                          // loop until the crystal source has been selected
    _WAIT_REGISTER_TRUE(MCG_S, MCG_S_IREFST);                            // loop until the FLL source is no longer the internal reference clock
    while ((MCG_S & MCG_S_CLKST_MASK) != MCG_S_CLKST_EXTERN_CLK) {}      // loop until the external reference clock source is valid
    MCG_C5 = ((CLOCK_DIV - 1) | MCG_C5_PLLSTEN0);                        // now move from state FEE to state PBE (or FBE) PLL remains enabled in normal stop modes
    MCG_C6 = ((CLOCK_MUL - MCG_C6_VDIV0_LOWEST) | MCG_C6_PLLS);          // set the PLL multiplication factor
    while ((MCG_S & MCG_S_PLLST) == 0) {}                                // loop until the PLLS clock source becomes valid
    while ((MCG_S & MCG_S_LOCK) == 0) {}                                 // loop until PLL locks
    SIM_CLKDIV1 = (((SYSTEM_CLOCK_DIVIDE - 1) << 28) | ((BUS_CLOCK_DIVIDE - 1) << 24) | ((FLEX_CLOCK_DIVIDE - 1) << 20) | ((FLASH_CLOCK_DIVIDE - 1) << 16)); // prepare bus clock divides
    SMC_PMCTRL = SMC_PMCTRL_RUNM_HSRUN;                                  // set high speed run mode (restrictions apply) so that the clock speeds can be obtained  
    MCG_C1 = (MCG_C1_CLKS_PLL_FLL | MCG_C1_FRDIV_1024);                  // finally move from PBE to PEE mode - switch to PLL clock
    while ((MCG_S & MCG_S_CLKST_MASK) != MCG_S_CLKST_PLL) {}             // loop until the PLL clock is selected
    SIM_CLKDIV3 = PERIPHERAL_CLOCK_DIVIDE_VALUE;                         // configure the optional peripheral clock divide early since it shouldn't be changed once LPUARTs or TPU have started using it

 

 

Simulation of the operation:

mjbcswitzerland_0-1603882398508.png

 

Regards

Mark
[uTasker project developer for Kinetis and i.MX RT]
Contact me by personal message or on the uTasker web site to discuss professional training, solutions to problems or product development requirements

 

0 项奖励
回复
1,051 次查看
mdrasool_yadwad
Contributor II

Problem is in datasheet they have mentioned we cant read or write on to flash in high speed run. (180Mhz)

0 项奖励
回复
1,043 次查看
mjbcswitzerland
Specialist V

Hi

In HSRUN mode the flash can be read but it can't be erased or written.

Regards

Mark

0 项奖励
回复