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模數轉換器介紹
下一篇:最后一頁