打印
[MCU]

MSP430只能识别一次指令

[复制链接]
599|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
momolee|  楼主 | 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;
  }
  
}


使用特权

评论回复

相关帖子

沙发
zhangmangui| | 2019-9-25 22:00 | 只看该作者
是不是串口的外设时钟没打开啊?

使用特权

评论回复
板凳
ayb_ice| | 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;
        }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

2

帖子

0

粉丝