<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        MSP430F5299時鐘設置(24M)和計數器A使用

        作者:未知   來源:不詳   點擊數:  更新時間:2014年08月31日   【字體:

        ///////////////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進行比較,相等就產生中斷。
        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