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

📄 uart.c

📁 silicon wireless开发套件F920+Si4432原理图,源码
💻 C
字号:
/*
** ============================================================================
**
** FILE
**  uart.c
**
** DESCRIPTION
**  Contains the UART functions.
**
** CREATED
**  Silicon Laboratories Hungary Ltd
**
** COPYRIGHT
**  Copyright 2008 Silicon Laboratories, Inc.  
**	http://www.silabs.com
**
** ============================================================================
*/
/*------------------------------------------------------------------------*/
/*						INCLUDE											  */
/*------------------------------------------------------------------------*/
#include "uart.h"
#include "global_definitions.h"
#ifdef USB_CONNECTION_SUPPORT
 #include "USB_connection.c"
#endif

/*------------------------------------------------------------------------*/
/*						GLOBAL variables								  */
/*------------------------------------------------------------------------*/

bit fUartCommandReceived, fCharSent;
idata uint8	UartRxPointer;	
idata uint8 UartRxBuffer[UART_RX_BUFFER_SIZE], UartRxMessage[UART_RX_BUFFER_SIZE];
idata uint8 UartEcho;


/*------------------------------------------------------------------------*/
/*						LOCAL function prototypes						  */
/*------------------------------------------------------------------------*/

void _PrintOk(void);
void _PrintWrongParam(void);

/*------------------------------------------------------------------------*/
/*						UART INTERRUPT									  */
/*------------------------------------------------------------------------*/
INTERRUPT(Uart0_ISR, INTERRUPT_UART0)
{
	//check RX interrupt
	if( RI0 == 1 )
	{
		//clear IT Flag
		RI0 = 0;
		UartRxISR();
	}
	if( TI0 == 1 )
	{
		TI0 = 0;
		fCharSent = 1;
	}
}


/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  +
  + FUNCTION NAME:  void UartInit(void)
  +
  + DESCRIPTION:    initialize the UART peripheral
  +
  + RETURN:         None
  +
  + NOTES:          
  +
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

void UartInit(void)
{

	SCON0 = 0x10;                      // SCON0: 8-bit variable bit rate
                                       //        level of STOP bit is ignored
                                       //        RX enabled
                                       //        ninth bits are zeros
                                       //        clear RI0 and TI0 bits
   #if (SYSCLK/BAUDRATE/2/256 < 1) 
      TH1 = -(SYSCLK/BAUDRATE/2);
      CKCON &= ~0x0B;                  // T1M = 1; SCA1:0 = xx
      CKCON |=  0x08;
   #elif (SYSCLK/BAUDRATE/2/256 < 4) 
      TH1 = -(SYSCLK/BAUDRATE/2/4);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 01
      CKCON |=  0x01;
   #elif (SYSCLK/BAUDRATE/2/256 < 12) 
      TH1 = -(SYSCLK/BAUDRATE/2/12);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 00
   #else 
      TH1 = -(SYSCLK/BAUDRATE/2/48);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 10
      CKCON |=  0x02;
   #endif

   TL1 = TH1;                          // init Timer1
   TMOD &= ~0xf0;                      // TMOD: timer 1 in 8-bit autoreload
   TMOD |=  0x20;
   TR1 = 1;                            // START Timer1
   TI0 = 1;                            // Indicate TX0 ready
   fCharSent = 1;						//Indicate putchar ready
   UartEcho = 1;						//set UART echo mode to 1
   EnableUartRxIt();
}



/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  +
  + FUNCTION NAME:  void UartRxISR(void)
  +
  + DESCRIPTION:    UART Receive interrupt handler
  +
  + RETURN:         None
  +
  + NOTES:          UartInit() has to be call before
  +
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void UartRxISR(void)
{
	uint8 RxData;
	
	//get data from the register
	RxData = SBUF0;
	if( (RxData != ' ') && (RxData != CHAR_LF) )
	{
		UartRxBuffer[UartRxPointer] = RxData;
	}
	else
	{
		return;
	}
	//is the buffer full, or was the last char ENTER?
  	if( (UartRxPointer == UART_RX_BUFFER_SIZE - 1) || (UartRxBuffer[UartRxPointer] == MESSAGE_END) )
    {
    	//Message received - last char should be NULL
    	UartRxBuffer[UartRxPointer] = 0;
		UartRxPointer = 0;
		strcpy((uint8*)UartRxMessage,(uint8*)UartRxBuffer);
		fUartCommandReceived = TRUE;
    }
  	else
    {
    	//if the last char was not back space, then inc the pointer
    	if( !(UartRxBuffer[UartRxPointer] == CHAR_BACKSPACE) )
      		UartRxPointer++;
    	else
      	{
     		if(UartRxPointer > 0)
        	UartRxPointer--;
      	}
    }
}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  +
  + FUNCTION NAME:  char putchar(char c)
  +
  + DESCRIPTION:    prints one character into the serial port
  +
  + RETURN:         None
  +
  + NOTES:          UartInit() has to be call before
  +
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
char putchar(char c)
{
	while( fCharSent == 0);
	fCharSent = 0;
	SBUF0 = c;
	
#ifdef __C51__
   return c;
#elif defined SDCC

#endif
}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  +
  + FUNCTION NAME:  void CommandInterpreter(void)
  +
  + DESCRIPTION:    it check the received string and execute the operation
  +					if it is a valid UART command
  +
  + RETURN:         None
  +
  + NOTES:          UartInit() has to be call before
  +
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void UartCommandInterpreter(void)
{
	/*ENTER*/
	if( UartRxMessage[0] == 0 )
	{
		printf("\n\r>");
		return;
	}

#ifdef USB_CONNECTION_SUPPORT
	if( USBConnectionSupport( (uint8*)&UartRxMessage[0] ) )
	{
		_PrintOk();
		return;
	}
#endif

	/*INVALID COMMAND*/
	_PrintWrongParam();
}

/*------------------------------------------------------------------------*/
/*						LOCAL functions 								  */
/*------------------------------------------------------------------------*/
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  +
  + FUNCTION NAME: void _PrintOk(void)
  +
  + DESCRIPTION: print OK and new prompt  
  +
  + RETURN:         
  +
  + NOTES:          
  +
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void _PrintOk(void)
{
	switch(UartEcho)
	{
		case 0:
		case 1:
		case 2:
		 printf("\n\rOK\n\r>"); 
		break;

		default:
	     printf("\n\r>");
		break;
	}
}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  +
  + FUNCTION NAME: void _PrintWrongParam(void)
  +
  + DESCRIPTION: print worng parameter message  
  +
  + RETURN:         
  +
  + NOTES:          
  +
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void _PrintWrongParam(void)
{
	printf("\n\rERROR\n\r>");
}



⌨️ 快捷键说明

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