找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4360|回复: 0
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
ID:108615 发表于 2016-3-14 19:17 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
本程序是《MSP430系列单片机系统工程设计与实践》书里面的源码,(包含工程文件 (例2.9.14)))完整例程下载:http://www.51hei.com/bbs/dpj-46245-1.html

关于本程序的详细解说大家可以下载电子书点击上图即可

  1. #include <msp430x42x.h>
  2. #define FRAMEBUF_SIZE  32                 /*最大帧长度*/
  3. #define IDLELINE_TIME  200                /*线路空闲判据时间*/
  4. unsigned char FrameBuff[FRAMEBUF_SIZE];   /*接收帧缓冲区数组*/
  5. unsigned int  UART_RcvCnt=0;              /*接收计数*/

  6. #pragma vector=UART0RX_VECTOR
  7. __interrupt void UART0_RX (void)        // 串口接收中断
  8. {
  9.   TAR=0;                                //清除帧空闲计时值
  10.   TACTL|=MC_1;                          //开始计时
  11.   if(UART_RcvCnt<FRAMEBUF_SIZE)         //若缓冲区未满
  12.     {
  13.       FrameBuff[UART_RcvCnt]=U0RXBUF;   //接收一字节数据
  14.       UART_RcvCnt++;                    //指向下一字节
  15.     }
  16.    else  IFG1 &=~ URXIFG0;              //接受区已满,不接收
  17. }  //读取RXBUF会自动清除串口中断标志,不接收时需要手动清除

  18. #pragma vector=TIMERA1_VECTOR
  19. __interrupt void TA_ISR(void)           //定时器溢出中断
  20. { int i;
  21.   if(TAIV==10)                          //TA溢出
  22.   {
  23.    TACTL &=~ MC_3;                      //停止计数器                  
  24.    //--------------------------------------------------------------------------
  25.    // 数据帧接收完毕,在这里写数据帧处理程序,注意缓冲区只用前UART_RcvCnt个数据
  26.     _NOP();  //在这里设断点查看FrameBuff[]数组的数据
  27.    //--------------------------------------------------------------------------               
  28.    UART_RcvCnt=0;             //清除接收计数
  29.    for(i=0;i<FRAMEBUF_SIZE;i++) FrameBuff[i]=0; //清除接收缓冲区(可省略)
  30.   }
  31. }  

  32. void main( void )
  33. {                                                               
  34.   WDTCTL = WDTPW + WDTHOLD;                   // 停止看门狗
  35.   FLL_CTL0 |= XCAP18PF;                        // 配置晶振负载电容
  36.   U0CTL = CHAR;                                // 异步通讯模式,8位数据,无校验,1位停止位。
  37.   ME1 |= UTXE0 + URXE0;                        // 开启串口0收发模块
  38.   U0TCTL |= SSEL0;                        // 选择ACLK作为串口波特率时钟源。
  39.   U0BR1 = 0;                                //
  40.   U0BR0 = 13;                                // 分频系数整数部分=13
  41.   U0MCTL = 0x6B;                        // 分频系数小数部分调制=5/8。(2400bps)
  42.   P2SEL |= BIT4 + BIT5;  // P2.4,5 开启第二功能,作为串口收发引脚(不同单片机有差别)
  43.   IE1 |= URXIE0;                         // 开启UART0的接收中断,在中断内接收数据
  44.   TACTL = TASSEL_1  + TAIE;             // TA设为增计数模式,时钟=ACLK,开中断
  45.   TACCR0=IDLELINE_TIME;                 //设置溢出超时条件            
  46.   _EINT();                                // 总中断允许
  47.   while(1)
  48.   {   
  49.     //CPU可以执行其他任务
  50.   }
  51. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表