首页->【玩CortexM0】

18 1

[Nuvoton M0516] 实验八 系统时钟实验[超频降频]

在实际应用中许多时候希望芯片能提供稍高点的性能,处理优化系统,优化代码,优化运行结构之外还有一种方法就是提高系统运行的主频。这可以通过芯片自带的PLL等调相调频等方法实现,本例就是改变系统PLL实现改变主时钟的。先看下编一段代码:

//Set PLL Frequency

void McuInit(int fre){//fre=1~512||fre<240

 Un_Lock_Reg();

 //PWRCON |= XTL12M_EN;//Ext OSC Enable

 //while((CLKSTATUS & XTL12M_STB) == 0);//ExtOSC Ok?

 //CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;//ExtOSC for system

 PWRCON |= OSC22M_EN;//Enable Internal OSC 22MHz

 while((CLKSTATUS & OSC22M_STB) == 0);//OSC Ok?

 CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_22M;//Internal OSC for System

 PLLCON = 0x00085200 | fre;

 while((CLKSTATUS & PLL_STB) == 0);

 CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_PLL;

 Lock_Reg();

}

Un_Lock_Reg();

Lock_Reg();

这2句完成设置系统Clock时对寄存器的开锁和加锁。

//PWRCON |= XTL12M_EN;//Ext OSC Enable

//while((CLKSTATUS & XTL12M_STB) == 0);//ExtOSC Ok?

//CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;//ExtOSC for system

这3句是当采用外部晶振时的语句,由于此小板精简设计没有外部晶振,只能用内部振荡器,后3行的语句。

接下来1行是改变PLL的关键,已经将函数简化成PLLCON = 0x00085200 | fre;,也就是调用此函数带一个整形参数fre即可,测试:上式的fre范围在本小板上可以稳定跑的频率范围是fre=8~88,低于8没有输出了,高于88,比如90就会自动宕机了。

为了完成改变频率测试,我们需要改变一下几个地方才能测出来结果:

首先在变量定义区增加一个变量:

,fre=8//=8,万一忘了也有数值

将上一函数拷贝到主函数main的前边,所有函数的最前边也可以

为了能看到结果,我们必须做一下改变,直观的就是讲Timer1Init()函数中的Timer1的始终改成从PLL获得——找到Timer1Init()函数,将:CLKSEL1=(CLKSEL1 & (~TM1_CLK)) | TM1_22M;改成:CLKSEL1=(CLKSEL1 & (~TM1_CLK)) | TM1_HCLK;

这个改动使得Timer1的时钟是通过PLL过来的,改变系统频率,可以使得P27的脉冲改变——原来固定22.1184MHz输出500Hz会改变。因为只是测试系统时钟,因此其他程序都不变。下边是测试结果图81,图82,图83,分别对应22MHz,8MHz,88MHz。

22MHz时的P27脉冲输出频率波形

8MHz时的P27脉冲输出频率波形

88MHz时的P27脉冲输出频率波形。

由于各个模块可以选择不同的时钟输入源,因此改变系统时钟可以不改变没有采用PLL后的系统时钟,这一点非常有用——至少UART0的输出就不用改变,尽管系统时钟以为PLL改变,但UART0的115200波特率照旧不变。

作者于2017-02-01 11:27:27修改!
楼主可见

  1. shine 1#

    写的非常棒 , 用新唐很久了 还没有超频过