📄 uart1.c
字号:
/* 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"
//#define RXB8 1
//#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
//#define UDRE 5
//#define RXC 7
#define FRAMEING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
//#define DATA_REGISTER_EMPTY (1<<UDRE)
//#define RX_COMPLETE (1<<RXC)
//USART发送缓冲区大小
#define TX_BUFFER_SIZE 200
unsigned char tx_buffer[TX_BUFFER_SIZE];
unsigned char tx_wr_index,tx_rd_index,tx_counter;
//tx_wr_index为写缓冲区指针,tx_rd_index为读缓冲区指针,tx_counter为在缓冲区
//中准备发送的数据个数
#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];
if(++tx_rd_index==TX_BUFFER_SIZE) tx_rd_index=0;
}
}
//USART接收缓冲区大小
#define RX_BUFFER_SIZE 200
unsigned char rx_buffer[RX_BUFFER_SIZE]
unsigned char rx_counter,Uart_RecvFlag;
//tx_counter为接收到的字符个数,Uart_RecvFlag为接收完成标志位
#pragma interrupt_handler uart0_rx_isr:10
void uart0_rx_isr(void)
{
//uart has received a character in UDR
unsigned char status,data;
status=UCSRA;
data=UDR;
if(!Uart_RecvFlag)
{
if((status & (FRAMING | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_counter] =data;
rx_counter++;
if(rx_buffer[rx_counter-1] == 13) //判断数据接收是否完成
{
nRX0_Len = rx_counter; //若完成,则返回接收的数据长度
rx_counter = 0; //清零接收计数值
Uart_RecvFlag=1; //置位接收完成标志
}
}
}
}
//向USART发送缓冲区
#pragma used+
void putchar(unsigned 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_BUFFFER_SIZE) tx_wr_index=0;
++counter;
}
else UDR=transmit;
#asm("sei");
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -