時(shí)鐘電路——數(shù)字振蕩器(DCO)
本文引用地址:http://butianyuan.cn/article/201611/316441.htm電路按信號(hào)形式可分為數(shù)字和模擬。
數(shù)字電路處理的是數(shù)字信號(hào)。數(shù)字電路又可分為組合邏輯電路與時(shí)序邏輯電路。時(shí)序電路可以完成組合電路的功能,反之則不成立。兩者的區(qū)別是時(shí)序電路與信號(hào)的時(shí)間有關(guān),即有一個(gè)時(shí)鐘信號(hào)。
在MSP430芯片中有3個(gè)時(shí)鐘源,內(nèi)部晶體振蕩器(DCO)、外部低速時(shí)鐘源(XT1)、外部高速時(shí)鐘源(XT2)。DCO的工作可以不要外部不要外部器件的支持,因此降低了電路的復(fù)雜程度,但是它是基于RC的工作原理,工作頻率不穩(wěn)定。XT1、XT2需要外接一個(gè)晶振,所以工作頻率穩(wěn)定。采用兩個(gè)外部晶振是讓一個(gè)工作在高頻一個(gè)工作在低頻,高頻晶體可以使程序執(zhí)行速度快,低速晶體使芯片功耗降低。
//程序名稱: Clock_DCO.C
//程序功能: 產(chǎn)生周期為 160 個(gè)系統(tǒng)時(shí)鐘周期的方波信號(hào),通過(guò)測(cè)量方波信號(hào)頻率獲得 DCO 時(shí)鐘頻率
#include 430x14x.h> //包含名稱定義和對(duì)應(yīng)地址或數(shù)據(jù)的頭函數(shù)
void int_clk(void); //聲明系統(tǒng)時(shí)鐘初始化函數(shù)
void delay(void); //聲明延時(shí)函數(shù)
int main(void) //主函數(shù)
{
int_clk( ); //系統(tǒng)時(shí)鐘初始化
WDTCTL=WDTPW+WDTHOLD; //關(guān)閉看門狗
//看門狗控制寄存器 WDTCTL 地址以及密碼位 WDTPW 內(nèi)容和
//使能位 WDTHOLD 內(nèi)容在頭函數(shù) MSP430x14x.h 定義
//WDTPW 內(nèi)容加 WDTHOLD 內(nèi)容向 WDTCTL 賦值
P3SEL=0x00; //設(shè)置 P3 端口為數(shù)字輸入 / 輸出口
P3DIR=0xff; //設(shè)置 P3 端口為輸出口
while(1) //重復(fù)執(zhí)行
{
//產(chǎn)生周期為 160 個(gè)系統(tǒng)時(shí)鐘周期的方波
P3OUT&=~BIT0; // P3.0 輸出低電平
delay( ); //延時(shí) 75 個(gè)系統(tǒng)時(shí)鐘周期,保持方波信號(hào)低電平
P3OUT|=BIT0; // P3.0 輸出高電平
delay( ); //延時(shí) 75 個(gè)系統(tǒng)時(shí)鐘周期,保持方波信號(hào)高電平
}
}
void delay(void) //延時(shí)函數(shù)
{
unsigned char i; //聲明實(shí)現(xiàn)延時(shí)的整型數(shù)據(jù)類型循環(huán)變量
for(i=0; i<10; i++) //利用循環(huán)實(shí)現(xiàn)延時(shí)調(diào)整
{
_NOP( ); //產(chǎn)生一個(gè)MSP430系統(tǒng)時(shí)鐘周期的延時(shí)
}
}
void int_clk(void) //系統(tǒng)時(shí)鐘初始化函數(shù)
{
unsigned char i; //聲明實(shí)現(xiàn)延時(shí)的循環(huán)變量
DCOCTL = 0x00; //設(shè)置數(shù)字控制振蕩器的工作頻率***
BCSCTL1 = 0x80; //關(guān)閉 XT2
//設(shè)置數(shù)字控制振蕩器的工作頻率***
BCSCTL2&=~DCOR; //選擇 MCLK 時(shí)鐘源為 DCOCLK,分頻比 1
//選擇 SMCLK 時(shí)鐘源為 DCOCLK,分頻比 1
//選擇芯片內(nèi)部 DCO 電阻
do
{
IFG1&=~OFIFG; //清除振蕩器錯(cuò)誤標(biāo)志
for(i=0; i<100; i++) //利用循環(huán)實(shí)現(xiàn)延時(shí)調(diào)整
{
_NOP( ); //產(chǎn)生一個(gè)MSP430系統(tǒng)時(shí)鐘周期的延時(shí)
}
}
while((IFG1 & OFIFG)!=0); //如果標(biāo)志為1,繼續(xù)等待
IFG1&=~OFIFG; //清除振蕩器錯(cuò)誤標(biāo)志
}
評(píng)論