新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > MSP430G2553測試程序(串口程序,定時器模式)

        MSP430G2553測試程序(串口程序,定時器模式)

        作者: 時間:2016-11-28 來源:網(wǎng)絡 收藏
        //

        //
        //MSP430G2xx3
        //-----------------
        ///||XIN|-
        //| ||
        //--|RSTXOUT|-
        //||
        //|CCI0B/TXD/P1.1|-------->
        //|| 9600 8N1
        //|CCI0A/RXD/P1.2|<--------
        // Built withIAR Embedded Workbench Version: 5.40

        本文引用地址:http://www.104case.com/article/201611/322874.htm

        //串口調試助手,下載地址:http://www.sudt.com/download/AccessPort137.zip
        //******************************************************************************

        #include "msp430g2553.h"

        //------------------------------------------------------------------------------
        // Hardware-related definitions
        //------------------------------------------------------------------------------
        #define UART_TXD0x02// TXD on P1.1 (Timer0_A.OUT0)
        #define UART_RXD0x04// RXD on P1.2 (Timer0_A.CCI1A)

        //------------------------------------------------------------------------------
        // Conditions for 9600 Baud SW UART, SMCLK = 1MHz,設置波特率,僅僅修改下面一下數(shù)據(jù)即可,如9600,2400
        //9600,2400工作穩(wěn)定。波特率不宜太高。
        //------------------------------------------------------------------------------
        #define UART_TBIT_DIV_2(1000000 / (9600 * 2))
        #define UART_TBIT(1000000 / 9600)

        //------------------------------------------------------------------------------
        // Global variables used for full-duplex UART communication
        //------------------------------------------------------------------------------
        unsigned int txData;// UART internal variable for TX
        unsigned char rxBuffer;// Received UART character

        //------------------------------------------------------------------------------
        // Function prototypes
        //------------------------------------------------------------------------------
        void TimerA_UART_init(void);
        void TimerA_UART_tx(unsigned char byte);
        void TimerA_UART_print(char *string);

        //------------------------------------------------------------------------------
        // main()
        //------------------------------------------------------------------------------
        void main(void)
        {
        WDTCTL = WDTPW + WDTHOLD;// Stop watchdog timer

        DCOCTL = 0x00;// Set DCOCLK to 1MHz
        BCSCTL1 = CALBC1_1MHZ;
        DCOCTL = CALDCO_1MHZ;

        P1OUT = 0x00;// Initialize all GPIO
        P1SEL = UART_TXD + UART_RXD;// Timer function for TXD/RXD pins
        P1DIR = 0xFF & ~UART_RXD;// Set all pins but RXD to output
        P2OUT = 0x00;
        P2SEL = 0x00;
        P2DIR = 0xFF;

        __enable_interrupt();

        TimerA_UART_init();// Start Timer_A UART
        TimerA_UART_print("G2553 TimerA UART");
        TimerA_UART_print("READY.Echo Input,and Monitor.");

        for (;;)
        {
        // Wait for incoming character
        __bis_SR_register(LPM0_bits);

        // Update board outputs according to received byte,根據(jù)接收到的數(shù)據(jù)點亮發(fā)光管
        //建議16進制,例如01H P1.0亮 11H P1.0 1.6亮
        if (rxBuffer & 0x01) P1OUT |= 0x01; else P1OUT &= ~0x01;// P1.0
        if (rxBuffer & 0x02) P1OUT |= 0x08; else P1OUT &= ~0x08;// P1.3
        if (rxBuffer & 0x04) P1OUT |= 0x10; else P1OUT &= ~0x10;// P1.4
        if (rxBuffer & 0x08) P1OUT |= 0x20; else P1OUT &= ~0x20;// P1.5
        if (rxBuffer & 0x10) P1OUT |= 0x40; else P1OUT &= ~0x40;// P1.6
        if (rxBuffer & 0x20) P1OUT |= 0x80; else P1OUT &= ~0x80;// P1.7
        if (rxBuffer & 0x40) P2OUT |= 0x40; else P2OUT &= ~0x40;// P2.6
        if (rxBuffer & 0x80) P2OUT |= 0x80; else P2OUT &= ~0x80;// P2.7
        // Echo received character,回傳發(fā)送的數(shù)據(jù)
        TimerA_UART_tx(rxBuffer);//
        }
        }
        //------------------------------------------------------------------------------
        // Function configures Timer_A for full-duplex UART operation
        //------------------------------------------------------------------------------
        void TimerA_UART_init(void)
        {
        TACCTL0 = OUT;// Set TXD Idle as Mark = 1
        TACCTL1 = SCS + CM1 + CAP + CCIE;// Sync, Neg Edge, Capture, Int
        TACTL = TASSEL_2 + MC_2;// SMCLK, start in continuous mode
        }
        //------------------------------------------------------------------------------
        // Outputs one byte using the Timer_A UART
        //------------------------------------------------------------------------------
        void TimerA_UART_tx(unsigned char byte)
        {
        while (TACCTL0 & CCIE);// Ensure last char got TXd
        TACCR0 = TAR;// Current state of TA counter
        TACCR0 += UART_TBIT;// One bit time till first bit
        TACCTL0 = OUTMOD0 + CCIE;// Set TXD on EQU0, Int
        txData = byte;// Load global variable,要發(fā)送的數(shù)據(jù)
        txData |= 0x100;// Add mark stop bit to TXData
        txData <<= 1;// Add space start bit
        }

        //------------------------------------------------------------------------------
        // 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;

        TACCR0 += UART_TBIT;// Add Offset to CCRx
        if (txBitCnt == 0) {// All bits TXed?
        TACCTL0 &= ~CCIE;// All bits TXed, disable interrupt
        txBitCnt = 10;// Re-load bit counter
        }
        else {
        if (txData & 0x01) {
        TACCTL0 &= ~OUTMOD2;// TX Mark 1
        }
        else {
        TACCTL0 |= OUTMOD2;// TX Space 0
        }
        txData >>= 1;
        txBitCnt--;
        }
        }
        //------------------------------------------------------------------------------
        // Timer_A UART - Receive Interrupt Handler
        //------------------------------------------------------------------------------
        #pragma vector = TIMER0_A1_VECTOR
        __interrupt void Timer_A1_ISR(void)
        {
        static unsigned char rxBitCnt = 8;
        static unsigned char rxData = 0;

        switch (__even_in_range(TA0IV, TA0IV_TAIFG)) { // Use calculated branching
        case TA0IV_TACCR1:// TACCR1 CCIFG - UART RX
        TACCR1 += UART_TBIT;// Add Offset to CCRx
        if (TACCTL1 & CAP) {// Capture mode = start bit edge
        TACCTL1 &= ~CAP;// Switch capture to compare mode
        TACCR1 += UART_TBIT_DIV_2;// Point CCRx to middle of D0
        }
        else {
        rxData >>= 1;
        if (TACCTL1 & SCCI) {// Get bit waiting in receive latch
        rxData |= 0x80;
        }
        rxBitCnt--;
        if (rxBitCnt == 0) {// All bits RXed?
        rxBuffer = rxData;// Store in global variable
        rxBitCnt = 8;// Re-load bit counter
        TACCTL1 |= CAP;// Switch compare to capture mode
        __bic_SR_register_on_exit(LPM0_bits);// Clear LPM0 bits from 0(SR)
        }
        }
        break;
        }
        }



        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 资中县| 巨野县| 内黄县| 威信县| 玉环县| 阿坝| 长岛县| 英吉沙县| 诏安县| 龙川县| 精河县| 白山市| 邢台市| 克东县| 嘉善县| 阿瓦提县| 松桃| 镇坪县| 驻马店市| 黎平县| 湘潭市| 东安县| 上栗县| 隆德县| 遂川县| 房产| 紫云| 临清市| 交城县| 张家川| 南康市| 长顺县| 固阳县| 西华县| 巢湖市| 西安市| 河西区| 左权县| 昔阳县| 呼伦贝尔市| 阳新县|