串口是系统与外界联系的重要手段,在嵌入式系统开发和应用中,经常需要上位机实现系统调试及现场数据的采集和控制。一般是通过上位机本身配置的串行口,通过串行通信技术,和嵌入式系统进行连接通信。USART 模块可以自动从任何一种低功耗模式 LPMx 开始自动工作。功能有USART模式,空闲线多级模式,地址位多机模式和UART自动波特率探测模式。
在芯片上的管脚位置为:
P3.4/UCA0TXD/UCA0SIMO 和 P3.5/UCA0RXD/UCA0SOMI
串口配置的步骤是:
1、将相应的管脚设置为串口的功能
P3SEL = 0x30; // P3.4,5 = USCI_A0 TXD/RXD
P3DIR |=BIT4; //P3.4为输出方向
2、设置波特率,由于硬件有波特率小数寄存器,所以误差比较小
//Baud rate divider with 1MHz = 1MHz/9600 = ~104.2
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 104; // 1MHz 9600
UCA0BR1 = 0; // 1MHz 9600
3、开启串口功能
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
3、中断函数
// 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
}
UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1
这句不是很懂,哪位高手解答下,这个寄存器是根据什么做设置的。
这里选用32K时钟,UCA0MCTL设置的是3,为什么?
UCA0CTL1 |= UCSSEL_1; // CLK = ACLK
UCA0BR0 = 0x03; // 32kHz/9600 = 3.41
UCA0BR1 = 0x00; //
UCA0MCTL = UCBRS1 + UCBRS0; // Modulation UCBRSx = 3