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.
88 lines
2.3 KiB
88 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].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();
|
|
}
|
|
|
|
|
|
|