[资料分享] MSP430F149串口收发程序详解

fish001   2019-5-12 07:59 楼主
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  

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)
}


回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复