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

📄 serial.c

📁 lpc2138读写SD卡的fat文件系统
💻 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 + -