AVR 328pb串口基本介绍和使用
-
📍相关篇《AVR 328pb定时器0基本介绍和使用》
-
🔖主要基于Atmel Studio 7.0开发环境配置使用,附带Arduino使用例程介绍。
-
📍结合参考同架构lgt8f328p中文文档:
http://www.prodesign.com.cn/wp-content/uploads/2023/03/LGT8FX8P_databook_v1.0.4.pdf -
🪓工作模式下计算波特率(位/秒)以及UBRR值的公式。

📘波特率设置及引入误差
对于标准晶振及谐振器频率来说,异步模式下的实际通信的波特率可通过波特率计算公式来
获得,它与常用通信波特率之间的误差可用如下公式来计算:
Error[%] = (Baudreal/Baud – 1)*100%
其中,Baud为常用的通信波特率,Baudreal为通过计算公式算出来的波特率,带入波特率计
算公式即可得到波特率误差与系统时钟fsys和波特率寄存器UBRR值之间的关系如下:
普通模式:
Error[%] = (fsys/(16*(UBRR+1))/Baud – 1)*100%
倍速模式:
Error[%] = (fsys/(8*(UBRR+1))/Baud – 1)*100%
- 📄不同频率和波特率配置误差表:


- 当不考虑通信两边的时钟误差,即系统时钟 fsys为标准时钟时,即可得到波特率误差 UBRR值之间的关系。下表即为16MHz系统时钟下不同UBRR值设置下的波特率误差。
- 🔱从上表可知,在使用外部晶振并且是1000整数倍的情况下,波特率设置在9600或以下误差率最小。当然如果是使用不是1000整数倍的晶振频率,波特率的误差可以很大的改善。各有取舍 。
📗串口相关寄存器定义
-
UCSRA – USART 控制和状态寄存器A


-
UCSRB – USART控制和状态寄存器B


-
UCSRC– USART控制和状态寄存器C


-
🌿UBRR寄存器(包含:
UBRRnH和UBRRnL)

-
- UBRRnL – USART波特率寄存器低字节

- UBRRnL – USART波特率寄存器低字节
-
- UBRRnH – USART波特率寄存器高字节


- UBRRnH – USART波特率寄存器高字节
-
UDR – USART 数据寄存器

-
🌿串口参数代码具体配置:(基于Atmel Studio
GCC C Executable Project裸机开发模式)
#define BAUD 9600
#define F_CPU 16000000UL
#define MYUBRR (F_CPU/16/BAUD-1)
// 串口初始化
void USART0_Init(void)
{
UCSR0A=(0<<RXC0) | (0<<TXC0) | (0<<UDRE0) | (0<<FE0) | (0<<DOR0) | (0<<UPE0) | (0<<U2X0) | (0<<MPCM0);
/*Enable receiver and transmitter */
UCSR0B=(1<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (1<<RXEN0) | (1<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);
/* Set frame format: 8data, 1stop bit */
UCSR0C=(0<<UMSEL01) | (0<<UMSEL00) | (0<<UPM01) | (0<<UPM00) | (0<<USBS0) | (1<<UCSZ01) | (1<<UCSZ00) | (0<<UCPOL0);
/*Set baud rate */
UBRR0H = (unsigned char)(MYUBRR>>8);
UBRR0L = (unsigned char)MYUBRR;
stdout = &mystdout;//输出流配置
// Ensure that the USART0 is enabled
PRR0&= ~(1<<PRUSART0);
// Globally enable interrupts
sei();
}
- 🔖如果波特率倍频(X2):
#define BAUD 9600
#define F_CPU 16000000UL
#define MYUBRR (F_CPU/8/BAUD-1)
// 串口初始化
void USART0_Init(void)
{
// USART0 Baud Rate: 9600 (Double Speed Mode)
UCSR0A=(0<<RXC0) | (0<<TXC0) | (0<<UDRE0) | (0<<FE0) | (0<<DOR0) | (0<<UPE0) | (1<<U2X0) | (0<<MPCM0);
/*Enable receiver and transmitter */
UCSR0B=(1<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (1<<RXEN0) | (1<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (

最低0.47元/天 解锁文章
2777

被折叠的 条评论
为什么被折叠?



