【NiosII学习】第四篇、USART串口收发

目录

第一部分、新建Quartus II工程

1、注意

第二部分、修改别人软核

1、添加UART核的详细步骤

第三部分、编写Quartus中的verilog代码

1、详细步骤

2、verilog代码:

第四部分、编写Ecplise里面的C代码

1、注意

2、简单的实现串口的接收和发送的代码

第五部分、串口调试助手的使用

1、串口调试助手的参数配置

2、USB转TTL和串口调试助手的使用说明

第六部分、总结

1、我的BUG

2、效果演示

3、闲话

4、完整资料


第一部分、新建Quartus II工程

1、注意

如果你和我FPGA型号不一样,那就复制你的SOPC工程文件到文件夹中,和前面一样,因为其他的步骤大致都和我的一样,没有区别。

第一步、复制小梅哥的LCD9341的初始工程,到自己建立的文件夹中

【NiosII学习】第四篇、USART串口收发

第二部分、修改别人软核

1、添加UART核的详细步骤

第一步、打开qsys文件

【NiosII学习】第四篇、USART串口收发

第二步、添加一个UART(RS-232 Serial Port)IP核,里面的参数默认就可以

【NiosII学习】第四篇、USART串口收发

第三步、对添加的核进行连线,分配地址,导出端口,连接中断。

【NiosII学习】第四篇、USART串口收发

