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

📄 uart.c

📁 东南大学开发ARM7芯片UART模块测试代码
💻 C
📖 第 1 页 / 共 3 页
字号:
    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 + -