📄 console.c
字号:
#include <stdarg.h>
#include "44b0x.h"
#include "datatype.h"
#include "console.h"
#define Non_Cache_Start (0x2000000)
#define Non_Cache_End (0xc000000)
#define EXT_OSC_CLK 10000000
unsigned int MCLK = 60000000;
void ChangePllValue(int mdiv, int pdiv, int sdiv)
{
int i = 1;
rPLLCON = (mdiv<<12)|(pdiv<<4)|sdiv;
while(sdiv--)
i *= 2;
MCLK = (EXT_OSC_CLK*(mdiv+8))/((pdiv+2)*i);
}
void Delay(U32 time)
{
while(time--);
}
void Port_Init(void)
{
//ADB V1.0 B/D Status
//USB D12SUSPD
// PC0
//LED D0 D1 D2
// PC1 PC2 PC3
//KEY K0 K1 K2 K3
// PG4 PG5 PG6 PG7
//CAUTION:Follow the configuration order for setting the ports.
// 1) setting value
// 2) setting control register
// 3) configure pull-up resistor.
//16bit data bus configuration
//PORT A GROUP
//rPCONA[9:0]
//|BIT9 |.......................................................|BIT0
//|ADDR24|ADDR23|ADDR22|ADDR21|ADDR20|ADDR19|ADDR18|ADDR17|ADDR16|ADDR0
//| 0| 1| 1| 1| 1| 1| 1| 1| 1| 1
rPCONA=0x1ff;
//PORT B GROUP
//rPCONB[10:0]
//|BIT10|....................................................|BIT0
//|nGCS5|nGCS4|nGCS3|nGCS2|nGCS1|nWBE3|nWBE2|nSRAS|nSCAS|SCLK|SCKE
//| 1| 1| 1| 1| 1| 1| 1| 1| 1| 1| 1
rPDATB=0x3ff;
rPCONB=0x3ff;
//PORT C GROUP
//BUSWIDTH=16
//PORT C GROUP
//rPCONC[31:0]
//|GPC15|.............................................GPC5GPC4...............| GPC0
//|BIT31|....................................................................| BIT0
//|nCTS0|nRTS0|RXD1|TXD1|nCTS1|nRTS1|nEL|nDISP|VD4|VD6| | |LED2|LED1|LED0|D12SUSPD
//| 00| 00| 11| 11| 00| 00| 01| 01| 11| 11| 01| 01| 01| 01| 01| 01
//rPUPC[15:0]
//| 0| 0| 1| 1| 0| 0| 0| 0| 1| 1| 0| 0| 0| 0| 0| 0
rPDATC=0xffff; //All I/O Is High
rPCONC=0x0f05f555;
rPUPC=0x30c0; //PULL UP RESISTOR should be enabled to I/O
//PORT D GROUP
//rPCOND
//| BIT15|.........................|BIT0
//|VFRAME|VM|VLINE|VCLK|VD3|VD2|VD1|VD0
//| 10|10| 10| 10| 10| 10| 10| 10
rPDATD=0xff;
//These pins must be set only after CPU's internal LCD controller is enable
rPCOND=0xaaaa;
rPUPD=0xff;
//PORT E GROUP
//rPCONE
//| BIT17 |..............................|BIT0
//|CODECLK|PE7|PE6|BEEP|PE4|PE3|RXD0|TXD0| PE0
//| 10| 00| 00| 01| 00| 00| 10| 10| 00 -zq
//|rPUPE[7:0]
// | 0| 0| 0| 0| 0| 1| 1| 0
rPDATE=0x1ff; //All I/O Is High
rPCONE=0x20428; //All NC is INPUT
rPUPE=0x06; //PE8 do not have programmable pull-up resistor.
//PORT F GROUP
//rPCONF[21:0]
//| BIT21|....................................| BIT0
//|IISCLK|PF7|IISDO|IISLRCK|PF4|PF3|PF2|IICSDA|IICSCL
//| 100|000| 100| 100| 00| 00| 00| 10| 10
//rPUPF[8:0]
//| 1| 0| 1| 1| 0| 0| 0| 1| 1
rPDATF=0x1ff; //All I/O Is High
rPCONF=0x20900a;//All NC is INPUT
rPUPF=0x163;
//PORT G GROUP
//rPCONG[15:0]
//|BIT15|....................................| BIT0
//| KEY3|KEY2|KEY1|KEY0|EXINT3|EXINT2|NET_INT|USB_INT
//| 11| 11| 11| 11| 11| 11| 11| 11
rPDATG=0xff;
rPCONG=0xffff;
rPUPG=0x0; //should be enabled
rSPUCR=0x7; //D15-D0 pull-up disable
rEXTINT=0x0; //All EXTINT0-7 Low level interrupt
rNCACHBE0=(((Non_Cache_End)>>12)<<16)|((Non_Cache_Start)>>12);
}
void UartInit(int ch, int baud)
{
U8 a;
if(!ch)
{
rUFCON0 = 0x0;
rUMCON0 = 0x0; //禁止使用FIFO
rULCON0 = 0x3; //正常无奇偶校验,一个停止位,8个数据位
rUCON0 = 0x45; //TX RX 都用PULSE非LEVEL中断
//rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling
//rUBRDIV0 = (int)(MCLK/16./baud+0.5)-1;
rUBRDIV0 = MCLK/(16*baud);
a = rURXH0;
}
else
{
rUFCON1 = 0x0; //禁止使用FIFO
rUMCON1 = 0x0; //禁止使用FIFO
rULCON1 = 0x3; //正常无奇偶校验,一个停止位,8个数据位
rUCON1 = 0x45;
//rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling
//baud *= 16;
//rUBRDIV1 = MCLK/baud+((MCLK%baud)>=(baud/2))?1:0;
rUBRDIV1 = MCLK/(baud*16);
a = rURXH1;
}
}
void UartSend(int ch, char data)
{
if(!ch)
{
if(data=='\n')
{
while(!(rUTRSTAT0&0x2));
//改动延时时间1--10
Delay(10); //由于超级终端反应较慢,有一个微小延迟
WrUTXH0('\r');
}
while(!(rUTRSTAT0&0x2)); //等待知道THR变空
//改动延时时间1--10
Delay(10);
rUTXH0 = data;
}
else
{
if(data=='\n')
{
while(!(rUTRSTAT1&0x2));
//改动延时时间1--10
Delay(10); //由于超级终端反应较慢,有一个微小延迟
rUTXH1 = '\r';
}
while(!(rUTRSTAT1&0x2)); //等待知道THR变空
//改动延时时间1--10
Delay(10);
rUTXH1 = data;
}
}
int UartReceive(int ch)
{
if(!ch)
{
while(!(rUTRSTAT0&0x1)); //等待直到接受到一个数据
return rURXH0;
}
else
{
while(!(rUTRSTAT1&0x1)); //等待直到接受到一个数据
return rURXH1;
}
}
int UartRxStat(int ch)
{
if(!ch)
return (rUTRSTAT0&0x1);
else
return (rUTRSTAT1&0x1);
}
int UartGetch(int ch)
{
if(!ch)
{
if(rUTRSTAT0&0x1) //如果收到字符就返回该字符
return rURXH0;
else
return -1; //如果没有收到字符就返回0
}
else
{
if(rUTRSTAT1&0x1) //如果收到字符就返回该字符
return rURXH1;
else
return -1; //如果没有收到字符就返回0
}
}
int UartGetkey(int ch)
{
return ch?rURXH1:rURXH0;
}
void UartSendString(int ch, char *pt)
{
while(*pt)
UartSend(ch, *pt++);
}
/************************************************/
void console_init(int baud)
{
UartInit(CONSOLE_UART, baud);
}
void putch(char data)
{
UartSend(CONSOLE_UART, data);
}
void puts(char *str)
{
while(*str)
UartSend(CONSOLE_UART, *str++);
}
int getch()
{
return UartReceive(CONSOLE_UART);
}
int getkey()
{
return UartGetkey(CONSOLE_UART);
}
int kbhit()
{
return UartRxStat(CONSOLE_UART);
}
typedef int *__va_list[1];
int vsprintf(char * /*s*/, const char * /*format*/, __va_list /*arg*/);
void printf(char *fmt, ...)
{
va_list ap;
char string[256];
va_start(ap, fmt);
vsprintf(string, fmt, ap);
UartSendString(CONSOLE_UART, string);
va_end(ap);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -