MSP430FR6989单片机学习之系统时钟

控制/MCU

1882人已加入

描述

今天继续跟大家分享MSP430FR6989系列教程的系统时钟

教程用到的硬件平台:TI官方的MSP430FR6989 LaunchPad

编译器:IAR For MSP430。

1,系统时钟源的种类

MSP430FR6989有五个时钟源,分别如下:

  • LFXTCLK:低频振荡器,例如32.768kHz晶振。可以通过软件配置由外部方波信号驱动。
  • HFXTCLK:高频振荡器, 4 MHz - 24 MHz 范围内晶振使用。可以通过软件配置由外部方波信号驱动。
  • DCOCLK:具有可选频率的内部数控振荡器 (DCO)
  • VLOCLK:典型频率为 10 kHz 的内部超低功耗低频振荡器
  • MODCLK:典型频率为 5 MHz 的内部低功耗振荡器。

大家可以根据项目的需求配置时钟源,在LaunchPad开发板中外部时钟使用LFXTCLK外接32.768k的晶振,原理图如下:

ti

2,系统时钟信号

对于MSP430FR6989单片机,一共有五种时钟信号,如下所示:

  • ACLK: 辅助时钟。 一般用于低速外设。
  • MCLK: 主时钟。 用于CPU和系统使用。
  • SMCLK: 子系统主时钟。 一般用于高速外设。
  • MODCLK:模块时钟。 一般用于低功耗下高速外设模块使用。
  • VLOCLK: VLO 时钟。 一般用于低功耗下低速外设模块使用。

3,寄存器配置IO口实现外部时钟输入

LFXTCLK时钟连接到PJ4、PJ5上,我们需要将PJ4、PJ5配置为主功能模式,可以通过PxSEL1和PxSEL0配置IO口的功能,如下图所示:

ti

实现主功能,只需要将PxSEL1配置为0,PxSEL0配置为1即可,代码如下:

/* 外部引脚32.768k使能 */ 
PJSEL0 |= BIT4;    
PJSEL1 &= ~BIT4;


PJSEL0 |= BIT5;    
PJSEL1 &= ~BIT5;

4,配置DCO时钟以及配置时钟源

接下来我们需要配置内部DCO时钟供以MCLK和SMCLK使用,在配置时钟之前,我们需要先进行时钟配置的解锁,通过寄存器CSCTL0配置,如下:

ti

CSCTL0寄存器的高位要写入A5h才可以进行配置,配置如下:

/* 使能时钟寄存器设置 */ 
    CSCTL0_H = CSKEY_H;    // 将寄存器的高8位,配置为A5h

我们找到头文件中定义CSKEY_H可以看到,CSKEY_H即为A5h,头文件中已经定义好了,方便程序的编写以及后续对于程序的阅读。如下所示:

ti

当然,程序也可以如下编写,是跟上面的是一样的 :

/* 使能时钟寄存器设置 */ 
CSCTL0 = CSKEY;      // 将寄存器的高8位,配置为A5h

解锁完成之后,我们就要进行DCO的频率配置,这里我们选择8M时钟,配置寄存器CSCTL1选择频率,配置DCOFSEL位为6,即为选择8M时钟,如下:

ti

代码配置如下:

CSCTL1 = DCOFSEL_6;              // DCO = 8M

当我们选择更高的频率时,比如16M频率,那么我们需要将DCORSEL位置1,然后在选择DCOFSEL为第四位即可,即:

CSCTL1 = DCORSEL + DCOFSEL_4;              // DCO = 16M

接下来就是为系统时钟分配时钟源,我们ACLK选择LFXTCLK,SMCLK选择DCOCLK,MCLK选择DCOCLK,直接通过CSCTL2寄存器进行配置即可,寄存器介绍如下:

ti

代码的编写就要简单的多,而且一眼就可以看懂,如下所示:

/* ACLK = LFXT ,SMCLK和MCLK=DCO */
    CSCTL2 = SELA__LFXTCLK + SELS__DCOCLK + SELM__DCOCLK;

然后就是关于系统时钟的分频,比如说8MHz频率,经过2分频后就是4MHz用于系统分频的寄存器是CSCTL3,如下图所示:

ti

这里我们不进行分频,直接CSCTL3 = 0;即可。

比如SMCLK要进行2分频的话,代码的编写如下:

CSCTL3 = DIVS_1;     // ACLK/MCLK 分频=1   SMCLK 分频=2

最后,我们要选择时钟源的开关,比如我们没有用到HFXTCLK和VLOCLK,我们将其关闭,对于使用到的LFXTCLK,我们需要配置一下驱动电流,这里我们没有调试低功耗,可以先将其设置为最大强度的驱动电流。如下:

ti

当然最后不能忘记,锁定寄存器,只要不是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;       
}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分