配置相应时钟后,可以打印输出:
// 配置PLL
sta = CLK_EnablePLL(CLK_PLLCTL_PLLSRC_HXT, 144000000);
/***********************************************************************/
printf("HXT:%d.
",CLK_GetHXTFreq());
printf("LXT:%d.
",CLK_GetLXTFreq());
printf("PCLK0:%d.
",CLK_GetPCLK0Freq());
printf("PCLK1:%d.
",CLK_GetPCLK1Freq());
printf("HCLK:%d.
",CLK_GetHCLKFreq());
printf("CPUCLK:%d.
",CLK_GetCPUFreq());
printf("PLL:%d. ",sta);
HXT和LXT需使能才有值。
结论:
HXT可以在config区进行使能。所以说进入程序时已经启动。
但PLL只能由用户开启,如果用户不开启,CPUCLK、HCLK、PCLK0、PCLK1的频率只能达到HXT的12M或者是HIRC的22.1184M , PLL = 0;
开启PLL的频率可以达到250M。(实测开到270M还行,但是272M有时可以,有时卡死!)
还有一种情况,config没有配置HXT时,进入程序虽然可以起振,但是CPUCLK、HCLK、PCLK0、PCLK1却只能使用HIRC的一半 11.0592M ,PLL正常,但不能用。(但是配置HXT引脚时,一切正常!)
还有个问题,PLL配置为最低值50M,CPUCLK、HCLK、PCLK0、PCLK1也能达到72M,为什么?
1 //初始化系统时钟 2 void msys_init(void) 3 { 4 // 解锁保护寄存器 5 SYS_UnlockReg(); 6 7 //下面代码config区已经配置启动好了,同时配置PLL时也重新配置,此处没必要多余 8 // 使能HXT时钟 (external XTAL 12MHz) 9 //CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk); 10 // 等待时钟稳定 11 //CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk); 12 13 // 配置PLL 14 sta = CLK_EnablePLL(CLK_PLLCTL_PLLSRC_HXT, 72000000); 15 // 选择PLL的2分频作为HCLK时钟源 16 CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_PLL, CLK_CLKDIV0_HCLK(2)); 17 // 选择内核时钟为PLL 18 CLK_SetCoreClock(72000000); 19 // 更新SystemCoreClock值 20 SystemCoreClockUpdate(); 21 // 加锁保护寄存器 22 SYS_LockReg(); 23 }
更新:
1 // 初始化系统时钟 2 void msys_init(void) 3 { 4 // 解锁保护寄存器 5 SYS_UnlockReg(); 6 7 // 下面代码config区已经配置启动好了,同时配置PLL时也重新配置 8 // 使能HXT时钟 (external XTAL 12MHz) 9 CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk); 10 // 等待时钟稳定 11 CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk); 12 13 // 配置PLL 14 //CLK_EnablePLL(CLK_PLLCTL_PLLSRC_HXT, 144000000); 15 // 选择PLL的2分频作为HCLK时钟源 16 //CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_PLL, CLK_CLKDIV0_HCLK(2)); 17 18 // 配置内核时钟,上两个语句本函数已实现,未失能HIRC 19 CLK_SetCoreClock(72000000); 20 // 等待时钟稳定 21 CLK_WaitClockReady(CLK_STATUS_PLLSTB_Msk); 22 23 // 更新SystemCoreClock值 24 SystemCoreClockUpdate(); 25 26 // 加锁保护寄存器 27 SYS_LockReg(); 28 }