📄 uart.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 + -