?? sp3220.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;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -