打印

【转】MSP430单片机UART帧超时处理程序

[复制链接]
572|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Snow7|  楼主 | 2017-3-9 21:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
SP430单片机UART帧超时处理程序
#include <msp430x42x.h>
#define FRAMEBUF_SIZE  32                 /*最大帧长度*/
#define IDLELINE_TIME  200                /*线路空闲判据时间*/
unsigned char FrameBuff[FRAMEBUF_SIZE];   /*接收帧缓冲区数组*/
unsigned int  UART_RcvCnt=0;              /*接收计数*/
#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX (void)        // 串口接收中断
{
  TAR=0;                                //清除帧空闲计时值
  TACTL|=MC_1;                          //开始计时
  if(UART_RcvCnt<FRAMEBUF_SIZE)         //若缓冲区未满
    {
      FrameBuff[UART_RcvCnt]=U0RXBUF;   //接收一字节数据
      UART_RcvCnt++;                    //指向下一字节
    }
   else  IFG1 &=~ URXIFG0;              //接受区已满,不接收
}  //读取RXBUF会自动清除串口中断标志,不接收时需要手动清除
#pragma vector=TIMERA1_VECTOR
__interrupt void TA_ISR(void)           //定时器溢出中断
{ int i;
  if(TAIV==10)                          //TA溢出
  {
   TACTL &=~ MC_3;                      //停止计数器
   //--------------------------------------------------------------------------
   // 数据帧接收完毕,在这里写数据帧处理程序,注意缓冲区只用前UART_RcvCnt个数据
    _NOP();  //在这里设断点查看FrameBuff[]数组的数据
   //--------------------------------------------------------------------------
   UART_RcvCnt=0;             //清除接收计数
   for(i=0;i<FRAMEBUF_SIZE;i++) FrameBuff=0; //清除接收缓冲区(可省略)
  }
}
void main( void )
{
  WDTCTL = WDTPW + WDTHOLD;                   // 停止看门狗
  FLL_CTL0 |= XCAP18PF;                        // 配置晶振负载电容
  U0CTL = CHAR;                                // 异步通讯模式,8位数据,无校验,1位停止位。
  ME1 |= UTXE0 + URXE0;                        // 开启串口0收发模块
  U0TCTL |= SSEL0;                        // 选择ACLK作为串口波特率时钟源。
  U0BR1 = 0;                                //
  U0BR0 = 13;                                // 分频系数整数部分=13
  U0MCTL = 0x6B;                        // 分频系数小数部分调制=5/8。(2400bps)
  P2SEL |= BIT4 + BIT5;  // P2.4,5 开启第二功能,作为串口收发引脚(不同单片机有差别)
  IE1 |= URXIE0;                         // 开启UART0的接收中断,在中断内接收数据
  TACTL = TASSEL_1  + TAIE;             // TA设为增计数模式,时钟=ACLK,开中断
  TACCR0=IDLELINE_TIME;                 //设置溢出超时条件
  _EINT();                                // 总中断允许
  while(1)
  {
    //CPU可以执行其他任务
  }
}

相关帖子

沙发
febgxu| | 2017-3-11 22:03 | 只看该作者
这个使用发送中断了?

使用特权

评论回复
板凳
febgxu| | 2017-3-11 22:05 | 只看该作者
超时设置自动发送。

使用特权

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

本版积分规则

173

主题

926

帖子

3

粉丝