KEAZ128学习(二)---时钟

说在前面

在KEA的中文手册上第5章,讲述的是时钟分配,一块MCU到手使用之前,必须得了解到这块MCU的时钟是多少,并且要知道是否需要配置。从这章起,本人将直接进入程序编写,关于工程方面,由于我用惯了ST的固件库,觉得飞思卡尔的固件库好难用啊(用不熟),因此本人决定直接使用寄存器搭建属于自己的库,肯定没有官方的写得好,但我就是用得顺,hhhh。
1)软件使用:keil 5.25
2)编写方式:寄存器编写

1)KEAZ128时钟框图:

KEAZ128学习(二)---时钟_第1张图片
上图为芯片手册上截下来我的时钟框图,关于这个,怎么看呢?其实并不难,图上显示了4种颜色,基本上就是分成了四个部分:
1)第一种是使用内部低速时钟来产生时钟源,看灰色部分,
KEAZ128学习(二)---时钟_第2张图片
内部低速时钟是32KHz,看上去1MHz都没有。这32KHz的时钟,是使用内部的RC振荡器产生的,并且输入到FLL上,这就成为了FLL的参考时钟。FLL通过配置寄存器,将会输入到BDIV,而从BDIV上会输出一个时钟源(ICSOUTCLK),从名字就可以看出,这就是ICS下输出的时钟源。输出的时钟源将会送到CLK_GEN(时钟门)上,进行各个总线的时钟分配。从图上看,32K的时钟还有一个分支是向RTC、WDOG、FTM进行时钟输送的。

2)第二种就是我们经常用的,外部时钟的方式。从图上看,KEA上有一个System oscillator这个东西,这是啥,不懂,没关系,慢慢看。它有两个输入口,EXTAL和XTAL,这两个名字很熟,没错,就是晶振的入口,这就是两个管脚,用来接外部晶振源的。晶振时钟输入后,会进入到OSC logic,这是一个逻辑控制器,使能之后将会输入一个时钟,叫做OSCCLK出来,去到CLKS,然后到达BDIV,输出ICSOUTCLK,最后就跟模式1是一样的,不一样的在于,RTC/WDOG/ADC使用的是OSCERCLK提供的时钟。

了解到这个之后,就可以开始写程序了,为了更好的性能,我决定使用外部时钟。为什么呢?因为我觉得稳啊,快啊。时钟的相关寄存器,在SKEAZ1284.h这个头文件中,已经定义好了。
KEAZ128学习(二)---时钟_第3张图片
上图是时钟外部时钟的一些性能配置。

2)时钟配置函数

新建好KEA的普通工程,不带SDK固件库。
KEAZ128学习(二)---时钟_第4张图片
刚刚新建完成时,只包含四个文件:
1)starup_SKEAZ1284.s(这个是启动文件)
2)system_SKEAZ1284.c、system_SKEAZ1284.h(系统配置文件以及头文件)
3)SKEAZ1284.h(KEA自带的头文件,寄存器都编写在这里面)

然后需要自己新建几个文件:
1)main.c、main.h (存放main函数)
2)isr.c、isr.h(存放中断函数)

以下是将时钟配置成80MHz的代码,

 SIM->CLKDIV =   (0
                     | SIM_CLKDIV_OUTDIV1(0x00)                 // 将ICSOUTCLK作为系统时钟
                     | (1<C2 = (0
               |   ICS_C2_BDIV(0x0)
               //|   ICS_C2_LP_MASK
              );
              
     OSC->CR = (0
               | OSC_CR_OSCEN_MASK     //OSC 模块使能
               | OSC_CR_OSCOS_MASK     //OSC 输出选择      (0是 EXTAL 引脚的外部时钟源,1是振荡器时钟源)
               | OSC_CR_RANGE_MASK     //频率范围选择      (0是32 kHz 的低频范围。1是4–24 MHz 的高频范围。)
               | OSC_CR_HGO_MASK       //高增益振荡器选择  (0 低功耗模式,1 高增益模式)
              );

     ICS->C1 = ( 0
                //| ICS_C1_IREFS_MASK   // FLL 的基准时钟源。(0 选择外部基准时钟。1 选择内部基准时钟。)
                | ICS_C1_CLKS(0x00)     //进入 FLL 外部启用(FEE)模式 必须此值为 0
//CORE_CLK == 80
//                | ICS_C1_RDIV(0x02)
//#elif (CORE_CLK == 40)
//                | ICS_C1_RDIV(0x03)
//#elif  (CORE_CLK == 20)
//                | ICS_C1_RDIV(0x04)
                | ICS_C1_IRCLKEN_MASK
              ); 
        
    while((ICS->S & ICS_S_IREFST_MASK) != 0x00U) {}      //等待时钟选择外部时钟
    while((ICS->S & ICS_S_CLKST_MASK) != 0x00U) {}       //等待时钟模式状态选择 FLL 的输出

亲测可以超频到80MHz。一般来说,超频过高输出的信号也相对会不太稳定,一不小心也容易锁MCU,所以请谨慎使用超频,可按照上面例子自行修改到48MHz,相对稳定使用。

你可能感兴趣的:(NXP)