MSP430FR6989单片机学习之系统时钟-环球新动态

2023-06-26 15:25:18 来源:LemonTechnology

今天继续跟大家分享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;       }

标签:

上一篇:ADC模数转换器介绍
下一篇:最后一页