AVR 328pb串口基本介绍和使用

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寄存器(包含:UBRRnHUBRRnL
    在这里插入图片描述

    • UBRRnL – 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) | (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值