带你AVR入个门3:USART(未完成)
串口,应该是继GPIO之后学的第一个外设。
原理跟硬件连接什么的自己查,下面介绍一个最简单的串口发送一个字节的例程。
当你#include了头文件之后,串口的寄存器可以直接用。
总的来说分为两步:初始化,以及发送数据。
初始化要给这么几个寄存器赋值:UCSRB、UCSRC、UBRRL、UBRRH。
首先是传输数据格式的描述:最常见的是8位数据位、1位停止位、0校验位,由UCSRC寄存器控制。
UCSRC = (1<
有看datasheet的朋友(万一有呢?)会发现,UCSRC寄存器里头UCSZ1和UCSZ0这两位的值默认是1,所有上面这句是可以省略掉的。
接下来是UBRRL跟UBRRH这两个寄存器,用来设置波特率,L跟H分别代表低位跟高位。
波特率寄存器的值跟两个因素有关:一个是你要设置的波特率,另一个是单片机晶振频率。
这三者之间的关系如下图:
假设你用的是7372800的晶振,想要设置成9600的波特率,那么UBRR的值应赋值为:
7372800/16/9600-1=47
有一个比较偷懒的方法是:在datasheet里直接查表
然后
UBRRL = 47;
当我不建议你这么做,优雅的写法应该是:
UBRRL = (uint8_t)(F_CPU/16/BAUD -1);
UBRRH = (uint8_t)((F_CPU/16/BAUD -1)>>8);
F_CPU的值上一集已经提过在哪里定义,BAUD你可以定义成宏,也可以作为函数参数输入。
最后一个寄存器是UCSRB,里边是一些功能的开关位,我们要发送数据,只需要使能发送数据位TXEN:
UCSRB = 1<
最简单的串口初始化就完成了。
接下来是发送一个字节。
void usart_send_byte(uint8_t data)
{
while(!(UCSRA & (1<
;
UDR = data;
}
while(!(UCSRA & (1<
register&(1<
main函数长这样子:
#include
#include "usart.h"
int main(void)
{
usart_initialize(9600);
while(1)
{
usart_send_byte(0xFF);
}
return 0;
}
usart.c跟usart.h自己补全。