开发板一共有两个串口,分别为P4.4,P4.5和P3.3,P3.4
其中P4的串口是开发板上面用短接套套起来的那个,套上短接套进行相关以后就可以和电脑进行串口通信,也可以拆下短接套和其他外设或芯片进行串口通信。
不同频率第四步的配置的数据不同,其他配置应该没什么差别。
对于串口0的配置顺序也是这样的,只要把UCA后面的1改成0就行了。
注:截取的送药车代码,没测试过。
配置过程为:
1.特殊功能相关引脚
2.串口1功能配置寄存器(UCA1CTL1)中置位 UCSWRST 以进行接下来的配置,不置位不能正常配置串口。
3.功能配置寄存器选择时钟源。
4.根据用户手册配置UCA1BR0和UCA1BR1,以及UCA1MCTL寄存器中的相关位。
第1041页,选择对应的配置信息
5.选择校验位
6.选择数据位
7.选择停止位
8.复位UCA1CTL1中的UCSWRST位,以完成串口
9.打开中断,打开中断以后就可以触发接收或者发送中断。接收到数据的时候就会触发接收中断,这个时候可以在接收中断里处理接收到的数据。发送则需要先打开发送中断,然后写入相关数据,随后会触发发送中断把数据发送出去。
中断收发标志位应该会自动清零,所以无需关注
串口接收到的数据都放在UCA1RXBUF中
串口发送的数据都写入UCA1TXBUF中
在读取或者写入数据后,都会触发相应的中断以便将数据接收/发送出去。
例程.简易串口收发
#include <msp430.h>
void initClockTo16MHz()
{
UCSCTL3 |= SELREF_2; // Set DCO FLL reference = REFO
UCSCTL4 |= SELA_2; // Set ACLK = REFO
__bis_SR_register(SCG0); // Disable the FLL control loop
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
UCSCTL1 = DCORSEL_5; // Select DCO range 16MHz operation
UCSCTL2 = FLLD_0 + 487; // Set DCO Multiplier for 16MHz
// (N + 1) * FLLRef = Fdco
// (487 + 1) * 32768 = 16MHz
// Set FLL Div = fDCOCLK
__bic_SR_register(SCG0); // Enable the FLL control loop
// Worst-case settling time for the DCO when the DCO range bits have been
// changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx
// UG for optimization.
// 32 x 32 x 16 MHz / 32,768 Hz = 500000 = MCLK cycles for DCO to settle
__delay_cycles(500000);//
// Loop until XT1,XT2 & DCO fault flag is cleared
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
}
void UART_Init( char Parity, char DataBits, char StopBits)
{
P4SEL = BIT4 + BIT5; // P4.4,5 = USCI_A0 TXD/RXD
UCA1CTL1 |= UCSWRST; // **Put state machine in reset**
UCA1CTL1 |= UCSSEL_2; // SMCLK 25mhz
UCA1BR0 = 8; // 16MHz 115200 (see User's Guide)
UCA1BR1 = 0; // 16MHz 115200
UCA1MCTL = UCBRS_0 + UCBRF_11 + UCOS16; // Modln UCBRSx=0, UCBRFx=0,
//------------------------------设置校验位------------------------------
switch (Parity)
{
case 'n':
case 'N':
UCA1CTL0 &= ~UCPEN;
break; //无校验
case 'p':
case 'P':
UCA1CTL0 |= UCPEN + UCPAR;
break; //偶校验
case 'o':
case 'O':
UCA1CTL0 |= UCPEN;
break; //奇校验
//default: return (0); //参数错误
}
//------------------------------设置数据位------------------------------
switch (DataBits)
{
case 7:
case '7':
UCA1CTL0 |= UC7BIT;
break; //7位数据位
case 8:
case '8':
UCA1CTL0 &= ~UC7BIT;
break; //8位数据位
//default: return (0); //参数错误
}
//------------------------------设置停止位------------------------------
switch (StopBits)
{
case 1:
case '1':
UCA1CTL0 &= ~UCSPB;
break; //1位停止位
case 2:
case '2':
UCA1CTL0 |= UCSPB;
break; //2位停止位
//default: return (0); //参数错误
}
// over sampling
UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA1IE |= UCRXIE; //接收中断
}
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
initClockTo16MHz(); //配置系统时钟为16Mhz,不配置串口不能正确收发
UART_Init('n',8,1);
_EINT();//开启总中断
while(1){
}
}
#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{
switch (__even_in_range(UCA1IV, 4))
{
case 0:
break; // Vector 0 - no interrupt
case 2: // Vector 2 - RXIFG
if (UCA1RXBUF == 'a'){
UCA1IE |= UCTXIE; //开启发送中断
UCA1TXBUF='a'; //如果收到一个a,就发回去一个a
}
break;
case 4: // Vector 4 - TXIFG
break;
default:
break;
}
}