MSP430异步通信(发送)不阻塞CPU,含注释

需要硬件:USB转TTL
TTL插电脑 ,再杜邦线连接430
现象:串口助手显示01 02 03 04 05 06 07 08
在这里插入图片描述
直接上代码

/*************************
发送数据帧的程序
利用发送中断,发送过程不阻塞CPU继续执行后续代码
Author:七禾页8
site:创客基地

缺点:必须整帧地发送数据。
需要将一次发送的数据都先整理完毕才能启动发送,
且必须等待上一帧发完才能启动下一帧的发送,
不能在程序中随时地按字节发送数据
**************************/

#include "msp430x14x.h"

#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long 
#define TXBUF_SIZE 32   //一帧最多能发送的数据字节数
unsigned char TX_BUFF[TXBUF_SIZE];      //发送缓冲区
unsigned char TX_NUM;     //发送字节总数变量
unsigned char TX_CNT;     //发送字节计数变量



/*******************************
*名称:UART0_PutFrame()
*功能:从串口发送1帧数据
*入口参数:Ptr:待发送数组的首地址(数组名)
           Lenth:数据帧长度
*出口参数:返回1表示成功
           返回0表示失败
*说明:发送过程中,不阻塞CPU运行
********************************/
char UART0_PutFrame(unsigned char*Ptr,unsigned int Lenth)
{
  int i;
  if(IE1 & UTXIE0)
    return (0);   //如果上一帧没发送完,返回0
  if(Lenth>TXBUF_SIZE)
    return(0);    //长度超过最大缓冲区,返回0
  for(i=0;i<Lenth;i++)
  {
    TX_BUFF[i]=Ptr[i];    //待发送数据装填进入发送缓冲区
  }
  TX_CNT = 0;   //发送字节数清0
  TX_NUM = Lenth;   //发送字节总数
  IFG1 |= UTXIFG0;    //人为制造第一次发生中断
  IE1 |= UTXIE0;  //允许UART0的发送中断
  return(1);      //返回发送成功
}

/*************************
发送中断
**************************/
#pragma vector = UART0TX_VECTOR
__interrupt void UART0_TX(void)   //串口发送中断
{
  U0TXBUF = TX_BUFF[TX_CNT];      //将本次应该发送的数据送入TXBUF
  TX_CNT++;     //下一次 依次发送后续字节
  if(TX_CNT >= TX_NUM)      //发送字节计数到达发送总数
  {
    IE1 &= ~UTXIE0;    //禁止UART0的发送中断,停止发送
  }
}

/********************
 时钟初始化
***********************/
void BCS_Init()
{
  uchar j;
  WDTCTL = WDTPW + WDTHOLD;   //关闭看门狗
  //使用外部高频晶体振荡器
  BCSCTL1&=~XT2OFF;       //使用外部XT2晶振8M
  do{
      IFG1&=~OFIFG;    
      for(j=0XFF;j>0;j--);
    }while((IFG1&OFIFG));    //等待晶振震荡平稳
  BCSCTL2|=SELM_2;        //MCLK选择XT2
}


/********************
IO初始化
***********************/
void IO_Init()
{
  P3DIR|=BIT4;      //P3.4  UTXD0设置为输出
  P3DIR&=~BIT5;     //P3.5  URXD0设置为输入
  P3SEL|=BIT4+BIT5;     //开启第二功能 (通信功能)
}


/********************
通信初始化
***********************/
void communication_Init()
{
        ME1 |= UTXE0 + URXE0;  // 使能USART0收发
        UCTL0 |= CHAR + SWRST;     // 8-bit 数据,一位停止位 SWRST=1 设置串行口
        UTCTL0 |= SSEL0;           // 选择时钟,UCLK = ACLK,32768
        UBR00 = 0x03;    // 32k/9600选择ACLK
        UBR10 = 0x00;   //
        UMCTL0 = 0x4a;            // Modulation
        UCTL0 &= ~SWRST;    // 初始化UART0状态机,一般要设置好串口之后才复位
        P2DIR |= BIT0;
/*************在初始化代码中增加下面两句*************/
        IE1 |= URXIE0 + UTXIE0;           // URXIE0允许接收中断 + UTXIE0允许发送中断
        _EINT();     //总中断允许
}



void main( void )
{
    uchar TxTestBuff[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
    BCS_Init();     //时钟初始化
    IO_Init();      //IO初始化
    communication_Init();   //通信初始化
    while(1)
    {
      UART0_PutFrame(TxTestBuff,8);     //发送一个长度约为8B的数据帧
      __delay_cycles(10000000);           //约一秒发送一次
    }
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值