?? uart.c
字號:
/******************************************************************************
*
* $RCSfile: $
* $Revision: $
*
* This module provides interface routines to the LPC ARM UARTs.
* Copyright 2004, R O SoftWare
* No guarantees, warrantees, or promises, implied or otherwise.
* May be used for hobby or commercial purposes provided copyright
* notice remains intact.
*
* reduced to see what has to be done for minimum UART-support by mthomas
*****************************************************************************/
// #warning "this is a reduced version of the R O Software code"
#include "lpc210x_gnuarm.h"
#include "uart.h"
/* on LPC210x: UART0 TX-Pin=P0.2, RX-Pin=P0.1
PINSEL0 has to be set to "UART-Function" = Function "01"
for Pin 0.0 and 0.1 */
#define PINSEL_BITPIN0 0
#define PINSEL_BITPIN1 2
// #define PINSEL_BITPIN2 4
#define PINSEL_FIRST_ALT_FUNC 1
// #define PINSEL_SECOND_ALT_FUNC 2
// Values of Bits 0-3 in PINSEL to activate UART0
#define UART0_PINSEL ((PINSEL_FIRST_ALT_FUNC<<PINSEL_BITPIN0)|(PINSEL_FIRST_ALT_FUNC<<PINSEL_BITPIN1))
// Mask of Bits 0-4
#define UART0_PINMASK (0x0000000F) /* PINSEL0 Mask for UART0 */
// U0_LCR devisor latch bit
#define UART0_LCR_DLAB 7
/* baudrate divisor - use UART_BAUD macro
* mode - see typical modes (uart.h)
* fmode - see typical fmodes (uart.h)
* NOTE: uart0Init(UART_BAUD(9600), UART_8N1, UART_FIFO_8);
*/
void uart0Init(uint16_t baud, uint8_t mode, uint8_t fmode)
{
// setup Pin Function Select Register (Pin Connect Block)
// make sure old values of Bits 0-4 are masked out and
// set them according to UART0-Pin-Selection
PCB_PINSEL0 = (PCB_PINSEL0 & ~UART0_PINMASK) | UART0_PINSEL;
UART0_IER = 0x00; // disable all interrupts
UART0_IIR = 0x00; // clear interrupt ID register
UART0_LSR = 0x00; // clear line status register
// set the baudrate - DLAB must be set to access DLL/DLM
UART0_LCR = (1<<UART0_LCR_DLAB); // set divisor latches (DLAB)
UART0_DLL = (uint8_t)baud; // set for baud low byte
UART0_DLM = (uint8_t)(baud >> 8); // set for baud high byte
// set the number of characters and other
// user specified operating parameters
// Databits, Parity, Stopbits - Settings in Line Control Register
UART0_LCR = (mode & ~(1<<UART0_LCR_DLAB)); // clear DLAB "on-the-fly"
// setup FIFO Control Register (fifo-enabled + xx trig)
UART0_FCR = fmode;
}
int uart0Putch(int ch)
{
while (!(UART0_LSR & ULSR_THRE)) // wait for TX buffer to empty
continue; // also either WDOG() or swap()
UART0_THR = (uint8_t)ch; // put char to Transmit Holding Register
return (uint8_t)ch; // return char ("stdio-compatible"?)
}
const char *uart0Puts(const char *string)
{
char ch;
while ((ch = *string)) {
if (uart0Putch(ch)<0) break;
string++;
}
return string;
}
int uart0TxEmpty(void)
{
return (UART0_LSR & (ULSR_THRE | ULSR_TEMT)) == (ULSR_THRE | ULSR_TEMT);
}
void uart0TxFlush(void)
{
UART0_FCR |= UFCR_TX_FIFO_RESET; // clear the TX fifo
}
/* Returns: character on success, -1 if no character is available */
int uart0Getch(void)
{
if (UART0_LSR & ULSR_RDR) // check if character is available
return UART0_RBR; // return character
return -1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -