打印

msp430x43x的串口通信例程

[复制链接]
847|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dirtwillfly|  楼主 | 2015-10-28 21:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "msp430x43x.h"
void init_uart(void);
void uart_start(void);
void uart_send(void);
void uart_receive(void);
unsigned char RXDATA_BUF[10];
const unsigned char TXDATA_BUF[10]={0xbd,0x77,0x3d,0xc5,0xc6,0xf5,0x68,0x0d,0x6b,0xff};
unsigned int RX_count=0,TX_count=0,TXBUF_num=10,RXBUT_num=10,FLAG;
void main(void)
{   
    init_uart();
    uart_start();
    while(1)
    {
      _BIS_SR(CPUOFF);
      _NOP();
    }
}
void init_uart(void)                    //初始化UART
{   
    unsigned int i;
    WDTCTL=WDTPW+WDTHOLD;  
    FLL_CTL1|=XT2OFF+SELM_XT2+SELS;        
    do                                  //等待时钟稳定
    {   
        IFG1&=~OFIFG;                   //清除OSCFault
        for(i=0;i<0xff;i++);            //延时
    }
    while((FLL_CTL0&XT2OF)==XT2OF);
    UCTL0|=SWRST;                       //控制寄存器位
    UCTL0|=CHAR;
    UTCTL0=SSEL0+SSEL1;                 //选择发送时钟源复位
    UBR00=0XA0;                         //波特率9600
    UBR10=0X01;
    UMCTL0=0X5E;
    UCTL0&=~SWRST;                      //选择发送时钟源置位
    ME1|=URXE0+UTXE0;                   //使能TXD  RXD
    IE1|=URXIE0;
    IFG1=0X00;
    P2SEL|=0X30;                        //模块选用,p2.4,5USART0收发
    P2DIR|=0X10;
    for(i=0;i<10;i++)
    RXDATA_BUF=0;                    //    清接收缓存
    _EINT();
}
void uart_start(void)                   //启动发送
{   
    IE1|=UTXIE0;
    while((UTCTL0&BIT0)!=BIT0);
    TXBUF0=TXDATA_BUF[0];
    TX_count=1;
}
void uart_receive(void)                 //接收
{   
    RXDATA_BUF[RX_count]=RXBUF0;
    RX_count+=1;
    if(RX_count>=RXBUT_num) {RX_count=0;}
}
void uart_send(void)                    //发送
{  
    TXBUF_num-=1;
    if(TXBUF_num>0)
      {   
          TXBUF0=TXDATA_BUF[TX_count];
          TX_count+=1;
         
      }
    else
     {   
        FLAG+=1;
        if(FLAG>10)  
        {IE1&=~UTXIE0;}
         else  
         {   
           TXBUF_num=10;
           TX_count=0;
           uart_start();
         }
     }
}
#pragma vector=USART0RX_VECTOR
__interrupt void UartRx(void)//发送中断响应
{   
    uart_send();
}
#pragma vector=USART0TX_VECTOR
__interrupt void UartTx(void)//接收中断响应
{
    uart_receive();
}

相关帖子

沙发
哆来咪| | 2015-10-29 16:20 | 只看该作者
不是都有库了么?还用的都是寄存器

使用特权

评论回复
板凳
月正浓| | 2015-10-30 09:45 | 只看该作者
给版主支持下,版主辛苦了!

使用特权

评论回复
地板
豆腐块| | 2015-10-30 10:23 | 只看该作者
const unsigned char TXDATA_BUF[10]
前边加上const ,是不是就把数组放到flash里了

使用特权

评论回复
5
android2| | 2015-10-30 10:56 | 只看该作者
感谢分享

使用特权

评论回复
6
李香兰| | 2015-10-30 20:31 | 只看该作者
#include "msp430x43x.h"
void init_uart(void);
void uart_start(void);
void uart_send(void);
void uart_receive(void);
unsigned char RXDATA_BUF[10];
const unsigned char TXDATA_BUF[10]={0xbd,0x77,0x3d,0xc5,0xc6,0xf5,0x68,0x0d,0x6b,0xff};
unsigned int RX_count=0,TX_count=0,TXBUF_num=10,RXBUT_num=10,FLAG;
void main(void)
{   
    init_uart();
    uart_start();
    while(1)
    {
      _BIS_SR(CPUOFF);
      _NOP();
    }
}
void init_uart(void)                    //初始化UART
{   
    unsigned int i;
    WDTCTL=WDTPW+WDTHOLD;  
    FLL_CTL1|=XT2OFF+SELM_XT2+SELS;        
    do                                  //等待时钟稳定
    {   
        IFG1&=~OFIFG;                   //清除OSCFault
        for(i=0;i<0xff;i++);            //延时
    }
    while((FLL_CTL0&XT2OF)==XT2OF);
    UCTL0|=SWRST;                       //控制寄存器位
    UCTL0|=CHAR;
    UTCTL0=SSEL0+SSEL1;                 //选择发送时钟源复位
    UBR00=0XA0;                         //波特率9600
    UBR10=0X01;
    UMCTL0=0X5E;
    UCTL0&=~SWRST;                      //选择发送时钟源置位
    ME1|=URXE0+UTXE0;                   //使能TXD  RXD
    IE1|=URXIE0;
    IFG1=0X00;
    P2SEL|=0X30;                        //模块选用,p2.4,5为USART0收发
    P2DIR|=0X10;
    for(i=0;i<10;i++)
    RXDATA_BUF=0;                    //    清接收缓存
    _EINT();
}
void uart_start(void)                   //启动发送
{   
    IE1|=UTXIE0;
    while((UTCTL0&BIT0)!=BIT0);
    TXBUF0=TXDATA_BUF[0];
    TX_count=1;
}
void uart_receive(void)                 //接收
{   
    RXDATA_BUF[RX_count]=RXBUF0;
    RX_count+=1;
    if(RX_count>=RXBUT_num) {RX_count=0;}
}
void uart_send(void)                    //发送
{  
    TXBUF_num-=1;
    if(TXBUF_num>0)
      {   
          TXBUF0=TXDATA_BUF[TX_count];
          TX_count+=1;
         
      }
    else
     {   
        FLAG+=1;
        if(FLAG>10)  
        {IE1&=~UTXIE0;}
         else  
         {   
           TXBUF_num=10;
           TX_count=0;
           uart_start();
         }
     }
}
#pragma vector=USART0RX_VECTOR
__interrupt void UartRx(void)//发送中断响应
{   
    uart_send();
}
#pragma vector=USART0TX_VECTOR
__interrupt void UartTx(void)//接收中断响应
{
    uart_receive();
}

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
dirtwillfly + 1 赞一个!
7
STM32初学者| | 2015-10-30 23:33 | 只看该作者
好久没有配置过寄存器了

使用特权

评论回复
8
mmbs| | 2015-10-31 14:10 | 只看该作者
注释不是很详细。

使用特权

评论回复
9
月正浓| | 2015-10-31 22:46 | 只看该作者

好多寄存器,还是喜欢库操作的,省心!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎进入TI MCU论坛      21ic TI技术交流1群:61549143(已满),  21ic TI技术交流2群:311421422 我的博客:http://blog.timcu.com/

1180

主题

34763

帖子

1116

粉丝