⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 ARM9的串口开发实例
💻 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 + -