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

📄 usart.c

📁 atmel ARM7单片机at91sam7x256软件中断实验程序
💻 C
字号:

/**************************************************************************************************
*
* Copyright (C) ART Limited, 2006. All rights reserved.
* 
* File:          usart.c
* Programmed by: allan
* Data:          2006.12.18
* 
**************************************************************************************************/

// Include Standard files
#include "Board.h"
#include <stdarg.h>
#include <stdio.h>

#define USART_INTERRUPT_LEVEL		7
static const char atmel_header[]=
{
"\n\r  *** ATMEL Usart IRQ ***\n\r"
"Copyright (C) 2002 ATMEL Corporations Version: 1.0\n\r"
};

//* \fn    AT91F_US_Baudrate
//* \brief Calculate the baudrate
//* Standard Asynchronous Mode : 8 bits , 1 stop , no parity
#define AT91C_US_ASYNC_MODE ( AT91C_US_USMODE_NORMAL + \
                        AT91C_US_NBSTOP_1_BIT + \
                        AT91C_US_PAR_NONE + \
                        AT91C_US_CHRL_8_BITS + \
                        AT91C_US_CLKS_CLOCK )

/*******************************************************************************
 * 说明: AT91F_DBGU_Get函数,从DEBUG串口获得一个字符
 * 参数: char *val
 * 返回值:unsigned int
 *         1:失败
 *         0:成功
*******************************************************************************/
unsigned int AT91F_DBGU_Get( char *val)
{
    if ((AT91F_US_RxReady((AT91PS_USART)AT91C_BASE_DBGU)) == 0)
        return (1);
    else {
        *val= AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU);
        return (0);
    }
}

/*******************************************************************************
 * 说明:AT91F_DBGU_scanf函数,从DEBUG串口获得一个字符串
 * 参数:char * type,unsigned int * val
 * 返回值:无
*******************************************************************************/
void AT91F_DBGU_scanf(char * type,unsigned int * val) 
{
    unsigned int read = 0;
    char buff[10];
    unsigned int nb_read =0;

    while( (read != 0x0D) & (nb_read != sizeof(buff)) ) 
      {
	      while((AT91C_BASE_DBGU->DBGU_CSR  & AT91C_US_RXRDY) == 0 ); // 等待串口准备好
	      read = AT91C_BASE_DBGU->DBGU_RHR;      // 获得一个字符
          buff[nb_read]= (char)read;
          while((AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY) ==0)  {}
          if ((char)read == 0x08) 
            {
                if ( nb_read != 0 ) 
                  {
                      nb_read--;
                      AT91C_BASE_DBGU->DBGU_THR = read;
                  }
            }
        else
          {
              AT91C_BASE_DBGU->DBGU_THR = read;     //* echo
              nb_read++;
          }
    }
    sscanf(buff,type,val);                      // 扫描值
}

//*--------------------------1--------------------------------------------------
//* \fn    AT91F_DBGU_Printk
//* \brief This function is used to send a string through the DBGU channel (Very low level debugging)
//*----------------------------------------------------------------------------
void AT91F_DBGU_Printk(	char *buffer)
{
    AT91PS_DBGU pDbgu = AT91C_BASE_DBGU ;
    unsigned int temp;

    while(*buffer != '\0')
    {
        temp=0;

	while (temp==0)
	{
	  if ( (pDbgu->DBGU_CSR & 0x0200) == 0)
	    temp=0;
	  else
	    temp=1;
	}

        pDbgu->DBGU_THR = *buffer;
        buffer++;
    }
}

//* \If you don't use vsprintf(), the code size is reduced very much.

int vsprintf(char * /*s*/, const char * /*format*/, va_list /*arg*/);

void AT91F_DBGU_Printf(char *fmt, ...)
{
    va_list ap;
    char string[256];

    va_start(ap,fmt);
    vsprintf(string,fmt,ap);
    AT91F_DBGU_Printk(string);
    va_end(ap);
}


void Init_DBGU_CLK(void)
{
  AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, ((unsigned int) 1 << AT91C_ID_SYS));
}

void Init_DBGU_BGR(unsigned short baud)
{
  AT91PS_DBGU pDbgu = AT91C_BASE_DBGU ;

  pDbgu->DBGU_BRGR = (unsigned short)baud;
}

