📄 uart.c
字号:
//-----------------------------------------------------------------------------
//
// file: uart.c
// description: demonstration program, USB-UART
// Version:
//
//-------------------------------------------------------------------------------
#pragma SFR
#pragma NOP
#pragma DI
#pragma EI
#pragma interrupt INTST6 UART_TxInt
#pragma interrupt INTSR6 UART_RxInt
///////////////////////////////////////////////////////////////////////////////
// Include
#include "../include/config.h"
#include <mac_headers.h>
#include "../include/780547.h"
#include "../include/mac_def.h"
///////////////////////////////////////////////////////////////////////////////
// variables
static BYTE g_TxBuffer[COMM_BUFFER_SIZE]; // tx buffer
static BYTE g_TxCount = 0; // tx bytes
static BYTE *g_TxPtr; // tx pointer
BYTE g_RxBuffer[COMM_BUFFER_SIZE]; // rx buffer
BYTE g_RxCount = 0; // rx bytes
BOOL g_RxLine = FALSE; // line receive
static BYTE *g_RxPtr; // rx pointer
//-------------------------------------------------------------------
// baudrate
static char const g_baudrate_setting[MAX_BAUD_RATES][2] = {
// Main system clock is 16MHz
{CKSEL_9600, BRGC_9600}, // 9600 n=4
{CKSEL_19200, BRGC_19200}, //19200 n=3
{CKSEL_38400, BRGC_38400}, //38400 n=2
};
//-------------------------------------------------------------------
// UART baudrate
void UART_SetSpeed( // __fn__
unsigned short speed
)
{
char index;
unsigned char psw_flag;
switch(speed) {
case BPS_9600:
index = 0;
break;
case BPS_19200:
index = 1;
break;
default:
index = 2;
break;
}
UART_MODE = (ASIM_POWER | ASIM_CL); // clock start, rx/tx disable
NOP(); // Wait for safe, before POWER down
UART_MODE = (ASIM_CL | ASIM_ISRM); // Stop clock
UART_MODE = (ASIM_POWER | ASIM_CL | ASIM_ISRM); // clock restart
UART_CLOCK = g_baudrate_setting[index][0]; // set the baudrate
UART_BRGC = g_baudrate_setting[index][1];
UART_MODE = (ASIM_POWER | ASIM_TXE | ASIM_RXE | ASIM_CL | ASIM_ISRM); // tx/rx restart
}
//-------------------------------------------------------------------
// UART tx interrupt
__interrupt void UART_TxInt() // __fn__
{
DI();
// transmit all data ?
if (g_TxCount == 0) {
EI();
return;
}
// write tx data
do {
UART_TX = *g_TxPtr++;
g_TxCount--;
} while( !(UART_TX_STATUS & ASIF_TXBF) && g_TxCount>0);
EI();
}
//-------------------------------------------------------------------
// UART rx interrupt
__interrupt void UART_RxInt() // __fn__
{
volatile unsigned char b;
b = UART_RX_STATUS;
// check error.
if (b & (ASIS_PE | ASIS_FE | ASIS_OVE)) {
b = UART_RX; // dummy read for clear errors.
return;
}
// store receive data into buffer.
b = UART_RX;
if (g_RxCount < COMM_BUFFER_SIZE) {
*g_RxPtr++ = b;
g_RxCount++;
}
// [line feed] notice end of command line.
if (b == CODE_LF) {
// mask rx interrupt
UART_RX_INT_MASK = TRUE;
g_RxLine = TRUE;
}
}
//-------------------------------------------------------------------
// first UART transmit
int UART_write( // __fn__
BYTE *buffer,
BYTE len
)
{
// to keep tx data, copy it into tx buffer.
if (len > COMM_BUFFER_SIZE) len = COMM_BUFFER_SIZE;
memcpy(g_TxBuffer, buffer, len);
g_TxCount = len;
g_TxPtr = g_TxBuffer;
// write tx data
do {
UART_TX = *g_TxPtr++;
g_TxCount--;
} while( !(UART_TX_STATUS & ASIF_TXBF) && g_TxCount>0);
return 1;
}
//-------------------------------------------------------------------
// start UART transmit
int UART_StartTx( // __fn__
char *buffer
)
{
int status;
BYTE len;
// wait until last tx end.
while(g_TxCount > 0) {
NOP();
NOP();
}
DI();
len = (BYTE) strlen((char *)buffer);
// after this routine, tx empty interrupt routine transmits rest of tx data.
status = UART_write((BYTE *)buffer, len);
EI();
return status;
}
//-------------------------------------------------------------------
// Start UART receive.
int UART_StartRx() // __fn__
{
// initialize rx buffer.
g_RxCount = 0;
g_RxPtr = &g_RxBuffer[0];
g_RxLine = FALSE;
// enable rx interrupt.
UART_RX_INT_MASK = FALSE;
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -