MSP430F5529 DriverLib 库函数学习笔记(一)时钟配置和闪烁LED
目錄
- 一、新建工程
- 二、時鐘樹
- 時鐘系統(tǒng)結(jié)構(gòu)
- 時鐘系統(tǒng)的原理
- 時鐘樹配置實戰(zhàn)
- 三、點燈工程師
- 封裝好的初始化函數(shù)
MSP430F5529 LaunchPad? Development Kit
(MSP?EXP430F5529LP)
一、新建工程
二、時鐘樹
時鐘系統(tǒng)結(jié)構(gòu)
(1)5個時鐘來源
????????時鐘系統(tǒng)模塊具有5個時鐘來源。
① XT1CLK:低頻/高頻振蕩器,可以使用32768Hz的手表晶振、標(biāo)準(zhǔn)晶體、諧振器或4~32MHz的外部時鐘源;
② VLOCLK:內(nèi)部超低功耗低頻振蕩器,典型頻率12kHz;
③ REFOCLK:內(nèi)部調(diào)整低頻參考振蕩器,典型值為32768Hz;
④ DCOCLK:內(nèi)部數(shù)字時鐘振蕩器,可由FLL穩(wěn)定后得到;
⑤ XT2CLK:高頻振蕩器,可以是標(biāo)準(zhǔn)晶振、諧振器或4~32MHz的外部時鐘源。
(2)3個時鐘信號
????????時鐘系統(tǒng)模塊可以產(chǎn)生3個時鐘信號供CPU和外設(shè)使用。
① ACLK:輔助時鐘(Auxiliary Clock)??梢酝ㄟ^軟件選擇XT1CLK、REFOCLK、VLOCLK、DCOCLK、DCOCLKDIV或XT2CLK(當(dāng)XT2CLK可用時)。DCOCLKDIV是FLL模塊內(nèi)DCOCLK經(jīng)過1/2/4/8/16/32分頻后獲得的。ACLK主要用于低速外設(shè)。ACLK可以再進(jìn)行1/2/4/8/16/32分頻,ACLK/n 就是ACLK 經(jīng)過1/2/4/8/16/32分頻后得到的,也可以通過外部引腳進(jìn)行輸出。
② MCLK:主時鐘(Master Clock)。MCLK的時鐘來源與ACLK相同,MCLK專門供CPU使用,MCLK配置得越高,CPU的執(zhí)行速度就越快,功耗就越高。一旦關(guān)閉MCLK,CPU也將停止工作,因此在超低功耗系統(tǒng)中可以通過間歇啟用MCLK的方法降低系統(tǒng)功耗。MCLK也可經(jīng)1/2/4/8/16/32分頻后供CPU使用。
③ SMCLK:子系統(tǒng)時鐘(Subsystem Master Clock)。SMCLK的時鐘來源與ACLK相同,SMCLK主要用于高速外設(shè),SMCLK也可以再進(jìn)行1/2/4/8/16/32分頻。
時鐘系統(tǒng)的原理
(1)內(nèi)部超低功耗低頻振蕩器(VLO)
????????內(nèi)部超低功耗低頻振蕩器在無須外部晶振的情況下,可提供12kHz的典型頻率。VLO為不需要精確時鐘基準(zhǔn)的系統(tǒng)提供了一個低成本、超低功耗的時鐘源。當(dāng)VLO被用作ACLK、MCLK或SMCLK時(SELA={1}、SELM={1}或SELS={1}),VLO被啟用。
(2)內(nèi)部調(diào)整低頻參考時鐘振蕩器(REFO)
????????在不要求或不允許使用晶振的應(yīng)用中,REFO可以用作高精度時鐘。經(jīng)過內(nèi)部調(diào)整,REFO的典型頻率為32768Hz,并且可以為FLL模塊提供一個穩(wěn)定的參考時鐘源。REFOCLK與FLL的組合,在無須外部晶振的情況下,提供了靈活的大范圍系統(tǒng)時鐘。當(dāng)不使用REFO時,REFO不消耗電能。
(3)XT1振蕩器(XT1)
????????如圖所示。MSP430單片機的每種器件都支持XT1振蕩器,MSP430F5xx/6xx系列單片機的XT1振蕩器支持兩種模式:LF(低頻模式)和HF(高頻模式)。
(4)XT2振蕩器(XT2)
????????如圖所示,XT2振蕩器用來產(chǎn)生高頻的時鐘信號XT2CLK,其工作特性與XT1振蕩器工作在高頻模式相似,晶振的選擇范圍為4 ~32MHz,具體范圍由XT2DRIVE控制位進(jìn)行設(shè)置。高頻時鐘信號XT2CLK可以分別作為輔助時鐘ACLK、主時鐘MCLK和子系統(tǒng)時鐘SMCLK的基準(zhǔn)時鐘信號,也可提供給鎖頻環(huán)模塊(FLL),可以利用XT2OFF控制位實現(xiàn)對XT2模塊的啟用(0)和關(guān)閉(1)。
(5)鎖頻環(huán)(FLL)
????????如圖所示,FLL的參考時鐘FLLREFCLK可以來自于XT1CLK、REFOCLK或XT2CLK中的任何一個時鐘源,通過SELREF控制位進(jìn)行選擇。由于這3種時鐘的精確度都很高,倍頻后仍然能夠得到準(zhǔn)確的頻率。FLL能夠產(chǎn)生兩種時鐘信號:DCOCLK和DCOCLKDIV,其中DCOCLKDIV信號為DCOCLK時鐘經(jīng)1/2/4/8/16/32分頻后得到(分頻系數(shù)為D)。
????????鎖頻環(huán)是一種非常巧妙的電路,它的核心部件是數(shù)控振蕩器和一個頻率積分器。數(shù)控振蕩器能夠產(chǎn)生DCOCLK時鐘,頻率計數(shù)器實際上是一個加減計數(shù)器,“+”輸入端上的每個脈沖將使計數(shù)值加1,“-”輸入端上的每個脈沖將使計數(shù)值減1。FLLREFCLK經(jīng)過1/2/4/8/12/16分頻后輸入頻率積分器的“+”輸入端(分頻系數(shù)為n),DCOCLKDIV經(jīng)過(N+1)分頻后輸入頻率積分器的“-”輸入端,頻率積分器的運算結(jié)果又輸出給數(shù)控振蕩器,改變數(shù)控振蕩器的輸出頻率DCOCLK,構(gòu)成反饋環(huán)。經(jīng)過反饋調(diào)整,最終的結(jié)果使頻率積分器的“+”輸入端的頻率與“-”輸入端的頻率相同,即
????????所以,數(shù)控振蕩器的最終輸出頻率為
????????其中,D由3位FLLD控制位確定,取值為1,2,4,8,16,32;
????????N由10位FLLN控制位確定,取值范圍為1~1023;
????????n由3位FLLREFDIV控制位確定,取值為1,2,4,8,12,16。
(6)內(nèi)部模塊振蕩器(MODOSC)
????????如圖所示,UCS時鐘模塊還包含一個內(nèi)部模塊振蕩器MODOSC,能夠產(chǎn)生約4.8MHz的MODCLK時鐘。Flash控制器模塊、ADC_12模塊等片內(nèi)外設(shè)都可使用MODCLK作為內(nèi)部參考時鐘。
????????為了降低功耗,當(dāng)不需要使用MODOSC時,可將其關(guān)閉。當(dāng)產(chǎn)生有條件或無條件啟用請求時,MODOSC可自動開啟。設(shè)置MODOSCREQEN控制位,將允許有條件啟用請求使用MODOSC模塊。對于利用無條件啟用請求的模塊無須置位MODOSCREQEN控制位,例如Flash控制器、ADC_12等。
(7)時鐘模塊失效及安全操作
????????MSP430單片機的時鐘模塊包含檢測XT1、XT2和DCO振蕩器故障失效的功能。振蕩器故障失效檢測邏輯如圖所示。
????????晶振故障失效條件有以下4種。
① XT1LFOFFG:XT1振蕩器在低頻模式(LF)下失效;
② XT1HFOFFG:XT1振蕩器在高頻模式(HF)下失效;
③ XT2OFFG:XT2振蕩器失效;
④ DCOFFG:DCO振蕩器失效。
時鐘樹配置實戰(zhàn)
????????這里我打算將MCLK、SMCLK配置為25MHz,它們的時鐘源設(shè)為倍頻后的DCOCLK,FLL時鐘源設(shè)為XT2CLK。
????????由原理圖可知,XT2輸入引腳為P5.2、P5.3
復(fù)用P5.2、P5.3
根據(jù)自己的開發(fā)板,選擇合適的參數(shù)啟用XT2
MSP430F5529 LaunchPad? Development Kit 板載XT2晶振為CSTCR4M00G15L99,4MHz
MSP430為了省電默認(rèn)狀態(tài)下核心電壓默認(rèn)設(shè)置為1.8V來節(jié)省功耗,高頻工作需要較高的核心電壓,本次實驗不需要低功耗模式,故我們直接將核心電壓設(shè)為最高級。
UCS_initClockSignal用于設(shè)置各時鐘的時鐘源和分頻系數(shù)。
UCS_initFLLSettle用于設(shè)置鎖相環(huán)倍頻系數(shù)。
故將XT2的4MHz經(jīng)8分頻進(jìn)入鎖相環(huán),再倍頻50倍后即可得到25MHz的DCOCLK
(4MHz經(jīng)4分頻再倍頻24倍、25倍只能得到24MHz,26倍得到26MHz,我暫且蒙在鼓里)
最后將MCLK、SMCLK的時鐘源選為DCOCLK
綜上,最后將MCLK和SMCLK通過P7.7、P2.2復(fù)用輸出
#include "driverlib.h"int main(void) {WDT_A_hold(WDT_A_BASE);GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN2);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN3);UCS_turnOnXT2 (UCS_XT2_DRIVE_4MHZ_8MHZ);PMM_setVCore(PMM_CORE_LEVEL_3);UCS_initClockSignal(UCS_FLLREF, UCS_XT2CLK_SELECT, UCS_CLOCK_DIVIDER_8);UCS_initFLLSettle(25000, 50);UCS_initClockSignal(UCS_MCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);UCS_initClockSignal(UCS_SMCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN2); //SMCLK OutputGPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P7, GPIO_PIN7); //MCLK Outputwhile(1){} }測得對應(yīng)時鐘已升至25MHz
三、點燈工程師
如原理圖所示,P4.7控制LED2,高電平點亮
在程序中加入
#define MCLK_IN_HZ 25000000#define delay_us(x) __delay_cycles((MCLK_IN_HZ/1000000*(x))) #define delay_ms(x) __delay_cycles((MCLK_IN_HZ/1000*(x)))將P4.7設(shè)為輸出模式
GPIO_setAsOutputPin(GPIO_PORT_P4, GPIO_PIN7);while(1){GPIO_toggleOutputOnPin (GPIO_PORT_P4, GPIO_PIN7);delay_ms(500);}即可觀察到LED2以1Hz的頻率閃爍
封裝好的初始化函數(shù)
void SystemClock_Init(void) {PMM_setVCore(PMM_CORE_LEVEL_3); //高主頻工作需要較高的核心電壓//XT1引腳復(fù)用GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN4);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN5);//起振XT1UCS_turnOnLFXT1(UCS_XT1_DRIVE_3,UCS_XCAP_3);//XT2引腳復(fù)用GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN2);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN3);//起振XT2UCS_turnOnXT2(UCS_XT2_DRIVE_4MHZ_8MHZ);//XT2作為FLL參考時鐘,先8分頻,再50倍頻 4MHz / 8 * 50 = 25MHzUCS_initClockSignal(UCS_FLLREF, UCS_XT2CLK_SELECT, UCS_CLOCK_DIVIDER_8);UCS_initFLLSettle(25000, 50);//XT1作為ACLK時鐘源 = 32768HzUCS_initClockSignal(UCS_ACLK, UCS_XT1CLK_SELECT, UCS_CLOCK_DIVIDER_1);//DCOCLK作為MCLK時鐘源 = 25MHzUCS_initClockSignal(UCS_MCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);//DCOCLK作為SMCLK時鐘源 = 25MHzUCS_initClockSignal(UCS_SMCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);//設(shè)置外部時鐘源的頻率,使得在調(diào)用UCS_getMCLK, UCS_getSMCLK 或 UCS_getACLK時可得到正確值UCS_setExternalClockSource(32768, 4000000); }總結(jié)
以上是生活随笔為你收集整理的MSP430F5529 DriverLib 库函数学习笔记(一)时钟配置和闪烁LED的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql5.7下载中文版_mysql5
- 下一篇: ffmpeg avformat_open