📄 uart.c
字号:
#define UART_GLOBAL
#include "includes.h"
char rx_buf[MAX_RECV_SIZE];
char tx_buf[MAX_SEND_SIZE];
int status,control;
//unsigned char sendcount=0;
int sendcount=0;
unsigned char rx_index=0;
//unsigned char tx_index=0;
int tx_index=0;
char command_flag=0;
char com_init_flag=0;
char promptcount=0;
char sendprocessing=0; //发送允许标志
char echo=ECHOON;
void handle_uart_interrupt();
void recvProcess(unsigned char recvchar);
void sendProcess();
void sendPrompt();
void setBaudrate(int);
void uart_init() //串口初始化,等待接受命令 the clock of UART is 85M,not 50M
{
setBaudrate(115200);
alt_irq_register(UART1_IRQ,NULL,handle_uart_interrupt);
control_write(UART1_BASE,0x0040);
//baudrate_set(UART1_BASE,0x1b2);
//baudrate_set(UART1_BASE,0x2e1);//the clock of UART is 85M,not 50M
//baudrate_set(UART1_BASE,0x2296);
}
void handle_uart_interrupt(void *context,unsigned long id) //串口ISR
{
unsigned char receivechar;
status=status_read(UART1_BASE);
control=control_read(UART1_BASE);
if(status&control&RRDY_MASK) //接收准备好(可读)中断
{
if(sendprocessing==0)
{
receivechar=uart_receive(UART1_BASE);
//status_write(UART1_BASE,status&(~RRDY_MASK));
recvProcess(receivechar);
}
if(command_flag==1)
{
regularResponse(rx_buf);
sendprocessing=1;
command_flag=0;
//control_write(UART1_BASE,control&TRDY_MASK|~RRDY_MASK);
control_write(UART1_BASE,0x0040);
}
}
if(status&control&TRDY_MASK) //发送寄存器为空中断
{
if(com_init_flag==0)
{
sendPrompt();
}
if(sendprocessing!=0)
{
sendProcess();
}
}
}
void writeChar(unsigned char thechar)//写字符到tx_buf[];
{
tx_buf[sendcount++]=thechar;
}
void writeString(unsigned char *pstr)//写字符串到tx_buf[];
{
while(*pstr)
tx_buf[sendcount++]=*pstr++;
}
void uartSendChar(unsigned char thechar)//发送一个字符
{
status_write(UART1_BASE,status&(~TRDY_MASK));
uart_send(UART1_BASE,thechar);
}
void deleteChar() //Backspace键
{
writeChar(0x8);
writeChar(' ');
writeChar(0x8);
writeChar('\0');
sendcount=0;
sendprocessing=1;
control_write(UART1_BASE,0x0040);
}
void sendPrompt() //中断实现sendPrompt,不需要加延时
{
promptcount++;
status_write(UART1_BASE,status&(~TRDY_MASK));
if(promptcount==1)
uart_send(UART1_BASE,'\r');
else if(promptcount==2)
uart_send(UART1_BASE,'\n');
else
{
uart_send(UART1_BASE,'>');
com_init_flag=1;
control_write(UART1_BASE,0x0080);
promptcount=0;
sendprocessing=0;
//control_write(UART1_BASE,control&(~TRDY_MASK)|RRDY_MASK);
}
}
void setBaudrate(int baudrate) //the clock of UART is 85M,not 50M
{
int divisor;
long clock=85000000;
divisor=(int)clock/(baudrate+0.5);
baudrate_set(UART1_BASE,divisor);
}
void sendProcess()//发送处理
{
if(tx_buf[tx_index]!='\0')
uartSendChar(tx_buf[tx_index++]);
else
{
//control=control_read(UART1_BASE);
status_write(UART1_BASE,status&(~TRDY_MASK));
//control_write(UART1_BASE,control&(~TRDY_MASK)|RRDY_MASK);
control_write(UART1_BASE,0x0080);
sendprocessing=0;
tx_index=0;
}
}
void recvProcess(unsigned char recvchar)//
{
switch(recvchar)
{
case 0x8:
{
if(rx_index>0)
{
rx_index--;
if(echo)
{
//uartSendChar(0x8);
//uartSendChar(' ');
//usleep(1000); //delay x ms
//uartSendChar(0x8);
deleteChar();
}
}
break;
}
case '\r':
{
if(rx_index>0)
{
if(rx_buf[rx_index-1]!=' ')
rx_buf[rx_index]='\0';
else
rx_buf[rx_index-1]='\0';//命令后加空格与原命令等效;
command_flag=1;
rx_index=0;
}
else
{
rx_buf[0]='\0';
//command_flag=1;
sendprocessing=1;
control_write(UART1_BASE,0x0040);
writeString("\r\n\x3e");
writeChar('\0');
sendcount=0;
}
break;
}
default:
{
if(recvchar==' '&&(rx_index==0||rx_buf[rx_index-1]==' '))
return;
else
{
if(rx_index<MAX_RECV_SIZE)
{
if(echo)
{
uartSendChar(recvchar);
}
if(recvchar!='\n')
{
rx_buf[rx_index++]=recvchar;
}
}
}
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -