|
MSP430单片机UART帧超时处理程序
- #include
- #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 {
- 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=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可以执行其他任务
- }
- }
|
|