You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

89 lines
2.3 KiB

#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].tp_handler = NULL;
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();
}