
今天繼續跟大家分享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; }
標簽: