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