<th id="alkcr"><pre id="alkcr"></pre></th>

  • 打印

    [MCU] MSP430只能識別一次指令

    [復制鏈接]
    205|2
    跳轉到指定樓層
    樓主
     樓主 | 2019-9-25 15:30 | 只看該作者 ||退出氣泡模式 回帖獎勵 |倒序瀏覽 |閱讀模式
    通過串口給430發送指令,識別不同的指令,點亮不同的燈,每次上電就能識別第一個指令,后面的指令都顯示錯誤,不知道什么原因。
    是通過PC的串口調試助手,發送指令的。第一個指令能識別,后面的都識別出來提示錯誤。
    有熟悉430的幫忙看看,以下是代碼,第一次用430,還不太熟悉。

    #include  <msp430x14x.h>

    //定義串口操作變量
    // 串口 1 的接收標志
    char nRev_UART0;                       
    // 串口 1 的接收緩沖區       
    char UART0_RX_BUF[20];               
    char nRX0_Len;
    char nRX0_Len_temp;


    int ProcessCMD(char pBuf[],int nLen)
    {
        int nTemp = -1;
       
        if(nLen <= 2) return -1;
       
            if (nLen == 6)
            {
                    if((pBuf[0] == 'M') && (pBuf[1] == 'O')
                            && (pBuf[2] == 'D') && (pBuf[3] == 'E')
                            && (pBuf[4] == '1'))
                            nTemp = 1;
                    if((pBuf[0] == 'M') && (pBuf[1] == 'O')
                            && (pBuf[2] == 'D') && (pBuf[3] == 'E')
                            && (pBuf[4] == '2'))
                            nTemp = 2;
                    if((pBuf[0] == 'M') && (pBuf[1] == 'O')
                            && (pBuf[2] == 'D') && (pBuf[3] == 'E')
                            && (pBuf[4] == '3'))
                            nTemp = 3;
                    if((pBuf[0] == 'M') && (pBuf[1] == 'O')
                            && (pBuf[2] == 'D') && (pBuf[3] == 'E')
                            && (pBuf[4] == '4'))
                            nTemp = 4;
                    if((pBuf[0] == 'C') && (pBuf[1] == 'L')
                            && (pBuf[2] == 'O') && (pBuf[3] == 'S')
                            && (pBuf[4] == 'E'))
                            nTemp = 5;
            }
            
            
            if (nLen == 5)
            {
                    if((pBuf[0] == 'O') && (pBuf[1] == 'P')
                            && (pBuf[2] == 'E') && (pBuf[3] == 'N'))
                            nTemp = 6;
            }
       
        return nTemp;
    }

    /********************主函數********************/
    void main(void)
    {
        char UART0_RX_Temp[20];   
        int i;
        int nRes = 0;
    /*下面六行程序關閉所有的IO口*/
        P1DIR = 0XFF;P1OUT = 0XFF;
        P2DIR = 0XFF;P2OUT = 0XFF;
        P3DIR = 0XFF;P3OUT = 0XFF;
        P4DIR = 0XFF;P4OUT = 0XFF;
        P5DIR = 0XFF;P5OUT = 0XFF;
        P6DIR = 0XFF;P6OUT = 0XFF;
       
        WDTCTL = WDTPW + WDTHOLD;                 // 關閉看門狗
        P6DIR |= BIT2;P6OUT |= BIT2;              //關閉電平轉換
       
        P3SEL |= 0x30;                            // 選擇P3.4和P3.5做UART通信端口
        ME1 |= UTXE0 + URXE0;                     // 使能USART0的發送和接受
        UCTL0 |= CHAR;                            // 選擇8位字符
        UTCTL0 |= SSEL0;                          // UCLK = ACLK
        UBR00 = 0x03;                             // 波特率9600
        UBR10 = 0x00;                             //
        UMCTL0 = 0x4A;                            // Modulation
        UCTL0 &= ~SWRST;                          // 初始化UART狀態機
        IE1 |= URXIE0;                            // 使能USART0的接收中斷

        while(1)
        {
            _EINT();                               //打開全局中斷
            LPM1;                                  //進入LPM1模式

            if(nRev_UART0 == 1)
                {
                    nRev_UART0 = 0;
                            // 將接收到的數據拷貝到臨時緩沖區
                            for(i = 0;i < nRX0_Len;i++)
                                    UART0_RX_Temp[i] = UART0_RX_BUF[i];
                            nRes = ProcessCMD(UART0_RX_Temp,nRX0_Len);
                            switch(nRes)
                            {
                            case 1:
                                    P3OUT = 0X1;
                                    nRX0_Len = 0;
                                    break;
                            case 2:
                                    P3OUT = 0X2;
                                    nRX0_Len = 0;
                                    break;
                            case 3:               
                                    P3OUT = 0X4;
                                    nRX0_Len = 0;
                                    break;
                            case 4:               
                                    P3OUT = 0X8;
                                    nRX0_Len = 0;
                                    break;
                            case 5:               
                                    P3OUT = 0X10;
                                    nRX0_Len = 0;
                                    break;
                            case 6:               
                                    P3OUT = 0X40;
                                    nRX0_Len = 0;
                                    break;
                            case -1:

                                    nRX0_Len = 0;
                                    break;
                            }

            }
        }
    }
    /*******************************************
    函數名稱:UART0_RXISR
    功    能:UART0的接收中斷服務函數,在這里喚醒
              CPU,使它退出低功耗模式
    參    數:無
    返回值  :無
    ********************************************/
    #pragma vector = UART0RX_VECTOR
    __interrupt void UART0_RXISR(void)
    {

      LPM1_EXIT;                 //退出低功耗模式
      
      UART0_RX_BUF[nRX0_Len_temp] = RXBUF0;        //接收來自的數據
       
      nRX0_Len_temp += 1;
            
      if(UART0_RX_BUF[nRX0_Len_temp - 1] == 13)
      {
        nRX0_Len = nRX0_Len_temp;
        nRev_UART0 = 1;
        nRX0_Len_temp = 0;
      }
      
    }


    使用特權

    評論回復
    沙發
    | 2019-9-25 22:00 | 只看該作者
    是不是串口的外設時鐘沒打開啊?

    使用特權

    評論回復
    板凳
    | 2019-9-30 10:15 | 只看該作者

    /********************主函數********************/
    void main(void)
    {
        char UART0_RX_Temp[20];   
        int i;
        int nRes = 0;
    /*下面六行程序關閉所有的IO口*/
        P1DIR = 0XFF;P1OUT = 0XFF;
        P2DIR = 0XFF;P2OUT = 0XFF;
        P3DIR = 0XFF;P3OUT = 0XFF;
        P4DIR = 0XFF;P4OUT = 0XFF;
        P5DIR = 0XFF;P5OUT = 0XFF;
        P6DIR = 0XFF;P6OUT = 0XFF;
       
        WDTCTL = WDTPW + WDTHOLD;                 // 關閉看門狗
        P6DIR |= BIT2;P6OUT |= BIT2;              //關閉電平轉換
       
        P3SEL |= 0x30;                            // 選擇P3.4和P3.5做UART通信端口
        ME1 |= UTXE0 + URXE0;                     // 使能USART0的發送和接受
        UCTL0 |= CHAR;                            // 選擇8位字符
        UTCTL0 |= SSEL0;                          // UCLK = ACLK
        UBR00 = 0x03;                             // 波特率9600
        UBR10 = 0x00;                             //
        UMCTL0 = 0x4A;                            // Modulation
        UCTL0 &= ~SWRST;                          // 初始化UART狀態機
        IE1 |= URXIE0;                            // 使能USART0的接收中斷
            _EINT();                               //打開全局中斷

            while(1)
            {
                    if (!bRxok)
                    {
                            LPM1;                          //進入LPM1模式
                    }
                    else
                    {
                            ProcessCMD(UART0_RX_BUF,nRX0_Len_temp);
                            nRX0_Len_temp = 0;
                            bRxok = 0;
                    }
            }
    }

    bit bRxOk = 0;
    /*******************************************
    函數名稱:UART0_RXISR
    功    能:UART0的接收中斷服務函數,在這里喚醒
              CPU,使它退出低功耗模式
    參    數:無
    返回值  :無
    ********************************************/
    #pragma vector = UART0RX_VECTOR
    __interrupt void UART0_RXISR(void)
    {

            LPM1_EXIT;                 //退出低功耗模式

            u8 ucTmm = RXBUF0;
            if (!bRxOk && nRX0_Len_temp < sizeof(UART0_RX_BUF))
            {
                    UART0_RX_BUF[nRX0_Len_temp++] = ucTmm;        //接收來自的數據
            }
            if (ucTmm == '\x0d')
            {
                    bRxOk = 1;
            }
    }

    使用特權

    評論回復
    掃描二維碼,隨時隨地手機跟帖
    您需要登錄后才可以回帖 登錄 | 注冊

    本版積分規則

    我要發帖 投訴建議 創建版塊 申請版主

    快速回復

    您需要登錄后才可以回帖
    登錄 | 注冊
    高級模式

    論壇熱帖

    在線客服 快速回復 返回頂部 返回列表
    成人短片线上看