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

📄 uart.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
字号:
                                    
#include "hardware.h"
#include "hardware_reg.h"
#include "HA_typedef.h"
#include "stdio.h"

int uart1_reset_value_test(void)
{
    write_reg(UART1_IER, 0x00);
    write_reg(UART1_FCR, 0xC0);
    write_reg(UART1_LCR, 0x03);
    write_reg(UART1_MCR, 0x00);
    
         
    if(read_reg(UART1_IIR) != 0xCF)
      printf("UART_IIR ERROR!\n");  
      
    if(read_reg(UART1_LCR) != 0x03)
      printf("UART_LCR ERROTR!\n");
      
    if(read_reg(UART1_LSR) != 0x00)
      printf("UART_LSR ERROR!\n");
      
    if(read_reg(UART1_MSR) != 0x00)
      printf("UART_MSR ERROR!\n");
      
   
    if((read_reg(UART1_LCR) &= (0x1 << 7) ) != 0) //LCR[7]=1, divisor latches accessed
    {  
      if(read_reg(UART1_DLL) != 0x00)   
        printf("UART_DLL ERROR!\n");
      
      if(read_reg(UART1_DLH) != 0x00)
        printf("UART_DLH ERROR!\n");  
    } 
    
}

/********************************************************************
*	PARAMETER:	sysclk:	10(10MHZ)
*     						18(18.07297MHZ)
*						21(21.6392MHZ)
*				baudrate: 115200,57600,56000,43000,38400,19200,9600
*				databit: 	5,6,7,8
*				trigerlevel:	1,4,8,14
*	RETURN:		HA_EOK
********************************************************************/
int init_uart1(U32 sysclk, U32 baudrate, U32 databit, U32 trigerlevel)
{
    U32 baud, bit, triger, baudh, baudl;
    baud  = sysclk/16/baudrate;
    baudh = baud >> 8;
    baudl = baud & 0xff;
    
    switch(databit)
    {
    	case 5: bit = 0x80;
    	     break;
    	     
    	case 6: bit = 0x81;
    	     break;
    	       
    	case 7: bit = 0x82;
    	     break;
    	     
    	case 8: bit = 0x83;
    	     break;
    	
    	default: ;
    	     break;             	  	
    }	
    
    *(RP)UART1_LCR = bit;  //divisor latch has been accessed
    
    *(RP)UART1_DLH = baudh;
    *(RP)UART1_DLL = baudl;
    
    read_reg(UART1_LCR) &= (~(0x1 << 7));  //divisor latch access disable
    
    switch(trigerlevel)
    {
    	case 1:  triger = 0x0;
    	     break;
    	     
    	case 4:  triger = 0x0;
    	     break;
    	     
    	case 8:  triger = 0x0;
    	     break;
    	     
    	case 14: triger = 0x0;
    	     break;
    	
    }
    
    *(RP)UART1_FCR = triger;
    
    *(RP)UART1_IER = 0x00; /* disable all the interrupts */
	
    return E_OK;
}


int uart1_int_en(int recie, int thrie)
{
     if(recie == 1)
        read_reg(UART1_IER) |= 0x1;           /*received data available interrupt enable*/
        
     else 
        if(recie == 0)
          read_reg(UART1_IER) &= ~0x1;        /*interrupt disable*/
        
     if(thrie == 1)
        read_reg(UART1_IER) |= (0x1 << 1);    /*transmitter holding register empty interrupt enable*/
        
     else
        if(thrie == 0)
          read_reg(UART1_IER) &= ~(0x1 << 1); /*transmitter holding register empty interrupt disable*/	
   	
     return E_OK; 
}


/***************interrupt handler for UART1***************/
extern int thr_isr_uart1(void)
{
     U32 i;
     U32 a = 0x30;
     
    // printf("UART transmiter holding register handler!\n");
     
     for(i=0; i<100; i++,a++)
         *(RP)UART1_THR = a;
         
     return E_OK;
}


extern int rda_isr_uart1(void)
{
     U32 i;
     U32 a;
     
    // printf("UART receive data available handler!\n");
     
     for(i=0; i<8; i++)
     {
         a = *(RP)UART1_RBR;
         printf("%ld\n", a); 
     }
     
     return E_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -