#include "uart3.h" #include "uartx.h" void L0_uart3_init(void) { #if (MainFre_11M == D_sys_MainFre) //115200bps@11.0592MHz S3CON = 0x10; //8位数据,可变波特率 S3CON |= 0x40; //串口3选择定时器3为波特率发生器 T4T3M |= 0x02; //定时器3时钟为Fosc,即1T T3L = 0xE8; //设定定时初值 T3H = 0xFF; //设定定时初值 T4T3M |= 0x08; //启动定时器3 #elif (MainFre_22M == D_sys_MainFre) //115200bps@22.1184MHz S3CON = 0x10; //8位数据,可变波特率 S3CON |= 0x40; //串口3选择定时器3为波特率发生器 T4T3M &= 0xFD; //定时器时钟12T模式 T3L = 0xFC; //设置定时初始值 T3H = 0xFF; //设置定时初始值 T4T3M |= 0x08; //定时器3开始计时 #endif } void L0_uart3_buf_init(void) { //定义发送缓冲区 ts_uart[uNum3].s.buf = ts_send_buf.s3; ts_uart[uNum3].s.bufmax = D_send3_max; ts_uart[uNum3].s.max = ts_uart[uNum3].s.now = 0; ts_uart[uNum3].s.ok = D_ready; //定义接收缓冲区 ts_uart[uNum3].r.buf = ts_recv_buf.r3; ts_uart[uNum3].r.bufmax = D_recv3_max; ts_uart[uNum3].r.head = 0; ts_uart[uNum3].r.ok = 0; ts_uart[uNum3].r.idle = 1; ts_uart[uNum3].r.overtime_t = 0; //串口协议解析专用字段 ts_uart[uNum3].tp_handler = L0_uartN_overtime_callback; ts_uart[uNum3].uartx = uNum3; //串口初始化 L0_uart3_init(); //打开串口中断 D_uart3_ES_INT(1); //默认处于接收状态 //D_UART3_485_RX() } /************************************************* UART 中断 *************************************************/ #define D_SERVE_UART3 interrupt 17 void INTERRUPT_UART3(void) D_SERVE_UART3// using 3 { NOP(); NOP(); NOP(); if(L0_uart3_IntRI()) //如果是U3接收中断 { L0_uart3_IntRIClear(); //清除接收中断标志 ts_uart[uNum3].r.reg = S3BUF; //获取当前数据 L0_uartN_s2b(uNum3); //接收数据至缓冲区 } if(L0_uart3_IntTI()) //如果是U0发送中断 { L0_uart3_IntTIClear(); //清除发送中断标志 if(ts_uart[uNum3].s.max != ts_uart[uNum3].s.now) { S3BUF = ts_uart[uNum3].s.p[ts_uart[uNum3].s.now]; ts_uart[uNum3].s.now ++; } else { ts_uart[uNum3].s.ok = D_ready; ts_uart[uNum3].s.max = 0; ts_uart[uNum3].s.now = 0;//可以发送下一个数据 //D_UART3_485_RX() //切换到接收状态 } } NOP(); NOP(); NOP(); }