1、新建一个工程叫做NIOS_UART
建立一个Qsys工程,基本配置如下
2、添加UART
3、UART连线,assign base adress,之后生成
4、定义quartus文件如下
module NIOS_UART
(
CLK_50M,
RST_N,
LEDOUT,
KEY,
uart_0_txd,
uart_0_rxd
);
input CLK_50M;
input RST_N;
inout LEDOUT;
reg [3:0] LEDOUT;
inout [3:0] KEY ;
input uart_0_rxd;
output uart_0_txd;
myqsys u0 (
.clk_clk (CLK_50M),
.reset_reset_n (RST_N),
.pio_led_external_connection_export ({KEY,LEDOUT})
.uart_0_txd (uart_0_txd),
.uart_0_rxd (uart_0_rxd)
);
endmodule
5、加入qsys文件到工程中,编译,分配管脚
6、新建nios工程如下
7、我们打开发现有一句话,试试能不能发送,打开串口调试助手。直接编译,下载。发现能发送数据到串口助手。为何没配置串口就能发送了,原因是因为实际在运行main函数之前,会运行alt_main函数,而正是这个函数调用的我们的main函数。而在alt_main中已经配置了串口。
8、而假如我们配置了多个串口,那哪一个串口可以使用alt_putstr函数打印呢,下面界面可以选择
9、而且也可通过下面的界面,不勾选。不勾选则不会主动初始化串口
10、看手册,看到UART有6个16位的寄存器,这几个寄存器其实跟使用串口IP和类似,通过这几个寄存器,实现了发送使能、接收标志等类似功能
给出这含义六个寄存器的
下面可以看到,当串口接收到数据时,状态寄存器的rrdy会变成1.如果使用查询方式可用。当把数据从rxdata读走后,rrdy会自动变成0.当没读走数据,又来新的一个数据了,新的会覆盖老的。
当实际使用查询方式应用时,可能会出现读不到,或者少几个的情况。原因是因为没关闭系统的底层驱动,系统在自动读取。
下面可以看出当TRDY位1时,可以对txdata写入数据。为0时不能。
PE:检验错误
FE:帧格式错误
BRK:也是错的
ROE:接收错误
TOE:可以通过这一位判断发送是否完成
TRDY:为1可以写入txdata数据
RRDY:为1表示有新数据,读走rxdata数据,自动变0.
上表中各个位中断使能控制。