sp3220.c
资源名称:msp430.rar [点击查看]
上传用户:xs588588
上传日期:2021-03-30
资源大小:242k
文件大小:4k
源码类别:
DSP编程
开发平台:
C/C++
- #include <msp430x14x.h>
- #include "sp3220.h"
- //定义串口操作变量
- // 串口 1 的接收标志
- char nRev_UART1;
- // 串口 1 的发送缓冲区
- char UART1_TX_BUF[60];
- // 串口 1 的接收缓冲区
- char UART1_RX_BUF[60];
- int nTX1_Len;
- char nRX1_Len;
- char nRX1_Len_temp;
- char nTX1_Flag;
- int nSend_TX1;
- void Init_UART1(void)
- {
- //将寄存器的内容清零
- U1CTL = 0X00;
- //数据位为8bit
- U1CTL += CHAR;
- //将寄存器的内容清零
- U1TCTL = 0X00;
- //波特率发生器选择SMCLK
- U1TCTL += SSEL1;
- //波特率为57600
- UBR0_1 = 0X8B;
- UBR1_1 = 0X00;
- //调整寄存器
- UMCTL_1 = 0X00;
- //使能UART1的TXD和RXD
- ME2 |= UTXE1 + URXE1;
- //使能UART1的RX中断
- IE2 |= URXIE1;
- //使能UART1的TX中断
- IE2 |= UTXIE1;
- //设置P3.6为UART1的TXD
- P3SEL |= BIT6;
- //设置P3.7为UART1的RXD
- P3SEL |= BIT7;
- //P3.6为输出管脚
- P3DIR |= BIT6;
- return;
- }
- void Init_Port(void)
- {
- //将所有的管脚在初始化的时候设置为输入方式
- P3DIR = 0;
- //将所有的管脚设置为一般I/O口
- P3SEL = 0;
- return;
- }
- void Init_CLK(void)
- {
- unsigned int i;
- //将寄存器的内容清零
- //XT2震荡器开启
- //LFTX1工作在低频模式
- //ACLK的分频因子为1
- BCSCTL1 = 0X00;
- do
- {
- IFG1 &= ~OFIFG; // 清除OSCFault标志
- for (i = 0x20; i > 0; i--);
- }
- while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1
- BCSCTL2 = 0X00; //将寄存器的内容清零
- BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1
- BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1
- }
- ///////////////////////////////////////
- // 处理来自串口 1 的接收中断
- interrupt [UART1RX_VECTOR] void UART1_RX_ISR(void)
- {
- UART1_RX_BUF[nRX1_Len_temp] = RXBUF1; //接收来自的数据
- nRX1_Len_temp += 1;
- if(UART1_RX_BUF[nRX1_Len_temp - 1] == 13)
- {
- nRX1_Len = nRX1_Len_temp;
- nRev_UART1 = 1;
- nRX1_Len_temp = 0;
- }
- }
- ///////////////////////////////////////
- // 处理来自串口 1 的发送中断
- interrupt [UART1TX_VECTOR] void UART1_TX_ISR(void)
- {
- if(nTX1_Len != 0)
- {
- nTX1_Flag = 0; // 表示缓冲区里的数据没有发送完
- TXBUF1 = UART1_TX_BUF[nSend_TX1];
- nSend_TX1 += 1;
- if(nSend_TX1 >= nTX1_Len)
- {
- nSend_TX1 = 0;
- nTX1_Len = 0;
- nTX1_Flag = 1;
- }
- }
- }
- void main(void)
- {
- int nRes_UART1;
- int nRes = 0;
- char UART1_RX_Temp[60];
- int i;
- int n;
- // 关闭看门狗
- WDTCTL = WDTPW + WDTHOLD;
- // 关闭中断
- _DINT();
- // 初始化时钟
- Init_CLK();
- // 初始化端口
- Init_Port();
- // 初始化串口1
- Init_UART1();
- // 打开中断
- _EINT();
- // 进入处理循环
- for(;;)
- {
- if(nRev_UART1 == 1)
- {
- nRev_UART1 = 0;
- // 将接收到的数据拷贝到临时缓冲区
- for(i = 0;i < nRX1_Len;i++)
- UART1_RX_Temp[i] = UART1_RX_BUF[i];
- nRes = ProcessCMD(UART1_RX_Temp,nRX1_Len);
- switch(nRes)
- {
- case 1:
- UART1_TX_BUF[0] = 'O';
- UART1_TX_BUF[1] = 'K';
- UART1_TX_BUF[2] = 13;
- nTX1_Len = 3;
- // 设置中断标志,进入发送中断程序
- IFG2 |= UTXIFG1;
- nRX1_Len = 0;
- break;
- case 2:
- for(n = 0;n < nRX1_Len;n++)
- UART1_TX_BUF[n] = UART1_RX_Temp[n];
- UART1_TX_BUF[nRX1_Len] = 'O';
- UART1_TX_BUF[nRX1_Len+1] = 'K';
- UART1_TX_BUF[nRX1_Len+2] = 13;
- nTX1_Len = nRX1_Len + 3;
- // 设置中断标志,进入发送中断程序
- IFG2 |= UTXIFG1;
- nRX1_Len = 0;
- break;
- case -1:
- UART1_TX_BUF[0] = 'E';
- UART1_TX_BUF[1] = 'R';
- UART1_TX_BUF[2] = 'R';
- UART1_TX_BUF[3] = 'O';
- UART1_TX_BUF[4] = 'R';
- UART1_TX_BUF[5] = 13;
- nTX1_Len = 6;
- // 设置中断标志,进入发送中断程序
- IFG2 |= UTXIFG1;
- nRX1_Len = 0;
- break;
- }
- }
- }
- }
- int ProcessCMD(char pBuf[],int nLen)
- {
- int nTemp = -1;
- int i;
- if(nLen <= 2) return -1;
- if (nLen == 5)
- {
- if((pBuf[0] == 'A') && (pBuf[1] == 'T')
- && (pBuf[2] == 'E') && (pBuf[3] == '0'))
- nTemp = 1;
- if((pBuf[0] == 'A') && (pBuf[1] == 'T')
- && (pBuf[2] == 'E') && (pBuf[3] == '1'))
- nTemp = 2;
- }
- return nTemp;
- }