第四步、后面的步骤我在前面中讲到了,忘记了的小伙伴可以回去看一下,(https://blog.csdn.net/Learning1232/article/details/111041890

第三部分、编写Quartus中的verilog代码

1、详细步骤

第一步、生成系统,然后复制例化代码,然后再顶层文件里面添加例化的代码,并且添加输入例化输出的串口代码。

【NiosII学习】第四篇、USART串口收发

第二步、进行简单的分析和综合,也就是初步编译,我认为是为了在分配管脚的界面出现新添加的端口。

【NiosII学习】第四篇、USART串口收发

第三步、进行引脚的分配,这里我是随便选的我的FPGA上面两个裸露的IO口,(选择I/O口的要求我不知道,应该没有要求,注意:如果你的FPGA型号和我不一样,那你随便选两个你单片机上面的IO),然后进行全编译。

【NiosII学习】第四篇、USART串口收发

2、verilog代码:

module AC620_GHRD(

	/*我新增的两个变量*/
	input  wire        uart_1_rxd,                        //                     uart_0.rxd
	output wire        uart_1_txd,                        //                           .txd
	/*我新增的两个变量*/
	
	input  wire        clk,                           //                        clk.clk
	input  wire        reset_n,                     //                      reset.reset_n
	output wire        lcd_rst,                    //                    lcd_rst.export
	output wire        lcd_rd_n,                     //                     lcd_rd.export
	output wire        lcd_bl,                     //                     lcd_bl.export
	output wire        lcd_wr_n,                     //                     lcd_wr.export
	output wire        lcd_rs,                     //                     lcd_rs.export
	output wire        lcd_cs_n,                     //                     lcd_cs.export
	inout  wire [15:0] lcd_data,                     //                     lcd_db.export
	output wire        sdram_clk,                     //                  sdram_clk.clk
	output wire [11:0] sdram_addr,                        //                      sdram.addr
	output wire [1:0]  sdram_ba,                          //                           .ba
	output wire        sdram_cas_n,                       //                           .cas_n
	output wire        sdram_cke,                         //                           .cke
	output wire        sdram_cs_n,                        //                           .cs_n
	inout  wire [15:0] sdram_dq,                          //                           .dq
	output wire [1:0]  sdram_dqm,                         //                           .dqm
	output wire        sdram_ras_n,                       //                           .ras_n
	output wire        sdram_we_n,                         //                           .we_n
	input  wire        uart_0_rxd,                        //                     uart_0.rxd
	output wire        uart_0_txd,                        //                           .txd
	output wire        epcs_dclk,                         //                       epcs.dclk
	output wire        epcs_sce,                          //                           .sce
	output wire        epcs_sdo,                          //                           .sdo
	input  wire        epcs_data0                         //                           .data0
);

    mysystem u0 (
		.clk_clk                           (clk),                           //                        clk.clk
		.reset_reset_n                     (reset_n),                     //                      reset.reset_n
      .uart_0_rxd                        (uart_0_rxd),                        //                     uart_0.rxd
      .uart_0_txd                        (uart_0_txd),                        //                           .txd
      .epcs_dclk                         (epcs_dclk),                         //                       epcs.dclk
      .epcs_sce                          (epcs_sce),                          //                           .sce
      .epcs_sdo                          (epcs_sdo),                          //                           .sdo
      .epcs_data0                        (epcs_data0),                        //
		.lcd_rst_export                    (lcd_rst),                    //                    lcd_rst.export
		.lcd_bl_export                     (lcd_bl),                     //                     lcd_bl.export
		.lcd_wr_n                          (lcd_wr_n),                          //                        lcd.wr_n
		.lcd_rd_n                          (lcd_rd_n),                          //                           .rd_n
		.lcd_data                          (lcd_data),                          //                           .data
		.lcd_rs                            (lcd_rs),                            //                           .rs
		.lcd_cs_n                          (lcd_cs_n),                           //  
		.sdram_clk_clk                     (sdram_clk),                     //                  sdram_clk.clk
		.altpll_0_phasedone_conduit_export (), // altpll_0_phasedone_conduit.export
		.altpll_0_locked_conduit_export    (),    //    altpll_0_locked_conduit.export
		.altpll_0_areset_conduit_export    (),    //    altpll_0_areset_conduit.export
		.sdram_addr                        (sdram_addr),                        //                      sdram.addr
		.sdram_ba                          (sdram_ba),                          //                           .ba
		.sdram_cas_n                       (sdram_cas_n),                       //                           .cas_n
		.sdram_cke                         (sdram_cke),                         //                           .cke
		.sdram_cs_n                        (sdram_cs_n),                        //                           .cs_n
		.sdram_dq                          (sdram_dq),                          //                           .dq
		.sdram_dqm                         (sdram_dqm),                         //                           .dqm
		.sdram_ras_n                       (sdram_ras_n),                       //                           .ras_n
		.sdram_we_n                        (sdram_we_n),                         //                           .we_n
		
		
		/*新添加的*/
	   .uart_1_rxd                        (uart_1_rxd),     //    uart_1.rxd
	   .uart_1_txd                        (uart_1_txd)      //          .txd
		/*新添加的*/
	);

endmodule

第四部分、编写Ecplise里面的C代码

1、注意

这里省略了Ecplise软件的使用说明,如果忘了的小伙伴,可以看我的《【NiosII学习】第一篇、如何烧录NiosII工程:https://blog.csdn.net/Learning1232/article/details/110225728,有巨详细的步骤。

2、简单的实现串口的接收和发送的代码

#include <stdio.h>
#include <sys/unistd.h>
#include <io.h>
#include <string.h>
#include "system.h"
#include "altera_avalon_uart_regs.h"
#include "alt_types.h"
#include "sys/alt_irq.h"
alt_u16 i;

/*********************************************/
void UART_ISR_Init(void);    //初始化串口
void UART_Irq_Handler(void);
/*********************************************/

int main(void)
{
	int sec = 0;
    printf("Hellow!\n");
    UART_ISR_Init();
    while(1)
    {
    	printf("seconds = %d \n",sec);
    	printf("i = %d \n",i);
    	usleep(1000000);
    	sec++;
    	IOWR_ALTERA_AVALON_UART_TXDATA(UART_1_BASE,sec);
    }
    return 0;
}
/*********************************************/
/***********************************************/
void UART_Irq_Handler(void)
{
	i++;
	alt_u8 rx_dat;
  //读取接收数据
  rx_dat = IORD_ALTERA_AVALON_UART_RXDATA(UART_1_BASE);
  //发送接收数据
  IOWR_ALTERA_AVALON_UART_TXDATA(UART_1_BASE, rx_dat);
  //清除中断标志寄存器
  IOWR_ALTERA_AVALON_UART_STATUS(UART_1_BASE, 0x0);
}
void UART_ISR_Init(void)
{  //清除中断标志寄存器
  IOWR_ALTERA_AVALON_UART_STATUS(UART_1_BASE, 0x0);
  //注册中断
  alt_irq_register(UART_1_IRQ, NULL, UART_Irq_Handler);
  //允许UART接收中断
  IOWR_ALTERA_AVALON_UART_CONTROL(UART_1_BASE, 0x0080);
}

第五部分、串口调试助手的使用

1、串口调试助手的参数配置

【NiosII学习】第四篇、USART串口收发

2、USB转TTL和串口调试助手的使用说明

这个我相信学过单片机的都知道这两个怎么用,如果连这个你不知道怎么用,没关系,别学了,放弃吧

开个玩笑,你可以加群,然后私聊我,我看到了就会发教程给你。

 

第六部分、总结

1、我的BUG

考虑了很久还是决定把自己bug和大家分享一下,经过上面那些步骤,你现在肯定很枯燥,看我下面我的bug,是不是快乐很多了。

我当时给自己写的:“我人傻了、搞了好几天,遇到的一个让人苦笑不得的笑话,以后要注意,while(1)前面的程序可以执行,但是里面的执行不了,那么想一下会不会是这个问题。”

【NiosII学习】第四篇、USART串口收发

2、效果演示

已经拍成视频发放在文件夹中,你也可以先点击这个链接直接观看(https://live.csdn.net/v/120132),这里放张图片。

【NiosII学习】第四篇、USART串口收发

3、闲话

串口这个实验一次性做成功有点难,我们班很多人都搞了好久,我帮别人的时候,发现他们有很多人是使用USB转TTL时 ,将USB的rxd和FPGA定义的rxd接到一起了,所以,请注意:一定要让RXD接TXD。

如果实在遇到问题,还是那句话你可以扫码进群然后询问我,说不定我也不会,我会我一定会教你。嘿嘿!

【NiosII学习】第四篇、USART串口收发

4、完整资料

我把这篇文章涉及到的所有的资料(完整工程、演示视频、参考资料下载链接:https://download.csdn.net/download/Learning1232/13674877都会放在这个文件夹里面,文件夹你可以扫码进群下载,或者关注我,直接下载,粉丝福利(哈哈)!!!

上一篇:串口2(接收来自上位机的数据,并发回上位机)


下一篇:第七届工程训练比赛之智能垃圾分类