<wbr id="9qp22"><legend id="9qp22"><rt id="9qp22"></rt></legend></wbr>
<th id="9qp22"><noframes id="9qp22"><form id="9qp22"></form></noframes></th>

      <dd id="9qp22"><big id="9qp22"><video id="9qp22"></video></big></dd>
      <th id="9qp22"></th>
        <rp id="9qp22"><acronym id="9qp22"></acronym></rp>
        <dd id="9qp22"><pre id="9qp22"></pre></dd>

        1. <dd id="9qp22"><pre id="9qp22"></pre></dd>
          1. 打印

            [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;
                    }
            }

            使用特權

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

            本版積分規則

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

            快速回復

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

            論壇熱帖

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