今天继续跟大家分享MSP430FR6989系列教程的系统时钟
教程用到的硬件平台:TI官方的MSP430FR6989 LaunchPad
编译器:IAR ForMSP430。
(相关资料图)
1,系统时钟源的种类
MSP430FR6989有五个时钟源,分别如下:
LFXTCLK:低频振荡器,例如32.768kHz晶振。可以通过软件配置由外部方波信号驱动。HFXTCLK:高频振荡器, 4 MHz - 24 MHz 范围内晶振使用。可以通过软件配置由外部方波信号驱动。DCOCLK:具有可选频率的内部数控振荡器 (DCO)VLOCLK:典型频率为 10 kHz 的内部超低功耗低频振荡器MODCLK:典型频率为 5 MHz 的内部低功耗振荡器。大家可以根据项目的需求配置时钟源,在LaunchPad开发板中外部时钟使用LFXTCLK外接32.768k的晶振,原理图如下:
2,系统时钟信号
对于MSP430FR6989单片机,一共有五种时钟信号,如下所示:
ACLK: 辅助时钟。 一般用于低速外设。MCLK: 主时钟。 用于CPU和系统使用。SMCLK: 子系统主时钟。 一般用于高速外设。MODCLK:模块时钟。 一般用于低功耗下高速外设模块使用。VLOCLK: VLO 时钟。 一般用于低功耗下低速外设模块使用。3,寄存器配置IO口实现外部时钟输入
LFXTCLK时钟连接到PJ4、PJ5上,我们需要将PJ4、PJ5配置为主功能模式,可以通过PxSEL1和PxSEL0配置IO口的功能,如下图所示:
实现主功能,只需要将PxSEL1配置为0,PxSEL0配置为1即可,代码如下:
/* 外部引脚32.768k使能 */ PJSEL0 |= BIT4; PJSEL1 &= ~BIT4;PJSEL0 |= BIT5; PJSEL1 &= ~BIT5;
4,配置DCO时钟以及配置时钟源
接下来我们需要配置内部DCO时钟供以MCLK和SMCLK使用,在配置时钟之前,我们需要先进行时钟配置的解锁,通过寄存器CSCTL0配置,如下:
CSCTL0寄存器的高位要写入A5h才可以进行配置,配置如下:
/* 使能时钟寄存器设置 */ CSCTL0_H = CSKEY_H; // 将寄存器的高8位,配置为A5h
我们找到头文件中定义CSKEY_H可以看到,CSKEY_H即为A5h,头文件中已经定义好了,方便程序的编写以及后续对于程序的阅读。如下所示:
当然,程序也可以如下编写,是跟上面的是一样的 :
/* 使能时钟寄存器设置 */ CSCTL0 = CSKEY; // 将寄存器的高8位,配置为A5h
解锁完成之后,我们就要进行DCO的频率配置,这里我们选择8M时钟,配置寄存器CSCTL1选择频率,配置DCOFSEL位为6,即为选择8M时钟,如下:
代码配置如下:
CSCTL1 = DCOFSEL_6; // DCO = 8M
当我们选择更高的频率时,比如16M频率,那么我们需要将DCORSEL位置1,然后在选择DCOFSEL为第四位即可,即:
CSCTL1 = DCORSEL + DCOFSEL_4; // DCO = 16M
接下来就是为系统时钟分配时钟源,我们ACLK选择LFXTCLK,SMCLK选择DCOCLK,MCLK选择DCOCLK,直接通过CSCTL2寄存器进行配置即可,寄存器介绍如下:
代码的编写就要简单的多,而且一眼就可以看懂,如下所示:
/* ACLK = LFXT ,SMCLK和MCLK=DCO */ CSCTL2 = SELA__LFXTCLK + SELS__DCOCLK + SELM__DCOCLK;
然后就是关于系统时钟的分频,比如说8MHz频率,经过2分频后就是4MHz用于系统分频的寄存器是CSCTL3,如下图所示:
这里我们不进行分频,直接CSCTL3 = 0;即可。
比如SMCLK要进行2分频的话,代码的编写如下:
CSCTL3 = DIVS_1; // ACLK/MCLK 分频=1 SMCLK 分频=2
最后,我们要选择时钟源的开关,比如我们没有用到HFXTCLK和VLOCLK,我们将其关闭,对于使用到的LFXTCLK,我们需要配置一下驱动电流,这里我们没有调试低功耗,可以先将其设置为最大强度的驱动电流。如下:
当然最后不能忘记,锁定寄存器,只要不是A5h即可。代码如下:
CSCTL4 = HFXTOFF + VLOOFF + LFXTDRIVE_3; // 关闭HFXT VLO ,打开LFX
5,代码实现
void Initial_Clock(void){ /* 外部32.768k使能 */ PJSEL0 |= BIT4; PJSEL1 &= ~BIT4; PJSEL0 |= BIT5; PJSEL1 &= ~BIT5; /* 使配置完成的IO口生效,从LPMx.5退出 */ PM5CTL0 &= ~LOCKLPM5; /* 使能时钟寄存器设置 */ CSCTL0_H = CSKEY_H; CSCTL1 = DCOFSEL_6; // DCO = 8M CSCTL2 = SELA__LFXTCLK + SELS__DCOCLK + SELM__DCOCLK; // ACLK = LFXT ,SMCLK和MCLK=DCO CSCTL3 = 0; // ACLK/SMCLK/MCLK 分频=1 CSCTL4 = HFXTOFF + VLOOFF + LFXTDRIVE_3; // 关闭HFXT VLO ,打开LFXT /* 禁止时钟寄存器设置 */ CSCTL0_H = 0; }
标签: