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

发布者:心连心意最新更新时间:2022-09-15 来源: csdn关键字:MSP430  异步通信  发送 手机看文章 扫描二维码
随时随地手机看文章

需要硬件: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  {

    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);           //约一秒发送一次

    }

}

关键字:MSP430  异步通信  发送 引用地址:MSP430异步通信(发送)不阻塞CPU,含注释

上一篇:msp430单片机接收(FIFO实现)不阻塞CPU
下一篇:MSP430F149 反应速度测试仪 oled 显示

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved