📄 uart1.h
字号:
/* usart寄存器
usart数据寄存器——UDR
8位的数据寄存器只有当UDRE置1时才能写入数据
usart控制和状态寄存器A——UCSRA
位 7 6 5 4 3 2 1 0
RXC TXC UDRE FE DOR PE U2X MPCM
位7:接收数据完成时置1;
位6:当发送移位寄存器的全部数据移出后,且在数据寄存器中没有待发送的数据置1;
位5:数据寄存器为空时置1,可以写入新的发送数据;
位4:接收帧出错置1;
位3:接收数据溢出错误;
位2:校验错误时置1;
位1:传速速率倍速,异步模式有效;
位0:多机通讯模式容许;
usart控制和状态寄存器B——USCRB
位 7 6 5 4 3 2 1 0
RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8
位7和位6:RX接收和Tx发送完成中断允许位,当RXC置1或TXC置1时发中断;
位5:数据寄存器空中断允许;
位4和位3:数据接收允许和数据发送允许;
位2:数据字位数大小
位1和位0:接收数据和发送数据的第8位;
usart控制和状态寄存器C——USCRC
位 7 6 5 4 3 2 1 0
URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL
位7:用于寄存器UCSRC和UBRRH的选择;
位6:工作模式选择,0为异步模式
位5和4:校验方式
位3:停止位选择
位2和1:传送或接收字符长度,和USCRB中的UCSZ2共同决定位数
位0:时钟极性选择,异步模式应该写0
波特率寄存器UBRRL和UBRRH */
//典型的USART底层驱动和中间层软件结构示例
#ifndef _UART1_H__
#define _UART1_H__
#include "iom32v.h"
#include "globle_temp.h"
#pragma interrupt_handler uart0_tx_isr:12
void uart0_tx_isr(void)
{
//character has been transmitted
if(tx_counter)
{
--tx_counter;
UDR=tx_buffer[tx_rd_index];
delay_nus(5);
if(++tx_rd_index==TX_BUFFER_SIZE) tx_rd_index=0;
}
}
#pragma interrupt_handler uart0_rx_isr:10
void uart0_rx_isr(void)
{
//uart has received a character in UDR
char status,data;
status=UCSRA;
data=UDR;
if((status & (FRAMEING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index] =data;
if(++rx_wr_index==RX_BUFFER_SIZE)
rx_wr_index=0;
if(++rx_counter==RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
}
}
}
///*
#pragma used+
char getchar(void)
{
char data;
while(rx_counter==0);
data=rx_buffer[rx_rd_index];
if(++rx_rd_index==RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli");
--rx_counter;
#asm("sei");
return data;
}
void getstring(char *in)
{
int i=0;
while(rx_counter)
{
in[i]=getchar( );
i++;
}
}//*/
//向USART发送缓冲区
#pragma used+
void putchar(char transmit)
{
while(tx_counter==TX_BUFFER_SIZE);
#asm("cli");
if(tx_counter||((UCSRA & DATA_REGISTER_EMPTY)==0))
{
tx_buffer[tx_wr_index]=transmit;
if(++tx_wr_index==TX_BUFFER_SIZE) tx_wr_index=0;
++tx_counter;
}
else UDR=transmit;
#asm("sei");
}
void putstring(char *in,int len)
{
int i ;
if(len == 0) return ;
for(i=0;i<len;i++)
{
putchar(in[i]) ;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -