📄 serial.c
字号:
/******************************************************************************/
/* This file is part of the kp weather station */
/******************************************************************************/
/* */
/* SERIAL.C: Low Level Serial Routines */
/* */
/******************************************************************************/
/* Universal Asynchronous Receiver Transmitter 1 (UART1) */
//#define U1RBR Read Data
//#define U1THR Write Data
//#define U1IER Interrup Enable
//#define U1IIR Interrupr ID register (RO)
//#define U1FCR FIFO control register
//#define U1LCR Line control register
//#define U1MCR Modem control reg
//#define U1LSR Modem status reg
//#define U1MSR Line status reg
//#define U1SCR sratch pad register
//#define U1DLL Divider latch register (LSB)
//#define U1DLM Divider latch register (MSB)
#include <LPC213x.H> /* LPC21xx definitions */
#include <LPC213x.H> // LPC21xx definitions
#include <bsp.h> // include board support package
#define CR 0x0D
#define LF 0x0A
#define NULL 0x00
extern void set_LED (unsigned char led_no, unsigned char led_cmd);
extern void wr_byte(unsigned char a, unsigned char b);
extern void wr_hex(unsigned char b);
// Real-time clock interrupt routine
void uart1 (void) __irq {
unsigned char int_reg;
unsigned char rx_char;
unsigned char temp;
int_reg = U1IIR; // must read U1IIR to clear UART interrupt flag
switch (int_reg)
{
case 0x06: // int fromOE, PE, FE, or BI
{
temp = U1LSR; // clear interrupt
break;
}
case 0x04: // Rx char available
{
U1SCR &= 0xFB; // dissable kp_printf(...)
rx_char = U1RBR; // get char and clears the interrupt
wr_hex(rx_char);
// U1THR = rx_char; // echo character
if (rx_char == CR) {
U1SCR |= 0x04; // enable kp_printf(...)
U1THR = rx_char; // echo character
}
break;
}
case 0xC0: // Rx FIFO limit
{
break;
}
case 0x02: // THRE
{
// no special read required since U1IIR has been read
break;
}
case 0x00: // CTS or DSR
{
temp = U1MSR; // clear interrupt
break;
}
}
if ((U1SCR & 0x01) == 0x01) {
set_LED(3,1);
U1SCR &= 0xFE; }
else {
set_LED(3,0);
U1SCR |= 0x01; }
VICVectAddr = 0; // Acknowledge Interrupt
}
void init_serial (void) { /* Initialize Serial Interface */
// PINSEL0 = 0x00050000; /* Enable RxD1 and TxD1 */
U1LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */
U1DLL = 97; /* use 24 for 38400 Baud Rate @ 15MHz VPB Clock (was 97 or 9600 BOAD) */
U1LCR = 0x03; /* DLAB = 0 */
U1IER = 0x01; // Enable reciever data available interrupt
U1SCR = 0x05; // set two flag in UART 1 scratch pad
// 0x01 LED blinker
// 0x04 enable kp_printf(...)
VICVectAddr4 = (unsigned long)uart1; // set interrupt vector in 4
VICVectCntl4 = 0x20 | 7; // use it for UART 1 clock
}
int putchar (int ch) { // Write character to Serial Port
if (ch == '\n') {
while (!(U1LSR & 0x20));
U1THR = CR; // output CR
}
while (!(U1LSR & 0x20));
return (U1THR = ch);
}
int getchar (void) { // Read character from Serial Port
while (!(U1LSR & 0x01));
return (U1RBR);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -