📄 uart.c
字号:
/********************************************************************************/
/* filename : UART.c */
/* created : xillinx */
/* descript : 处理与串口相关的事情 */
/********************************************************************************/
#include "../CPU/CPU.h"
#include "../CFG/CFG.h"
#include "../UART/UART.h"
unsigned char code ascii_table[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
unsigned char UART_send_buffer[UART_SEND_BUF_MAX];
unsigned int uart_xmit_wr;
unsigned int uart_xmit_rd;
unsigned char data uart_xmit_start;
unsigned char UART_recv_buffer[UART_RECV_BUF_MAX];
unsigned char data uart_recv_wr;
unsigned char data uart_recv_rd;
unsigned char data uart_recv_start;
/********************************************************************************/
/* fun_name : UART_buffer_initilize() */
/* version : v1.00 */
/* created : xillinx */
/********************************************************************************/
void UART_buffer_initilize(void)
{ uart_xmit_start = 0x0;
uart_recv_start = 0x0;
uart_xmit_wr = 0x0;
uart_xmit_rd = 0x0;
uart_recv_wr = 0x0;
uart_recv_rd = 0x0;
}
/********************************************************************************/
/* fun_name : UART_printf() */
/* version : v1.00 */
/* created : xillinx */
/********************************************************************************/
void UART_printf(char * string,...)
{ unsigned int length;
unsigned char i;
char uart_buffer[UART_EACH_MSG_MAX];
va_list arguments;
EA=0x0;
va_start(arguments,string);
vsprintf(uart_buffer,string,arguments);
va_end(arguments);
length=strlen(uart_buffer);
for(i=0x0;i<length;i++)
{ if(((uart_xmit_wr+0x1)&UART_SEND_BUF_MSK)==uart_xmit_rd) //* 缓冲区已经满了
{ break;
}
UART_send_buffer[uart_xmit_wr]=uart_buffer[i];
uart_xmit_wr++;
uart_xmit_wr&=UART_SEND_BUF_MSK;
}
if(uart_xmit_start==0x0) //* 如果需要启动发生,就启动
{ uart_xmit_start=0x1;
TI=1;
}
EA=0x1;
return;
}
/********************************************************************************/
/* fun_name : UART_print_ascii() */
/* version : v1.00 */
/* created : xillinx */
/********************************************************************************/
void UART_print_ascii(unsigned char * buffer, unsigned char len)
{ unsigned char i;
ES=0x0;
for(i=0x0;i<len;i++)
{ if(((uart_xmit_wr+0x1)&UART_SEND_BUF_MSK)==uart_xmit_rd) //* 缓冲区已经满了
{ break;
}
UART_send_buffer[uart_xmit_wr]=ascii_table[(buffer[i]>>0x4)&0xF];
uart_xmit_wr++;
uart_xmit_wr&=UART_SEND_BUF_MSK;
if(((uart_xmit_wr+0x1)&UART_SEND_BUF_MSK)==uart_xmit_rd) //* 缓冲区已经满了
{ break;
}
UART_send_buffer[uart_xmit_wr]=ascii_table[(buffer[i]>>0x0)&0xF];
uart_xmit_wr++;
uart_xmit_wr&=UART_SEND_BUF_MSK;
if(((uart_xmit_wr+0x1)&UART_SEND_BUF_MSK)==uart_xmit_rd) //* 缓冲区已经满了
{ break;
}
UART_send_buffer[uart_xmit_wr]='|';
uart_xmit_wr++;
uart_xmit_wr&=UART_SEND_BUF_MSK;
}
if(uart_xmit_start==0x0) //* 如果需要启动发生,就启动
{ uart_xmit_start=0x1;
TI=1;
}
ES=0x1;
return;
}
/********************************************************************************/
/* fun_name : UART_put_double_char() */
/* version : v1.00 */
/* created : xillinx */
/********************************************************************************/
void UART_put_double_char(unsigned char status, unsigned char hi,unsigned char lo)
{ UART_send_buffer[uart_xmit_wr]=status;
uart_xmit_wr++;
uart_xmit_wr&=UART_SEND_BUF_MSK;
UART_send_buffer[uart_xmit_wr]=ascii_table[(hi>>0x4)&0xF];
uart_xmit_wr++;
uart_xmit_wr&=UART_SEND_BUF_MSK;
UART_send_buffer[uart_xmit_wr]=ascii_table[(hi>>0x0)&0xF];
uart_xmit_wr++;
uart_xmit_wr&=UART_SEND_BUF_MSK;
UART_send_buffer[uart_xmit_wr]=ascii_table[(lo>>0x4)&0xF];
uart_xmit_wr++;
uart_xmit_wr&=UART_SEND_BUF_MSK;
UART_send_buffer[uart_xmit_wr]=ascii_table[(lo>>0x0)&0xF];
uart_xmit_wr++;
uart_xmit_wr&=UART_SEND_BUF_MSK;
if(uart_xmit_start==0x0) //* 如果需要启动发生,就启动
{ uart_xmit_start=0x1;
TI=1;
}
}
/********************************************************************************/
/* fun_name : UART_putchar() */
/* version : v1.00 */
/* created : xillinx */
/********************************************************************************/
void UART_putchar(char ch)
{ if(((uart_xmit_wr+0x1)&UART_SEND_BUF_MSK)==uart_xmit_rd) //* 缓冲区已经满了
{ return;
}
EA=0x0;
UART_send_buffer[uart_xmit_wr]=ch;
uart_xmit_wr++;
uart_xmit_wr&=UART_SEND_BUF_MSK;
if(uart_xmit_start==0x00)
{ uart_xmit_start=0x1;
TI=0x1;
}
EA=0x1;
return;
}
/********************************************************************************/
/* fun_name : UART_xmit_isr_process() */
/* version : v1.00 */
/* created : xillinx */
/********************************************************************************/
void UART_xmit_isr_process(void)
{ if(uart_xmit_wr!=uart_xmit_rd)
{ SBUF=UART_send_buffer[uart_xmit_rd];
uart_xmit_rd++;
uart_xmit_rd&=UART_SEND_BUF_MSK;
uart_xmit_start=0x1;
}
else
{ uart_xmit_start=0x0;
}
return;
}
/********************************************************************************/
/* fun_name : UART_recv_isr_process() */
/* version : v1.00 */
/* created : xillinx */
/********************************************************************************/
void UART_recv_isr_process(void)
{ unsigned char mdata;
mdata=SBUF;
if(((uart_recv_wr+0x1)&UART_RECV_BUF_MSK)==uart_recv_rd) //* 缓冲区已经满了
{ uart_recv_rd=uart_recv_wr;
return;
}
UART_recv_buffer[uart_recv_wr]=mdata;
uart_recv_wr++;
uart_recv_wr&=UART_RECV_BUF_MSK;
if(mdata==0xFF)
{ uart_recv_start=0x1;
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -