?? autouart.c
字號:
#include <msp430x14x.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;
char nTime_Flag;
int nSend_TX1;
char GetChar(void);
typedef enum
{ BAUD115200, BAUD57600,BAUD38400, BAUD19200,
BAUD14400, BAUD9600, BAUD4800, BAUD2400,
BAUD1200
} baudrates;
typedef struct {
char ubr00;
char ubr01;
char umctl0;
char *desc;
} baudreg;
// 串口寄存器的值 (UBR0_1, UBR1_1, UMCTL_1, Descr)
const baudreg baudregs[] =
{
0x45, 0x00, 0x00, "115200", // BAUD115K
0x8b, 0x00, 0x00, "57600", // BAUD57600
0xd0, 0x00, 0x00, "38400", // BAUD38400
0xa0, 0x01, 0x00, "19200", // BAUD19200
0x2c, 0x02, 0x00, "14400", // BAUD14400
0x41, 0x03, 0x00, "9600", // BAUD9600
0x83, 0x06, 0x00, "4800", // BAUD4800
0x05, 0x0d, 0x00, "2400", // BAUD2400
0x0b, 0x1a, 0x00, "1200" // BAUD1200
};
void SetBaud(int baud);
void Delay_8_33ms(void);
void Init_UART1(void);
void Init_CLK(void);
void Init_TimerA(void);
void Init_UART1(void)
{
//將寄存器的內容清零
U1CTL = 0X00;
//數據位為8bit
U1CTL += CHAR;
//將寄存器的內容清零
U1TCTL = 0X00;
//波特率發生器選擇SMCLK
U1TCTL += SSEL1;
//波特率為115200
UBR0_1 = 0X45;
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_TimerA(void)
{
// 選擇SMCLK,清除TAR
TACTL = TASSEL1 + TACLR;
// 1/8 SMCLK
TACTL += ID1;
TACTL += ID0;
// CCR0 中斷允許
CCTL0 = CCIE;
// 時間間隔為 33.8ms
CCR0 = 33800;
// 增記數模式
TACTL |= MC0;
}
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;
}
}
}
// 定時器中斷
interrupt [TIMERA0_VECTOR] void TimerA_ISR(void)
{
nTime_Flag = 1;
// CCR0 不中斷允許
CCTL0 &= ~CCIE;
}
void SetBaud(int baud)
{
//停止UART
U1CTL |= SWRST;
//禁止中斷
ME2 &= ~(UTXE0 + URXE0);
//設置寄存器
UBR0_1 = baudregs[baud].ubr00;
UBR1_1 = baudregs[baud].ubr01;
UMCTL_1 = baudregs[baud].umctl0;
//使能中斷
ME2 |= UTXE0 + URXE0;
//UART模塊允許
U1CTL &= ~SWRST;
}
int AutoBaud(void)
{
baudrates rate;
//UART復位
U1CTL |= SWRST;
//接收出錯中斷允許位
URCTL1 = URXEIE;
//UART模塊允許
U1CTL &= ~SWRST;
//設置速率位115200
SetBaud(BAUD115200);
//接收字符
switch (GetChar())
{
case 0x0d :
rate = BAUD115200;
break;
case 0xe6 :
rate = BAUD57600;
break;
case 0x1c :
rate = BAUD38400;
break;
case 0xe0 :
rate = BAUD19200;
break;
case 0x80 :
rate = BAUD14400;
break;
case 0x00 :
{
// CCR0 中斷允許
CCTL0 = CCIE;
//延時33.8ms
while(1)
{
if(nTime_Flag == 1)
{
nTime_Flag = 0;
break;
}
}
//設置速率位9600
SetBaud(BAUD9600);
//接收字符
switch (GetChar())
{
case 0x0d :
rate = BAUD9600;
break;
case 0xe6 :
rate = BAUD4800;
break;
case 0x78 :
rate = BAUD2400;
break;
case 0x80 :
rate = BAUD1200;
break;
default :
return -1;
}
break;
}
default :
return -1;
}
// CCR0 中斷允許
CCTL0 = CCIE;
//延時33.8ms
while(1)
{
if(nTime_Flag == 1)
{
nTime_Flag = 0;
break;
}
}
SetBaud(rate);
return 0;
}
char GetChar(void)
{
while (!(IFG2 & URXIFG1));
return RXBUF1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -