串口,作为嵌入式系统最为熟悉的通信与调试方式。数据线少(一般只需要2根)、通信速度快、便于观察等是串口的特点,下面简要介绍一下msp430单片机串行接口之uart方式。
工具/原料
方法/步骤
1查阅msp430x2xx系列单片机说明书,可以知道msp430集成了Universal serial interface(USI)接口,具有3种工作方式:I2C、SPI、UART方式,本文先讲述UART模式,其余模式有机会的话后续讲解。
2UART简介关于UART的理论与科普之类的基础知识在这里略过,只讲述一般实际应用时需要的关注点:波特率、停止位、数据位数、流控制、奇偶校验等。一般常见的波特率有4800、9600、14400、19200、115200等;而停止位可以选择1位、1.5位或是2位;数据位数常见为7位或是8位;可以开启或关闭流控制,一般不使用流控制;奇偶校验则有奇校验、偶校验或是无校验方式。
3引脚复用为UART模式msp430引脚多具有功能复用功能,在使用UART模式时,需要先设置对应引脚复用为UART模式,比如对于msp430g2553芯片,P1.1=RXD, P1.2=TXD,所以需要如下指令:P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXDP1SEL2 = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
4UART模块时钟选择msp430时钟系统十分强大,资源丰富。UART模块通信时,需要时钟输入。如下图所示,有3种时钟供UART选择:UCLKI、ACLK、SMCLK。其中UCLKI是外部引脚输入时钟,ACLK是辅助时钟,可以为芯片内部VLO或者是外部32.768 KHz晶振,SMCLK是系统子时钟。UxTCTL寄存器中SSELx选择时钟源。
5UxBR0\UxBR1寄存器UxBR0与UxBR1是2个8位的寄存器,合起来组成UxBR 16位寄存器,只要用于设置UART通信速率,如下图所示:
6UxMCTL寄存器UxMCTL主要是用于矫正波特率,使得通信速率更加准确。
7UxCTL寄存器该寄存器中许多位用于配置UART工作方式,其中第一位用于是否具有软件复位UART功能,一般需要关闭该功能,也就是复位。
8IEx寄存器通过IEx使能UART中断,比如置位IE2中UCA0RXIE使能UCA0模块串口接收中断。在配置完之后,置位GIE开启系统中断。
9示例代码:#include int main(void){ WDTCTL = WDTPW + WDTHOLD; // Stop WDT if (CALBC1_1MHZ==0xFF) // If calibration constant erased { while(1); // do not load, trap CPU!! } DCOCTL = 0; // Select lowest DCOx and MODx settings BCSCTL1 = CALBC1_1MHZ; // Set DCO DCOCTL = CALDCO_1MHZ; P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD P1SEL2 = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD UCA0CTL1 |= UCSSEL_2; // SMCLK UCA0BR0 = 104; // 1MHz 9600 UCA0BR1 = 0; // 1MHz 9600 UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1 UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt __bis_SR_register(LPM0_bits + GIE); // Enter LPM0, interrupts enabled}// Echo back RXed character, confirm TX buffer is ready first#pragma vector=USCIAB0RX_VECTOR__interrupt void USCI0RX_ISR(void){ while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready? UCA0TXBUF = UCA0RXBUF; // TX -> RXed character}