[资料分享] MSP430F5299时钟设置(24M)和计数器A使用

fish001   2017-10-15 16:24 楼主
///////////////24MHZ时钟设置//////////////////////////////////////////////////////////////
  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;                            //计数最大值设置
   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
}
// Timer1 interrupt service routine
#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; //转换数据存在12位ADC12MEM0寄存器中
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
对于定时器Timer,与以往430系列的TimerA模块基本没什么差别,需要注意的是
         TACCR0是一个独立的中断源,对于的中断服务函数是TIMERA0_VECTOR
          TACCR1\TACCR2\TA是共用一个中断源,对于的中断标志在TAIV寄存器中,对于的中断服务函数是TIMERA1_VECTOR,需要在中断服务函数里判断是哪个触发源。具体方式如下:
#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计数是在TA0R而不是TACCR0中,TACCR0在整个计数过程中是不变的,定时器A有一个比较模式,就是把变化的TA0R不断的与TACCR0进行比较,相等就产生中断。

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复