MSP430单片机的串口收发程序涉及到多个寄存器,可以一步一步按照以下步骤进行配置:
1、首先将用到的IO口设置为第二功能,例如要使用P3.4和P3.5作为USART0的TXD和RXD,则有 P3SEL |= BIT3+BIT4;
2、使能串口收发功能,要配置以下寄存器
如果既要收,又要发,则需要将UTXE0和URXE0置1,因为他们默认都是不打开的。
在IAR的头文件中有关于两位的掩码:
#define UTXE0 (0x80)
#define USPIE0 (0x40)
因此,我们可以直接使用语句:
ME1 |= UTXE0 + URXE0;
3、选择每帧的数据位的个数,需要配置寄存器:
默认的是7bit数据位,因此将CHAR位置1就是8位数据位。
UCTL0 |= CHAR;
4、选择波特率发生源,MSP430F149的波特率发生源有四种
波特率的分频系数要求大于3,要选择合适的时钟源,可以遵循以下规则:当波特较低时(<9600),可以选择ACLK,辅助时钟一般情况下使用是32768Hz的Watch Oscilliater,
当波特率较高时要使用SMCLK子系统时钟。
在IAR的头文件中有如下定义:
#define SSEL0 (0x10) /* Clock Source Select 0 */
因此要选用ACLK,可以使用:
UTCTL0 |= SSEL0;
5、配置波特率,这个需要结合选用的时钟源进行相应的计算:
首先它需要用到三个寄存器UXBR0,UXBR1和UXMCLK
然后要弄清楚分频比:
其中的BRCLK是指波特率发生器的时钟源的频率,例如本例当中使用的ACLK= 32768Hz, baude rate是指我们最终希望配置成的频率,例如本例需要的是9600
那么N=32768/9600=3.41
UXBRO和UXBR1组合为一个16位的寄存器,它保存整数部分,所以UXBR0=3,UXBR1=0;
UXMCLK用来保存小数部分,小数部分的计算比较复杂
首先让小数部分0.41*8=5.08 取整就是5
则UXBR1这个8位寄存器中就应该有5个1,这五个1要分布相对平均,可以取01001010,就是4A
要注意UXBR1的取值并不唯一。
在User's Guide中已经计算好的有如下:
这些是常用值,建议使用的时候参考参考,免去计算的麻烦。
6、软件清除复位标志位
寄存器如下:
其中第一位用于是否具有软件复位UART功能,一般需要关闭该功能,也就是复位。
UCTL0 &= ~SWRST;
7、最后我们需要打开中断,当然如果你不需要使用中断收发而使用查询方式收发,那么就不用打开中断。
需要配置的寄存器如下:
可以看到默认的情况下,USART的发送中断和接收中断是关闭的,在本例当中,我们用到了接收中断,因此:
IE1 |= URXIE0;
到此,整个程序基本就结束了。
#include <msp430x14x.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD
ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD
UCTL0 |= CHAR; // 8-bit character
UTCTL0 |= SSEL0; // UCLK = ACLK
UBR00 = 0x03; // 32k/9600 - 3.41
UBR10 = 0x00; //
UMCTL0 = 0x4A; // Modulation
UCTL0 &= ~SWRST; // Initialize USART state machine
IE1 |= URXIE0; // Enable USART0 RX interrupt
// Mainloop
for (;;)
{
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/interrupt
while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?
TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0
}
}
// UART0 RX ISR will for exit from LPM3 in Mainloop
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)
}
|