UART串行通信模式

UART串行通信模式

What

  单片机可以与其他机器(像上位机,我们所用的上位机就是我们的PC)进行数据之间的传输也就是通信。而通信具有不同的通信模式,这一节主要讨论单片机(MSP430)的UART通信模式。
MSP430的USCI不同种类模块
MSP430G2553只有一个USCI_A0和USCI_B0模块
  UART通信模式是一种异步串行通信模式。所谓异步,就是收发双方的时钟并不同步,发送方以一定的方式发出数据,接收方也以类似的方式接收数据,对数据的传输及发送时间没有要求,而同步通信模块需要收发双方时钟相同,接收和发送有时钟要求;所谓串行通信模式直观理解就是通信只有一条道路,数据位按顺序依次通过,而并行通信模式就是有多条道路,数据位并排一起过去。
  UART典型数据格式如下
UART典型数据格式
  其他内容参考手册相关部分内容。再写我怕写错了。

How

在这里插入图片描述
当UCSYNC位被清零时USCI就选择了UART模式。
管脚配置
时钟源配置
时钟选择
波特率配置
中断配置,中断函数编写
LaunchPad在进行串口通信时需要将RXD和TXD两列的跳线帽横插。

举例

串口(使用USART2,TX为PA2,RX为PA3),发送0x55显示在上位机串口助手上(波特率9600)

#include "io430.h"
void Delay_ms(unsigned cnt)
{
  unsigned int i,j;
  for(j=0;j<cnt;j++)
  {
    i=1000/6;
    while(i--);
  }
}
void InitUART(void)
{
  //复位USCI_Ax
  UCA0CTL1|=UCSWRST;
  //选择USCI_Ax为UART模式
  UCA0CTL0&=~UCSYNC;
  //配置UART时钟源为SMCLK
  UCA0CTL1|=UCSSEL1;
  //配置波特率为9600
  UCA0BR0=104;
  UCA0BR1=0;
  UCA0MCTL=1<<1;
  //使能端口复用
  P1SEL|=BIT1+BIT2;
  P1SEL2|=BIT1+BIT2;
  //清除复位,使能UART
  UCA0CTL1&=~UCSWRST;
}
void InitSystemClock(void)
{
   //配置DCO为1MHz
  DCOCTL=CALDCO_1MHZ;
  BCSCTL1=CALBC1_1MHZ;
  //配置SMCLK的时钟源为DCO
  BCSCTL2&=~SELS;
  //设置SMCLK的分频系数为1
  BCSCTL2&=~(DIVS0|DIVS1);
}
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  InitSystemClock();
  InitUART();
  while(1)
  {
    UCA0TXBUF=0x55;
    Delay_ms(1000);
  }
}

UART串口通信发送0x55至上位机

Task

将接收的上位机数据取反后再发送到串口助手上。(波特率9600)

#include "io430.h"
#include "stdint.h"
/*      @fn:    void InitUART(void)
	@brief: 初始化串口,包括设置波特率,数据位,校验位等
	@para:  none
	@return:        none
	@comment:       初始化串口
*/
void InitUART(void)
{
  //复位USCI_Ax
  UCA0CTL1|=UCSWRST;
  //选择USCI_Ax为UART模式
  UCA0CTL0&=~UCSYNC;
  //配置UART时钟源为SMCLK
  UCA0CTL1|=UCSSEL1;
  //配置波特率为9600
  UCA0BR0=104;
  UCA0BR1=0;
  UCA0MCTL=1<<1;
  //使能端口复用
  P1SEL|=BIT1+BIT2;
  P1SEL2|=BIT1+BIT2;
  //清除复位,使能UART
  UCA0CTL1&=~UCSWRST;
  //接收中断启用
  IE2|=UCA0RXIE;
  //清空接收中断标志位
  IFG2&=~UCA0RXIFG;
}
/*      @fn:    void InitSystemClock(void)
	@brief: 初始化系统时钟
	@para:  none
	@return:        none
	@comment:       初始化系统时钟
*/
void InitSystemClock(void)
{
   //配置DCO为1MHz
  DCOCTL=CALDCO_1MHZ;
  BCSCTL1=CALBC1_1MHZ;
  //配置SMCLK的时钟源为DCO
  BCSCTL2&=~SELS;
  //设置SMCLK的分频系数为1
  BCSCTL2&=~(DIVS0|DIVS1);
}

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  InitSystemClock();
  InitUART();
  P1DIR|=BIT0;//用于查看程序是否正常运行
  P1OUT|=BIT0;
  __bis_SR_register(LPM0_bits+GIE);
}

#pragma vector=USCIAB0RX_VECTOR
__interrupt void UART_Receive_ISR(void)
{
  while (!(IFG2&UCA0TXIFG));                // 检测发送是否准备好
  UCA0TXBUF = ~UCA0RXBUF;                    // 将接收数据发送给主机
}

UART接收取反发送

sao话一下

为众人抱薪者,不可使其扼于风雪。为自由开路者,不可使其困于荆棘。即使我们不是抱薪开路之人,也应该多一些善良。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值