查看: 2380|回复: 0

[资料] MSP430G2231定时器A模拟串口源码

[复制链接]
  • TA的每日心情
    奋斗
    2020-9-28 10:10
  • 签到天数: 1018 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2012-8-24 11:00:30 | 显示全部楼层 |阅读模式
    分享到:
    unsigned char timerA_UART_mode = 0;
    unsigned int txData;
    //------------------------------------------------------------------------------
    // Function configures Timer_A for full-duplex UART operation
    //------------------------------------------------------------------------------
    void TimerA_UART_init(void)
    {
      DCOCTL = 0x00;                          // Set DCOCLK to 1MHz
      BCSCTL1 = CALBC1_1MHZ;
      DCOCTL = CALDCO_1MHZ;
      BCSCTL2 &= ~DIVS_3;                     // SMCLK = 1MHz  
      
      //P1SEL |= UART_TXD + UART_RXD;            // Timer function for TXD/RXD pins
      P1SEL |= UART_TXD ;
      P1DIR |= UART_TXD;                        // TXD
      //P1DIR &= ~UART_RXD;
      
      TACCTL0 = OUT;                          // Set TXD Idle as Mark = '1'
      // TACCTL1 = SCS + CM1 + CAP + CCIE;       // Sync, Neg Edge, Capture, Int
      TACTL |= TACLR;                           // SMCLK, start in continuous mode  
      TACTL = TASSEL_2 + MC_2;                // SMCLK, start in continuous mode
      timerA_UART_mode = 1;
    }
    //------------------------------------------------------------------------------
    // Function unconfigures Timer_A for full-duplex UART operation
    //------------------------------------------------------------------------------
    void TimerA_UART_shutdown(void)
    {
      timerA_UART_mode = 0;
    // P1SEL &= ~(UART_TXD + UART_RXD);            // Timer function for TXD/RXD pins
      P1SEL &= ~(UART_TXD );            // Timer function for TXD/RXD pins  
      TACCTL1 &= ~CCIE;                           // Sync, Neg Edge, Capture, Int
      TACTL &= ~MC_3;                             // Clear TA modes --> Stop Timer Module
      P1OUT &= ~UART_TXD;
    }
    //------------------------------------------------------------------------------
    // Outputs one byte using the Timer_A UART
    //------------------------------------------------------------------------------
    void TimerA_UART_tx(unsigned char byte)
    {
        while (TACCTL0 & CCIE);                 // Ensure last char got TX'd
        TACCR0 = TAR;                           // Current state of TA counter
        TACCR0 += UART_TBIT;                    // One bit time till first bit
        txData = byte;                          // Load global variable
        txData |= 0x100;                        // Add mark stop bit to TXData   
        txData <<= 1;                           // Add space start bit
       
       
        TACCTL0 = OUTMOD0 + CCIE;               // Set TXD on EQU2 (idle), Int
        __bis_SR_register( LPM0_bits + GIE);
    }
    //------------------------------------------------------------------------------
    // Prints a string over using the Timer_A UART
    //------------------------------------------------------------------------------
    void TimerA_UART_print(char *string)
    {
        while (*string) {
            TimerA_UART_tx(*string++);
        }
    }
    //------------------------------------------------------------------------------
    // Timer_A UART - Transmit Interrupt Handler
    //------------------------------------------------------------------------------
    #pragma vector = TIMER0_A0_VECTOR
    __interrupt void Timer_A0_ISR(void)
    {
        static unsigned char txBitCnt = 10;
        if (!timerA_UART_mode)
          __bic_SR_register_on_exit(LPM3_bits+GIE)     
            ;
        else
        {
          TACCR0 += UART_TBIT;                    // Add Offset to CCRx
          if (--txBitCnt == 0)                    // All bits TXed?
          {                    
              TACCTL0 &= ~CCIE;                   // All bits TXed, disable interrupt
              txBitCnt = 10;
              __bic_SR_register_on_exit(LPM0_bits+GIE)
              ;
          }
          else {
              if (txData & 0x01) {
                TACCTL0 &= ~OUTMOD2; // TX Mark '1'
              }
              else {
                TACCTL0 |= OUTMOD2;               // TX Space'0'
              }
              txData >>= 1;
             
          }
        }
    }
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-5-20 13:43 , Processed in 0.101232 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.