三、UART【MSP430学习笔记】

一、UART0串口发送接收数据

在这里插入图片描述
MSP430的通用串行结构USCI支持多种串行通信模式。在MSP430F249这个型号含有4个USCI模块,下表是支持UART模式的USCI_Ax的相应寄存器:
在这里插入图片描述
在这里插入图片描述
1、串口0初始化例程
模式为UART、配置p3.4和p3.5为通信接口、偶校验、波特率:2400

void InitUART0(void)    
{
    P3OUT |= BIT4+BIT5;
    P3SEL |= BIT4+BIT5;             //设置p3.4与p3.5为串口通信
  UCA0CTL1 |= UCSSEL0 + UCSWRST;//设置串口0时钟为ACLK,置位UCSWRST,初始化所有的USCI寄存器
  UCA0CTL0 |= UCPEN + UCPAR; // UCPE偶校验使能,设置偶校验 0:LSB / 1:MSB */
   UCA0BR0 = 0x0D;                           // 32kHz/2400= 13.65
    UCA0BR1 = 0x00;                           //
    UCA0MCTL = 0X0A;
    UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
    IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt
}

2、串口0发送数据

//串口0发送数据
void Uart0_Send_Byte(unsigned char data)
{
   while(!(IFG2&UCA0TXIFG));//发送寄存器空的时候发送数据
   UCA0TXBUF = data;
}

3、串口0接收数据中断(将收到的数据原样发送出去)

//串口0接收中断
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
        unsigned char data=0;
        data = UCA0RXBUF;//接收到的数据存起来
        Uart0_Send_Byte(data);//将接收到的数据再发送出去
}

4、将收到的数据保存到数组中

unsigned char UART0RXBuf[68];
unsigned int  UART0RXPos = 0;

#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
    if (!UART0RXLen)
    {
       // Buffer中数据尚未处理完毕,暂时不能接收数据
        UART0RXDly = 1;
        UART0RXBuf[UART0RXPos] = UCA0RXBUF;
        UART0RXPos ++;
        _delay(1,10);
        if (UART0RXPos >= (sizeof(UART0RXBuf)-1))
         UART0RXPos = 0;
    }
    else UART0Temp = UCA0RXBUF;
}

关于MSP430串口波特率,可参考一下博文链接
MSP430设置串口波特率的方法

二、添加标准的printf函数

前提条件:
串口初始化(在以上有源代码)注意波特率和校验位等的配置根据自己需要配置,单片机与PC机已经通过串口线连接
代码如下:

// ********************************************************************
// * 函数名   :   UartPutchar
// * 函数功能  :  向串口终端发送一个字符
// * 形参     :  Txdata为待发送的字符
// * 返回值   :  无
//*******************************************************************

void UartPutchar(char Txdata)

{

    if(Txdata=='\n'){
        while(!(IFG2&UCA0TXIFG));
       UCA0TXBUF='\r';
    }

     while(!(IFG2&UCA0TXIFG));
    UCA0TXBUF=Txdata;
}

// ********************************************************************
// * 函数名   :   UartSendString
// * 函数功能  :  向串口终端发送一个字符串
// * 形参     :  pt为字符串指针。
// * 返回值   :  无
// *******************************************************************/

void UartSendString(char *pt)

{

    while(*pt)

        UartPutchar(*pt++);

}

/********************************************************************
 * 函数名    :   IntToString
 * 函数功能  :  将一个整形的书转化成为一个表现形式一样的字符串
 * 说明      :  举例说明功能,若有一个整数为65535,该函数作用就是将 *
   “65535”其转化为字符串
 * 形参      :  temp为待装换的整数,pchar为转化成的字符串所存储的地址
 * 返回值    :  无
********************************************************************/

void IntToString(int t,char *pchar)

{
    char ch,*p=pchar;
    while(t!=0){
       *pchar++=(char)(t+0x30);
       t/=10;
    }
    *pchar--='\0';
    while(pchar>p){
      ch=*p;
       *p++=*pchar;
       *pchar--=ch;
    }
}
/* ********************************************************************
* 函数名   :   Vs_Printf
* 函数功能  :  将参数指针arg所指的不定参数按照格式字符串format中的一一对应的格
*            式转化后生成一个新的字符串存于地址s中。
* 形参     :  s为最终形成的字符串存储地址,format为格式字符串,arg为不定参数指
*            针。
 * 返回值   :  无
********************************************************************/

void Vs_Printf(char *s,char *format,va_list arg)

{
    char *pchar;
    char *temp;
    for(pchar=format;*pchar;pchar++){
       if(*pchar !='%'){
           *s++=*pchar;
           continue;
       }
       switch(*++pchar){
           case 'd'   :
             {
              IntToString(va_arg(arg,int),s);
              while(*s++);
              *--s='0';
              break;
           }

           case 's'   :
             {
              temp=va_arg(arg,char *);
              while(*s++=*temp++);
              *--s='0';
              break;
           }

           case 'c'   :{
              *s++=va_arg(arg,char);
              break;
           }

           default:
             break;
       }
    }
    *s='\0';
}
/********************************************************************
 * 函数名   :   Printf
 * 函数功能  :  格式化输出
 * 形参     :  fmt为格式字符串,…为不定(类型不定、个数不定)形参
 * 返回值   :  无
*******************************************************************/
void Printf(char *fmt,...)
{
    va_list ap;
    char string[256];
    va_start(ap,fmt);
    Vs_Printf(string,fmt,ap);
    UartSendString(string);
    va_end(ap);
}
/********************************************************************
 * 函数名   :   主函数
 * 函数功能  :  测试打印输出
*******************************************************************/
#include "include.h"
#include "stdarg.h"
#include "string.h"
void main()

{  
    int year=2012;
    WDTCTL = WDTPW + WDTHOLD;
    Init_Clk();
    UartInit();
    char *str="Hello World!";
    Printf("year=%d\n str=%s\n",year,str);
}

实现效果:
在这里插入图片描述
参考博文

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值