void DBGU_TX_Enable(void)
{
  AT91PS_DBGU pDbgu = AT91C_BASE_DBGU ;

  pDbgu->DBGU_CR = 0x00000040;
}

void DBGU_RX_Enable(void)
{
  AT91PS_DBGU pDbgu = AT91C_BASE_DBGU ;

  pDbgu->DBGU_CR = 0x00000010;
}

void DBGU_RX_TX_RST_DIS(void)
{
  AT91PS_DBGU pDbgu = AT91C_BASE_DBGU ;
  pDbgu->DBGU_CR = 0x000000AC;
}

void DBGU_Parity_Cfg(unsigned int par)
{
  AT91PS_DBGU pDbgu = AT91C_BASE_DBGU ;

  pDbgu->DBGU_MR = par << 9;
}


void Init_DBGU(void)
{
  AT91F_DBGU_CfgPIO();
  DBGU_RX_TX_RST_DIS();
  Init_DBGU_BGR(26);    //26 <=> 115kBd
  DBGU_Parity_Cfg(4);
  DBGU_TX_Enable();
  DBGU_RX_Enable();
}



//*----------------------------------------------------------------------------
//* Function Name       : Usart0_c_irq_handler
//* Object              : C handler interrupt function called by the interrupts
//*                       assembling routine
//* Input Parameters    : <RTC_pt> time rtc descriptor
//* Output Parameters   : increment count_timer0_interrupt
//*----------------------------------------------------------------------------
void Usart_c_irq_handler(void)
{
	AT91PS_USART USART_pt = AT91C_BASE_US0;
	unsigned int status;
	//* get Usart status register
	status = USART_pt->US_CSR;
	if ( status & AT91C_US_RXRDY){
		//* Get byte and send
		AT91F_US_PutChar (USART_pt, AT91F_US_GetChar(USART_pt));
	}

	if ( status & AT91C_US_OVRE) {
		//* clear US_RXRDY
		 AT91F_US_GetChar(USART_pt);
		 AT91F_US_PutChar (USART_pt, 'O');
	}

	//* Check error
	if ( status & AT91C_US_PARE) {
		 AT91F_US_PutChar (USART_pt, 'P');
	}

	if ( status & AT91C_US_FRAME) {
		 AT91F_US_PutChar (USART_pt, 'F');
	}

	if ( status & AT91C_US_TIMEOUT){
		USART_pt->US_CR = AT91C_US_STTTO;
		 AT91F_US_PutChar (USART_pt, 'T');
	}

	//* Reset the satus bit
	 USART_pt->US_CR = AT91C_US_RSTSTA;
}
//*-------------------------- External Function -------------------------------

//*----------------------------------------------------------------------------
//* Function Name       : Init_Uart0
//* Object              : USART0 initialization
//* Input Parameters    : none
//* Output Parameters   : TRUE
//*----------------------------------------------------------------------------
void Init_Uart0 ( void )
//* Begin
{
	AT91PS_USART COM0 = AT91C_BASE_US0;

 	//* Configure PIO controllers to periph mode
 	AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA,
 		((unsigned int) AT91C_PA0_RXD0    ) |
 		((unsigned int) AT91C_PA1_TXD0    ) |
 		((unsigned int) AT91C_PA3_RTS0    ) |
 		((unsigned int) AT91C_PA4_CTS0    ), // Peripheral A
 		0); // Peripheral B


   	// First, enable the clock of the PIOB
   	AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_US0 ) ;
	// Usart Configure
    AT91F_US_Configure (COM0, MCK, AT91C_US_ASYNC_MODE, UART0_BAUD_RATE, 0);

	// Enable usart
	COM0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;

    //* Enable USART IT error and RXRDY
    AT91F_US_EnableIt(COM0,AT91C_US_TIMEOUT | AT91C_US_FRAME | AT91C_US_OVRE |AT91C_US_RXRDY);

    	//* open Usart 1 interrupt
	AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_US0, USART_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, Usart_c_irq_handler);
	AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0);

//	AT91F_US_PutChar (COM0,'X');

// 	AT91F_US_SendFrame(COM0,(char *)atmel_header,sizeof(atmel_header),0,0);


//* End
}



⌨️ 快捷键说明

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