#include "uart4.h" #include "../tpc/debug.h" //#define FOSC 11059200L //系统频率 //#define BAUD4 115200 //串口波特率 void L0_uart4_init(void)//115200bps@11.0592MHz { #if(MainFre_11M == D_sys_MainFre) #if 0 S4CON = 0x50; //8位可变波特率 T4L = (65536 - (FOSC/4/BAUD4)); //设置波特率重装值 T4H = (65536 - (FOSC/4/BAUD4))>>8; T4T3M |= 0x20; //定时器4为1T模式 T4T3M |= 0x80; //定时器4开始计时 #else S4CON = 0x10; //8位数据,可变波特率 S4CON |= 0x40; //串口4选择定时器4为波特率发生器 T4T3M |= 0x20; //定时器4时钟为Fosc,即1T T4L = 0xE8; //设定定时初值 T4H = 0xFF; //设定定时初值 T4T3M |= 0x80; //启动定时器4 #endif #elif (MainFre_22M == D_sys_MainFre) #if (D_uart4_BRT == BRT_115200) S4CON = 0x10; //8位数据,可变波特率 S4CON |= 0x40; //串口4选择定时器4为波特率发生器 T4T3M |= 0x20; //定时器时钟1T模式 T4L = 0xD0; //设置定时初始值 T4H = 0xFF; //设置定时初始值 T4T3M |= 0x80; //定时器4开始计时 #elif (D_uart4_BRT == BRT_9600) //9600bps@22.1184MHz S4CON = 0x10; //8位数据,可变波特率 S4CON |= 0x40; //串口4选择定时器4为波特率发生器 T4T3M |= 0x20; //定时器时钟1T模式 T4L = 0xC0; //设置定时初始值 T4H = 0xFD; //设置定时初始值 T4T3M |= 0x80; //定时器4开始计时 #endif #endif } void L0_uart4_buf_init(void) { //定义发送缓冲区 ts_uart[uNum4].s.buf = ts_send_buf.s4; ts_uart[uNum4].s.bufmax = D_send4_max; ts_uart[uNum4].s.max = ts_uart[uNum4].s.now = 0; ts_uart[uNum4].s.ok = D_ready; //定义接收缓冲区 ts_uart[uNum4].r.buf = ts_recv_buf.r4; ts_uart[uNum4].r.bufmax = D_recv4_max; ts_uart[uNum4].r.head = 0; ts_uart[uNum4].r.ok = 0; ts_uart[uNum4].r.idle = 1; ts_uart[uNum4].r.overtime_t = 0; //串口协议解析专用字段 ts_uart[uNum4].tp_handler = L0_uartN_overtime_callback; ts_uart[uNum4].uartx = uNum4; //串口初始化 L0_uart4_init(); //打开串口中断 D_uart4_ES_INT(1); //默认处于接收状态 D_UART4_485_RX() } /************************************************* UART 中断 *************************************************/ #define D_SERVE_uart4 interrupt 18 void INTERRUPT_uart4(void) D_SERVE_uart4// using 2 { #if 1 //NOP(); NOP(); NOP(); if(L0_uart4_IntRI()) //如果是U0接收中断 { L0_uart4_IntRIClear(); //清除接收中断标志 ts_uart[uNum4].r.reg = S4BUF; //获取当前数据 L0_uartN_s2b(uNum4); //接收数据至缓冲区 } if(L0_uart4_IntTI()) //如果是U0发送中断 { L0_uart4_IntTIClear(); //清除发送中断标志 if(ts_uart[uNum4].s.max != ts_uart[uNum4].s.now) { S4BUF = ts_uart[uNum4].s.p[ts_uart[uNum4].s.now]; ts_uart[uNum4].s.now ++; } else { ts_uart[uNum4].s.ok = D_ready; ts_uart[uNum4].s.max = 0; ts_uart[uNum4].s.now = 0;//可以发送下一个数据 D_UART4_485_RX() //切换到接收状态 } } //NOP(); NOP(); NOP(); #endif }