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

📄 serial.c

📁 realview22.rar
💻 C
字号:
/*
** Copyright (C) ARM Limited, 2004. All rights reserved.
*/

/* serial.c */

/*
** This implements a simple (polled) RS232 serial driver for the
** ARM Versatile Board.
**
** It outputs single characters on Serial Port A at 38400 Baud,
** 8 bit, no parity, 1 stop bit.
**
** Initialize the port with init_serial_A() before calling sendchar().
**
** To monitor the characters output, use a null-modem cable to
** connect Serial Port A to an RS232 terminal or PC running a
** terminal emulator, e.g. HyperTerminal.
*/

/*
** The UART register locations are defined in the scatter file
*/

#include "uart.h"

extern struct uart uart0;

#define UART0_DR   uart0.dr
#define UART0_RSR  uart0.ecr
#define UART0_ECR  uart0.ecr
#define UART0_LCRH uart0.lcrh
#define UART0_LCRM uart0.lcrm
#define UART0_LCRL uart0.lcrl
#define UART0_CR   uart0.cr
#define UART0_FR   uart0.fr
#define UART0_IIR  uart0.iir
#define UART0_ICR  uart0.iir
#define UART0_IBRD uart0.ibrd
#define UART0_FBRD uart0.fbrd
#define UART0_LCRH11 uart0.lcrh11
#define UART0_CR11 uart0.cr11


void init_serial_A(void)
{
  unsigned int temp;
  unsigned int divider;
  unsigned int remainder;
  unsigned int fraction;
  unsigned int ref_clk;

  /* First disable everything */
  UART0_CR11 = 0;

  /* Set baud rate
   *
   * IBRD = UART_CLK / (16 * BPS)
   * FBRD = ROUND((64 * MOD(UART_CLK,(16 * BPS))) / (16 * BPS))
   */
  temp      = 16 * UART_SPEED;
  ref_clk   = 24000000;
  divider   = ref_clk / temp;
  remainder = ref_clk % temp;
  temp      = (8 * remainder) / UART_SPEED;
  fraction  = (temp >> 1) + (temp & 1);
  UART0_IBRD = divider;
  UART0_FBRD = fraction;

  /* Must be written last (after IBRD & FBRD)
   * Set the UART to be 8 bits, 1 stop bit, no parity, fifo enabled.
   */
  UART0_LCRH11 = (LCRH_Word_Length_8 | UART_PL011_LCRH_FEN);

  /* Finally, enable the UART */
  UART0_CR11 = (CR_UART_Enable | UART_PL011_CR_TXE | UART_PL011_CR_RXE);

}

void sendchar(unsigned char *ch)
{
  while (UART0_FR & FR_TX_Fifo_Full)
    ;
  if (*ch == '\n')                    // Replace line feed with '\r'
    *ch = '\r';
  UART0_DR = *ch;                     // Transmit next character
}

char receive_char(void)
{
  volatile char status;
  volatile char ch = '0';

  while (UART0_FR & FR_RX_Fifo_Empty) // wait until we receive a byte
    ;
  ch = UART0_DR;         // receive character
  status = UART0_RSR;    // read the status register

  /* Could check status receive status here */
  return ch;
}

⌨️ 快捷键说明

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