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

📄 at91_usart.c

📁 lwip在ucos上的移植源码
💻 C
字号:
/*    *  at91_usart.c *  this file implement usart driver on AT91X40  *  for Atmel AT91 serial port comunication * *  Bugs report:  li ming  ( lmcs00@mails.tsinghua.edu.cn ) * */#include "at91.h"#include "at91_usart.h"#include "at91_init.h"static volatile struct atmel_usart_regs *usarts[AT91_USART_CNT] = {	(volatile struct atmel_usart_regs *) AT91_USART0_BASE,	(volatile struct atmel_usart_regs *) AT91_USART1_BASE};static unsigned long calcCD(unsigned long br){	return (UART_CLOCK / br);}static void uart_init(volatile struct atmel_usart_regs *uart){	/* Reset the USART */	uart->cr = US_TXDIS | US_RXDIS | US_RSTTX | US_RSTRX;	/* clear Rx receive and Tx sent counters */	uart->rcr = 0;	uart->tcr = 0;		/* Set the serial port into a safe sane state */	uart->mr = US_USCLKS(0) | US_CLK0 | US_CHMODE(0) | US_NBSTOP(0) |		    US_PAR(4) | US_CHRL(3);	uart->brgr = calcCD(9600);	uart->rtor = 20;			// timeout = value * 4 *bit period	uart->ttgr = 0;				// no guard time	uart->rcr = 0;	uart->rpr = 0;	uart->tcr = 0;	uart->tpr = 0;}static void _INLINE_ tx_enable(volatile struct atmel_usart_regs *uart){	uart->ier = US_TXEMPTY;}static void _INLINE_ rx_enable(volatile struct atmel_usart_regs *uart){	uart->ier = US_ENDRX | US_TIMEOUT;}static void _INLINE_ tx_start(volatile struct atmel_usart_regs *uart, int ints){	if (ints) {		tx_enable(uart);	}	uart->cr = US_TXEN;}static void _INLINE_ rx_start(volatile struct atmel_usart_regs *uart, int ints){	uart->cr = US_RXEN | US_STTO;	uart->rtor = 20;	if (ints) {		rx_enable(uart);	}}static void _INLINE_ rx_disable(volatile struct atmel_usart_regs *uart){	uart->idr = US_ENDRX | US_TIMEOUT;}static void _INLINE_ rx_stop(volatile struct atmel_usart_regs *uart){	rx_disable(uart);	uart->rtor = 0;	uart->rcr = 0;	uart->cr = US_RXDIS;}static void start_rx(volatile struct atmel_usart_regs *uart, char *rx_buf, int len ){	rx_stop(uart); 	uart->rpr = (unsigned long) rx_buf; 	uart->rcr = (unsigned long) len; 	rx_start(uart, 1);}static void xmit_string(volatile struct atmel_usart_regs *uart, char *p, int len){	uart->tcr = 0;	uart->tpr = (unsigned long) p;	uart->tcr = (unsigned long) len;	tx_start(uart, 1);}static void xmit_char(volatile struct atmel_usart_regs *uart, char ch){	xmit_string(uart, &ch, 1);}void at91_init_usart(){	uart_init( usarts[0] );	}void at91_uart_send_string( char *p, int len ){	xmit_string( usarts[0], p, len);}void at91_uart_put_char( char ch ){	xmit_char( usarts[0], ch );}static void _io_read( long * paddr, long * pvalue ){	*pvalue = *paddr;	return;	}void at91_uart_get_char( char *ch ){	unsigned long status;	long tmp;	start_rx( usarts[0], ch, 1 );	do	{		// must read 0xfffff100, status register to clear all flags !!!		_io_read( (long*)0xfffff100, &tmp );		_io_read( (long*)0xfffff108, &tmp );		status = usarts[0]->rcr;	}	while (status > 0);}

⌨️ 快捷键说明

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