📄 sw-uart.c
字号:
/* Name: sw-uart.c * Project: AVR USB driver for CDC interface on Low-Speed USB * Author: Osamu Tamura * Creation Date: 2006-06-22 * Tabsize: 4 * Copyright: (c) 2006 by Recursion Co., Ltd. * License: Proprietary, free under certain conditions. See Documentation. *//*General Description:*/#include <avr/io.h>#include <avr/interrupt.h>#include "oddebug.h"#include "uart.h"#if !UART_CFG_HAVE_USART/* UART buffer */uchar urptr, uwptr, irptr, iwptr;uchar rx_buf[RX_SIZE], tx_buf[TX_SIZE];uchar tx_stage, bit_start;
void uartInit(int baudrate, uchar parity, uchar stopbits, uchar databits){
#if UART_CFG_INVERT
UART_CFG_PORT &= ~(1<<UART_CFG_TXD);#else
UART_CFG_PORT |= (1<<UART_CFG_TXD);#endif
UART_DDR |= (1<<UART_CFG_TXD);
UART_DDR &= ~(1<<UART_CFG_RXD);
GIMSK &= ~(1<<PCIE); TCCR0A = 0; TCCR0B = 0; OCR0A = OCR1A = (F_CPU/64L) / baudrate - 1; bit_start = 6 - (OCR1A>>1); TCCR0A = 2; /* CTC */ TCCR1 = 0; TIMSK = (1<<OCIE1A)|(1<<OCIE0A); PCMSK = 1<<UART_CFG_RXD; /* PCINTn */ GIMSK |= (1<<PCIE); tx_stage = 0;}void uartPoll(void){ if( tx_stage==0 && OCR1C==0 && irptr!=uwptr ) { tx_stage = 10; OCR0B = tx_buf[irptr]; irptr = (irptr+1) & TX_MASK; TCNT0 = 0; cli();#if UART_CFG_INVERT
UART_CFG_PORT |= (1<<UART_CFG_TXD); /* start bit */#else
UART_CFG_PORT &= ~(1<<UART_CFG_TXD); /* start bit */#endif
TCCR0B = 3; /* start timer0: 1/64 clk */ sei(); }}void uartStartTransmission(void){ /* nothing to do -- we handle transmitter entirely in uartPoll() */}uchar uartRxIsBusy(void){ return OCR1C;}#endif /* UART_CFG_HAVE_USART */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -