×
单片机 > 单片机程序设计 > 详情

MSP430F149串口收发程序详解

发布时间:2020-09-02 发布时间:
|

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)

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM基础知识八