说在前面
在KEA的中文手册上第5章,讲述的是时钟分配,一块MCU到手使用之前,必须得了解到这块MCU的时钟是多少,并且要知道是否需要配置。从这章起,本人将直接进入程序编写,关于工程方面,由于我用惯了ST的固件库,觉得飞思卡尔的固件库好难用啊(用不熟),因此本人决定直接使用寄存器搭建属于自己的库,肯定没有官方的写得好,但我就是用得顺,hhhh。
1)软件使用:keil 5.25
2)编写方式:寄存器编写
1)KEAZ128时钟框图:
上图为芯片手册上截下来我的时钟框图,关于这个,怎么看呢?其实并不难,图上显示了4种颜色,基本上就是分成了四个部分:
1)第一种是使用内部低速时钟来产生时钟源,看灰色部分,
内部低速时钟是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这个头文件中,已经定义好了。
上图是时钟外部时钟的一些性能配置。
2)时钟配置函数
新建好KEA的普通工程,不带SDK固件库。
刚刚新建完成时,只包含四个文件:
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<<SIM_CLKDIV_OUTDIV2_SHIFT) // 将系统时钟的1/2作为总线时钟
| (1<<SIM_CLKDIV_OUTDIV3_SHIFT) // 将系统时钟的1/2作为定时器时钟
);
/* 切换到 FEE 模式 */
ICS->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,相对稳定使用。