📄 uart.c
字号:
WriteReg(UART0_TXFIFO,'B');
WriteReg(UART0_TXFIFO,'A');
WriteReg(UART0_TXFIFO,'C');
WriteReg(UART0_TXFIFO,'K');
WriteReg(UART0_TXFIFO,' ');
WriteReg(UART0_TXFIFO,'M');
WriteReg(UART0_TXFIFO,'O');
WriteReg(UART0_TXFIFO,'D');
WriteReg(UART0_TXFIFO,'E');
WriteReg(UART0_TXFIFO,' ');
WriteReg(UART0_TXFIFO,'O');
WriteReg(UART0_TXFIFO,'K');
WriteReg(UART0_TXFIFO,'!');
WriteReg(UART0_TXFIFO,'\n');
for(i=0;i<100;i++);
WriteReg(UART0_MCR,0x16);
for(i=0;i<300;i++);
ReadReg(UART0_MSR);
for(i=0;i<2500;i++);
return 0;
}
/*************************************************************************/
/* FUNCTION */
/* */
/* UartLoopbackTest */
/* */
/* DESCRIPTION */
/* */
/* 该函数的作用是用来把数据打印到上位机超级终端。 */
/* */
/* AUTHOR */
/* */
/* QI Haochun, ASIC&Prochip. */
/* */
/* INPUTS */
/* */
/* char *s,U32 uart_add */
/* */
/* */
/* OUTPUTS */
/* */
/* 1:success */
/* 0:error */
/* */
/********************print************************************************/
/*************************************************************************/
void Prints(char *s,U32 uart_add) //把数据打印到上位机超级终端
{
int i;
while(*s != '\0')
{
{
*(RP)(uart_add) = *s++; //利用指针传输数据,这个是硬件管理的,我们只要把指针指向首数据地址,并且建立循环
}
for(i=0; i<5000 ; i++) ;
}
*(RP)uart_add = '\n';
return;
}
/*************************************************************************/
/* FUNCTION */
/* */
/* UartPcTest */
/* */
/* DESCRIPTION */
/* */
/* 该函数的作用是用来测试UART和PC的通信。 */
/* */
/* AUTHOR */
/* */
/* QI Haochun, ASIC&Prochip. */
/* */
/* INPUTS */
/* */
/* U32 uart_add,U32 sysclk,U32 baudrate,U32 data_bit */
/* U32 tri_level_t,U32 tri_level_r */
/* */
/* OUTPUTS */
/* */
/* None */
/* */
/* */
/************************test point 5:UART-PC*****************************/
/*************************************************************************/
void UartPcTest(U32 uart_add,U32 sysclk,U32 baudrate,U32 data_bit,U32 tri_level_t,U32 tri_level_r)
{
U32 baud,bit1,triger_r,triger_t,baudh,baudl;
baud = sysclk/16/baudrate;
baudh = baud >> 8; //波特率高8位
baudl = baud & 0xff; //波特率低8位
switch(data_bit) //bit的第八位设为1,即访问divisor latch寄存器
{
case 5: bit1 = 0x80;
break;
case 6: bit1 = 0x81;
break;
case 7: bit1 = 0x82;
break;
case 8: bit1 = 0x83;
break;
default: ;
break;
}
// bit1 = bit1|0x0b; //奇校验,1个停止位
WriteReg((uart_add+0x0c),bit1);
WriteReg((uart_add+0x04),baudh);
WriteReg((uart_add+0x00),baudl);
bit1 &= (~(0x1<<7)); //设置访问普通寄存器
WriteReg((uart_add+0x0c),bit1);
//配置发送FIFO触发级
switch(tri_level_t) //UART0 发送
{
case 0: triger_t = 0x0;
break;
case 2: triger_t = 0x1;
break;
case 4: triger_t = 0x2;
break;
case 8: triger_t = 0x3;
break;
}
triger_t = (triger_t<<4); //该通道发送触发级即为(0x00)
WriteReg((uart_add+0x08),triger_t);
/////////////////////////////接收/////////////////////////////////////
switch(tri_level_r)
{
case 1: triger_r = 0x0;
break;
case 4: triger_r = 0x1;
break;
case 8: triger_r = 0x2;
break;
case 14:triger_r = 0x3;
break;
}
triger_r = (triger_r<<6); //该通道发送触发级即为0(0x00)
WriteReg((uart_add+0x08),triger_r);
WriteReg((uart_add+0x04),0x00);
UartIntEn(uart_add,1, 0); //配置中断触发
}
/*************************************************************************/
/* FUNCTION */
/* */
/* Uart0IntEn */
/* */
/* DESCRIPTION */
/* */
/* 该函数的作用是判断uart0是否准备接收和发送数据, */
/* 从而决定FIFO的使能控制。 */
/* */
/* AUTHOR */
/* */
/* QI Haochun, ASIC&Prochip. */
/* */
/* INPUTS */
/* */
/* S8 recie, S8 thrie */
/* */
/* */
/* OUTPUTS */
/* */
/* None */
/* */
/* */
/*************************************************************************/
void UartIntEn(U32 uart_add, S8 recie, S8 thrie) //判断uart0是否准备接收和发送数据,从而决定FIFO的使能控制
{
U32 UART_IER;
switch (uart_add)
{
case 0x10005000:
UART_IER = UART0_IER;
break;
case 0x10006000:
UART_IER = UART1_IER;
break;
case 0x10007000:
UART_IER = UART2_IER;
break;
case 0x10008000:
UART_IER = UART3_IER;
break;
default:
UART_IER = UART0_IER;
break;
}
if(recie == 1)//uart0准备好接收数据
read_reg(UART_IER) |= 0x1;//开接收FIFO触发级中断使能/*received data available interrupt enable*/
else
if(recie == 0)//uart0没准备接收数据
read_reg(UART_IER) &= ~0x1;//关闭接收FIFO触发级中断使能/*interrupt disable*/
if(thrie == 1)//uart0准备发送数据
read_reg(UART_IER) |= (0x1 << 1);//开发送FIFO触发级空中断使能 /*transmitter holding register empty interrupt enable*/
else
if(thrie == 0)//uart0没准备好发送数据
read_reg(UART_IER) &= ~(0x1 << 1); //关闭发送FIFO触发级空中断使能/*transmitter holding register empty interrupt disable*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -