///////////////24MHZ時(shí)鐘設(shè)置//////////////////////////////////////////////////////////////
UCSCTL3 |=SELREF__REFOCLK;
__bis_SR_register(SCG0); //disable the FLL control loop
UCSCTL0=0X0000;// //Set lowest possible DCOx,MODxSCG0
UCSCTL1=DCORSEL_7; //Select DCO range 24MHz opreation
//DCORSEL_x,其中x可選3、4、5、6、7
UCSCTL3=FLLD_0+731; //Set DCO Multiplier for 24MHz
//(N+1)*FLLRef=Fdco
//(731+1)*32768=24MHz
//Set FLL DIV =fDCOCLK/2
/*__bis_SR_register(SCG0); //Enable the FLL control loopSCG0
UCSCTL4 |=SELA__DCOCLK+SELS__XT1CLK+SELM__DCOCLK;//MCLK Source select
UCSCTL5 |=DIVPA_2; //ACLK output divide
UCSCTL6 |=XT1DRIVE_3+XCAP_0; //XT1 cap */
//////////////////////////////////////////////////////////////////////////////////////////////////
#include "msp430F5529.h"
int tt=0,temp,kk;
void delay(int ns)
{
while(ns--);
}
void adc1()
{
P1SEL |=BIT6;
ADC12CTL0 =ADC12ON + ADC12SHT0_8 + ADC12MSC;
ADC12CTL1 =ADC12SHP + ADC12CONSEQ_2;
ADC12MCTL0=ADC12SREF_0+ADC12INCH_6;
ADC12CTL0 |=ADC12ENC;
}
void MclkFre(void)
{
UCSCTL3 |=SELREF__REFOCLK;
__bis_SR_register(SCG0); //disable the FLL control loop
UCSCTL0=0X0000;// //Set lowest possible DCOx,MODxSCG0
UCSCTL1=DCORSEL_7; //Select DCO range 24MHz opreation
//DCORSEL_x,其中x可選3、4、5、6、7
UCSCTL3=FLLD_0+731; //Set DCO Multiplier for 24MHz
//(N+1)*FLLRef=Fdco
//(731+1)*32768=24MHz
//Set FLL DIV =fDCOCLK/2
/*__bis_SR_register(SCG0); //Enable the FLL control loopSCG0
UCSCTL4 |=SELA__DCOCLK+SELS__XT1CLK+SELM__DCOCLK;//MCLK Source select
UCSCTL5 |=DIVPA_2; //ACLK output divide
UCSCTL6 |=XT1DRIVE_3+XCAP_0; //XT1 cap */
}
void TimerA(void)
{
P1DIR |= 0x01; // P1.0 output
TA1CCTL0 = CCIE; // CCR0 interrupt enabled
TA1CCR0 = 100; //計(jì)數(shù)最大值設(shè)置
TA1CTL = TASSEL_2 + MC_2 + TACLR; // SMCLK, contmode, clear TAR
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
MclkFre();
TimerA();
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0, enable interrupts
__no_operation(); // For debugger
}
#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR(void)
{
if(kk==50)
{
kk=0;
P1OUT ^= 0x01;// Toggle P1.0
}
else kk++;
TA1CCR0 += 10000; // 重裝
}
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR(void)
{
tt=ADC12MEM0; //轉(zhuǎn)換數(shù)據(jù)存在12位ADC12MEM0寄存器中
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
對(duì)于定時(shí)器Timer,與以往430系列的TimerA模塊基本沒什么差別,需要注意的是
TACCR0是一個(gè)獨(dú)立的中斷源,對(duì)于的中斷服務(wù)函數(shù)是TIMERA0_VECTOR
TACCR1\TACCR2\TA是共用一個(gè)中斷源,對(duì)于的中斷標(biāo)志在TAIV寄存器中,對(duì)于的中斷服務(wù)函數(shù)是TIMERA1_VECTOR,需要在中斷服務(wù)函數(shù)里判斷是哪個(gè)觸發(fā)源。具體方式如下:
#pragma vector = TIMERA1_VECTOR
__interrupt void T IMERA1_ISR(void)
{
switch(__even_in_range(TAIV,10))
{
case 2 : // TACCR1 CCIFG
P1OUT ^= 0x04 ;break;
case 4 : // TACCR2 CCIFG
P1OUT ^= 0x02 ;break;
case 10 : // TAIFG
P1OUT ^= 0x01 ;break;
}
}
在5529中,A計(jì)數(shù)是在TA0R而不是TACCR0中,TACCR0在整個(gè)計(jì)數(shù)過(guò)程中是不變的,定時(shí)器A有一個(gè)比較模式,就是把變化的TA0R不斷的與TACCR0進(jìn)行比較,相等就產(chǎn)生中斷。