📄 uart.c
字号:
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include "uart.h"
// USART0 Transmitter interrupt service routine
SIGNAL(SIG_USART0_TRANS)
{
if (UART0.counter)
{
--UART0.counter;
UDR0 = UART0.buffer[UART0.rd];
if (++UART0.rd == TX_BUFFER_SIZE0) UART0.rd = 0;
}
}
int uart_putchar(char c)
{
while (UART0.counter == TX_BUFFER_SIZE0);
cli();
if (UART0.counter || bit_is_clear(UCSR0A, UDRE0))
{
UART0.buffer[UART0.wr] = c;
if (++UART0.wr == TX_BUFFER_SIZE0) UART0.wr = 0;
++UART0.counter;
}
else
{
UDR0 = c;
}
sei();
return 0;
}
void InitIO(void)
{
UART0.rd = 0;
UART0.wr = 0;
UART0.counter = 0;
// USART0 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART0 Receiver: Off
// USART0 Transmitter: On
// USART0 Mode: Asynchronous
// USART0 Baud rate: 19200
UCSR0A = 0x00;
UCSR0B = 0x48;
UCSR0C = 0x86;
UBRR0H = 0x00;
UBRR0L = 0x17;
fdevopen(uart_putchar, 0, 0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -