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.
99 lines
2.7 KiB
99 lines
2.7 KiB
4 months ago
|
|
||
|
#include "uart4.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) //115200bps@22.1184MHz
|
||
|
S4CON = 0x10; //8位数据,可变波特率
|
||
|
S4CON |= 0x40; //串口4选择定时器4为波特率发生器
|
||
|
T4T3M |= 0x20; //定时器4时钟为Fosc,即1T
|
||
|
T4L = 0xD0; //设定定时初值
|
||
|
T4H = 0xFF; //设定定时初值
|
||
|
T4T3M |= 0x80; //启动定时器4
|
||
|
#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
|
||
|
// {
|
||
|
// //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();
|
||
|
// }
|
||
|
|
||
|
|