📄 main.c
字号:
#include "uart.h"
static int whichUart=0;
unsigned int SYS_FCLK, SYS_HCLK, SYS_PCLK;
//static unsigned int sCLKDIVN;
void Uart_Init(int pclk,int baud)
{
int i;
if(pclk == 0)
pclk = SYS_PCLK;
// pclk = PCLK;
rUFCON0 = 0x0; //UART channel 0 FIFO control register, FIFO disable
rUFCON1 = 0x0; //UART channel 1 FIFO control register, FIFO disable
rUFCON2 = 0x0; //UART channel 2 FIFO control register, FIFO disable
rUMCON0 = 0x0; //UART chaneel 0 MODEM control register, AFC disable
rUMCON1 = 0x0; //UART chaneel 1 MODEM control register, AFC disable
//UART0
rULCON0 = 0x3; //Line control register : Normal,No parity,1 stop,8 bits 祯的格式
// [10] [9] [8] [7] [6] [5] [4] [3:2] [1:0]
// Clock Sel, Tx Int, Rx Int, Rx Time Out, Rx err, Loop-back, Send break, Transmit Mode, Receive Mode
// 0 1 0 , 0 1 0 0 , 01 01
// PCLK Level Pulse Disable Generate Normal Normal Interrupt or Polling
rUCON0 = 0x245; // Control register
rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 ); //Baud rate divisior register 0 加上0.5的原因是减少误差
//比如0-0.4 加上0.5后为0.5-0.9 (int)后还是0 而0.6-0.9加后为1.1-1.4 (int)为1
//UART1
rULCON1 = 0x3;
rUCON1 = 0x245;
rUBRDIV1=( (int)(pclk/16./baud+0.5) -1 );
//UART2
rULCON2 = 0x3;
rUCON2 = 0x245;
rUBRDIV2=( (int)(pclk/16./baud+0.5) -1 );
for(i=0;i<100;i++);
}
void Uart_Select(int ch)
{
whichUart = ch;
}
void putch(int data)
{
if(whichUart==0)
{
if(data=='\n')
{
while(!(rUTRSTAT0 & 0x2));
//because the slow response of hyper_terminal
WrUTXH0('\r');
}
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
WrUTXH0(data);
}
else if(whichUart==1)
{
if(data=='\n')
{
while(!(rUTRSTAT1&0x2));
WrUTXH1='\r';
}
while(!(rUTRSTAT1 & 0x2)); //Wait until THR is empty.
WrUTXH1=data;
}
else if(whichUart==2)
{
if(data=='\n')
{
while(!(rUTRSTAT2&0x2));
WrUTXH2('\r');
}
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
WrUTXH2(data);
}
}
void puts(char *pt)
{
while(*pt)
putch(*pt++);
}
/**********************************************
//<stdarg.h>是一个函数库,提供定义参数数目可变的函数的工具
<stdarg.h>
在这个头文件中定义了一些宏和类型,用来实现可变参数函数.
va_list 可变参数表类型.
va_start 设置可变参数表头的宏
va_arg 检索当前参数的宏
va_end 清除可变参数列表的宏,是的函数能够返回.
//vsprintf() va_list va_start()可以增加程序的灵活性;如数据长度和类型
**************************************************/
//也可直接用puts()代替Uart_Printf()
typedef int *__va_list[1];
int vsprintf(char * /*s*/, const char * /*format*/, __va_list /*arg*/);
void Uart_Printf(char *fmt,...)
{
va_list ap;
char string1[100];
va_start(ap,fmt);
vsprintf(string1,fmt,ap);
puts(string1);
va_end(ap);
}
char getch(void)
{
if(whichUart==0)
{
while(!(rUTRSTAT0 & 0x1)); //Receive data ready
return RdURXH0();
}
else if(whichUart==1)
{
while(!(rUTRSTAT1 & 0x1)); //Receive data ready
return RdURXH1();
}
else if(whichUart==2)
{
while(!(rUTRSTAT2 & 0x1)); //Receive data ready
return RdURXH2();
}
return 0;
}
static void SetHclkPclk()
{
if(sCLKDIVN&2)
SYS_HCLK = SYS_FCLK>>1;
else
SYS_HCLK = SYS_FCLK;
if(sCLKDIVN&1)
SYS_PCLK = SYS_HCLK>>1;
else
SYS_PCLK = SYS_HCLK;
}
/******************
只用AHB;
static void SetHclkPclk()
{
if(sCLKDIVN==0x3)
SYS_PCLK = SYS_FCLK>>2;
else if(sCLKDIVN==0x2)
SYS_PCLK = SYS_FCLK>>1;
else if(sCLKDIVN==0x1)
SYS_PCLK = SYS_FCLK;
}
只用APB;
static void SetHclkPclk()
{
if(sCLKDIVN==0x2)
SYS_PCLK = SYS_FCLK>>1;
else if(sCLKDIVN==0x1)
SYS_PCLK = SYS_FCLK;
}
********************/
void SetSysFclk(unsigned int val)
{
unsigned int i, freq;
unsigned char mdiv, pdiv, sdiv;
//if(SlowMode)
// return FALSE;
mdiv = (val>>12)&0xff;
pdiv = (val>>4)&0x3f;
sdiv = val&0x3;
i = (pdiv+2);
while(sdiv--)
i *= 2;
freq = ((mdiv+8)*EXT_XTAL_FREQ)/i;
rMPLLCON = val;
SYS_FCLK = freq;
}
void SetClockDivider(int hdivn, int pdivn)
{
// hdivn,pdivn FCLK:HCLK:PCLK
// 0,0 1:1:1
// 0,1 1:1:2
// 1,0 1:2:2
// 1,1 1:2:4
// if(SlowMode)
// return;
hdivn &= 1;
pdivn &= 1;
sCLKDIVN = (hdivn<<1)|pdivn;
rCLKDIVN = sCLKDIVN;
// if(hdivn)
// MMU_SetAsyncBusMode();
// else
// MMU_SetFastBusMode();
SetHclkPclk();
}
void Main()
{
//Uart_Printf("")
//unsigned int rs232[11]={0xff,0xff,0xff,0x2,0x9,0x5,0x6,0x7,0x8,0x9,0x10};//,0x1,0x1,0x2,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x010,0x11,0x23,0x23,0x0};
unsigned int rs232=2;
//unsigned char rs232[5]={255,255,255,255,255};
//unsigned char num=0xff;
//char c=96;
int i;
//int j;
SetSysFclk(DFT_FCLK_VAL);
SetClockDivider(1, 1);
Uart_Select(0);
Uart_Init(0,Baud);
//putch(3);
//for(;;)
//{
for(;;)
{
Uart_Printf("%d",rs232);
}
//}
//while(1)
//{
//Uart_Printf("%d",num);
//}
//Uart_Printf("anhuiuniversity\n");
//for( i=1;i<=9;i++)
//{
// for( j=1;j<=i;j++)
// Uart_Printf("%d*%d=%d\t",i,j,i*j);
//Uart_Printf("\n");
//}
//while(1)
//{
//c=getch();
//Uart_Printf("%c",c);
//Uart_Printf("your char is:%c\n",c);
//}
//Uart_Printf("anhuiuniversity");*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -