71

基于 NIOS II 处理器的RT-Thread物联网操作系统移植与使用教程

 6 years ago
source link: http://mp.weixin.qq.com/s/SDNMdxMTMpu5cV5xxF44Yw
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Image梅雪松:网名“小梅哥”,拥有多年FPGA设计经验,有《小梅哥和你一起深入学习FPGA》、《小梅哥FPGA学习笔记》两个系列网络博文;并推出了手把手式视频教程《FPGA设计思想与验证方法视频教程》

欢迎给RT-Thread投稿,赠RT-Thread 精美礼品。

征稿 | 你写不写,福利就在这里~~

Image

Image

本节以小梅哥AC620型FPGA开发板为例,说明了如何基于在Qsys中搭建支持RT-Thread操作系统的基本NIOS II处理器系统,并在此基础上实现创建2个LED闪烁的静态线程的示例。RT-Thread操作系统版本:3.0软件版本:Quartus II 13.0开发环境:Windows7 64位旗舰版硬件平台:小梅哥AC620 FPGA开发板嵌入式处理器:NIOS II

搭建支持RT-Thread操作系统的NIOS II CPU系统

在Qsys中搭建能够支持RT-Thread操作系统的NIOS II 处理器系统,除了必要的NIOS II处理器、RAM存储器(片上RAM、SRAM、SDRAM、DDR2)、FLASH存储器(EPCS)外,为了支持RT-Thread操作系统的运行,还需要添加UART串口外设、定时器外设、以及为了使系统能够工作在较高的频率,而添加PLL锁相环。同时,为了能够驱动LED灯,还需要根据实际硬件情况添加一定位宽的输出型PIO以驱动LED灯。本系统主要包含以下外设:

  • PLL 时钟管理单元,输出2路相位相差90°的时钟,一路提供给系统内所有逻辑使用,一路输出到SDRAM芯片的clk管脚上。(相位为-90°)

  • NIOS II 处理器 ,选择f(快速)版本,其他默认。

  • SDRAM控制器,16位数据位宽,12位行地址,9位列地址,用作NIOS II的数据和指令存储器

  • EPCS控制器,用以掉电存储FPGA和NIOS II的软硬件固件信息

  • UART(RS232)控制器,用作系统标准输入输出设备,默认115200波特率

  • Timer定时器,设置默认10毫秒定时器,并可通过软件修改寄存器以修改定时时间。

  • PIO,仅输出型PIO,4位,对应开发板上4个LED灯

下图为搭建好的最小NIOS II应用系统

Image

其中需要注意的是,驱动LED的PIO为4位,并直接命名为了led,uart串口被命名为了RS232,这是为了与RT-Thread官方提供的NIOS II的BSP文件中相关代码相对应。

NIOS II CPU相关设置

Image



定时器参数设置

Image



UART控制器相关设置

Image



LED PIO相关设置

Image

其他的相关细节操作就不在此多说,如果需要了解可以参见小梅哥SOPC公开课相关内容。

在Quartus II工程中例化CPU系统



设计顶层文件

将Qsys中搭建的系统命名为mysystem,然后generate得到HDL文件,在Quartus II软件中添加mysystem.qsys文件,新建Verilog文件,完善顶层例化信息,完善后的代码如下所示:

module ac620_ghrd(
        input  wire        reset_n,              
        input  wire        clk,                  
        output wire [11:0] sdram_addr,           
        output wire [1:0]  sdram_ba,             
        output wire        sdram_cas_n,          
        output wire        sdram_cke,
        output wire        sdram_clk,       
        output wire        sdram_cs_n,           
        inout  wire [15:0] sdram_dq,             
        output wire [1:0]  sdram_dqm,            
        output wire        sdram_ras_n,          
        output wire        sdram_we_n,           
        output wire [3:0]  led,
        input  wire        uart_rxd,             
        output wire        uart_txd,                       
        output wire        epcs_dclk,            
        output wire        epcs_sce,             
        output wire        epcs_sdo,             
        input  wire        epcs_data0            );
    mysystem u0 (
        .clk_in_reset_reset_n            (reset_n),          
        .clk_in_clk                        (clk),              
        .sdram_addr                        (sdram_addr),       
        .sdram_ba                          (sdram_ba),         
        .sdram_cas_n                       (sdram_cas_n),      
        .sdram_cke                         (sdram_cke),        
        .sdram_cs_n                        (sdram_cs_n),       
        .sdram_dq                          (sdram_dq),         
        .sdram_dqm                         (sdram_dqm),        
        .sdram_ras_n                       (sdram_ras_n),      
        .sdram_we_n                        (sdram_we_n),       
        .led_export                        (led),              
        .uart_rxd                          (uart_rxd),         
        .uart_txd                          (uart_txd),         
        .sdram_cko_clk                     (sdram_clk),        
        .epcs_dclk                         (epcs_dclk),        
        .epcs_sce                          (epcs_sce),         
        .epcs_sdo                          (epcs_sdo),         
        .epcs_data0                        (epcs_data0),       
        .altpll_0_phasedone_conduit_export (), 
        .altpll_0_locked_conduit_export    (), 
        .altpll_0_areset_conduit_export    ()  
    );
     endmodule

设置EPCS管脚功能

Image

根据AC620 FPGA开发板引脚分配表或者开发板背面的丝印对用到的引脚功能一一分配正确的管脚。注意设置所有的IO电平为3.3LVTTL,以防止无法正确驱动SDRAM存储器。另外由于使用到了EPCS,因此需要在Quartus中设置其功能为regular IO,如下图所示:

添加SDC约束文件

在做基于NIOS II的SOPC开发时,务必要添加SDC约束文件,对系统的时钟进行约束,以保证Quartus II软件能够按照运行的频率要求对系统进行布局布线,否则,在没有加约束的情况下,整个系统可能最高运行频率比50MHz还要低,就会出现系统无法正常运行,软件无法下载等各种故障。本实例中约束文件比较简单,大家只需要将下述内容新建一个sdc文件保存起来并添加到Quartus II工程中即可:

set_time_format -unit ns -decimal_places 3
create_clock -name {clk} -period 20.000 -waveform { 0.000 10.000 } [get_ports {clk}]
derive_pll_clocks 

添加完成后编译整个工程,得到sof文件。

创建NIOS II应用工程模版

打开Quartus II集成的NIOS II软件开发工具(基于Eclipse),然后切换工作空间到Quartus II工程目录下。

Image

然后新建一个空白模版工程和bsp工程,如下所示。注意,sopcinfo文件路径一定不能错。

Image

移植RT-Thread操作系统



下载RT-Thread操作系统源码

从git上下载RT-Thread操作系统的源文件,源码地址:https://github.com/RT-Thread/rt-thread选择master分支,点击Clone or download按钮,选择Download zip来下载源文件,当然也可以从我们提供的本实例的压缩包中得到该文件。

Image

下载完成之后的文件名为:rt-thread-master.zip

移植RT-Thread操作系统源码

在RTT_Test工程下新建一个文件夹,命名为”rt-thread”,添加src文件夹,include文件夹到rt-thread文件夹下,然后添加libcpu下nios部分内容到rt-thread文件夹下。注意,libcpu下提供了对各种体系架构的cpu的支持,我们这里只需要nios部分即可,其他部分不需要添加到工程中。上述就完成了RT-Thread操作系统源码的添加。但是此时还并不完整,我们还需要添加对NIOS II CPU的bsp文件,该文件在bsp路径下的nios ii路径下,我们拷贝该路径下的所有.c和.h文件到工程中,注意,application.c是整个系统的应用部分,也就是main函数所在文件,因此将该文件从rt-thread文件夹中移出到软件工程的根目录(拖动即可),添加完成后的工程如下所示(具体可以参考我们提供的实例工程文件)。

Image

设置头文件搜索路径

添加完所有的文件之后,我们还必须要在软件的设置中添加头文件搜索路径,选中RTT_test工程,鼠标右击选择Properties选项,在弹出的对话框中选中Nios II Application Paths选项,添加include和bsp文件夹道头文件路径中,然后确认关闭。如果弹出下述相对路径转换提示,选择Yes即可。

Image
Image

至此,所有的运行RT-Thread操作系统的要求都已经满足了。

关闭FINSH支持功能

接下来,我们打开工程的rt-thread -> bsp -> rtconfig.h文件,定位到第80行左右,将#define RT_USING_FINSH这句话前面加上单行注释符“//”,以屏蔽该定义,即不使用FINSH功能。

运行RT-Thread操作系统



编译运行程序

然后对整个工程进行全编译(快捷键为Ctrl + B),编译无误,就会得到可下载到NIOS II CPU中运行的elf文件,然后在菜单栏中依次点击RUN -> Run Configurations选项,打开下载运行页面。

Image

新建一个硬件运行配置并选择RTT_test工程,然后切换到Target Connection选项卡,刷新连接以确认硬件USB Blaster已经找到CPU。注意,在此操作之前需要先将Quartus II软件编译生成的sof文件下载到开发板中,并使用Micro USB数据线连接开发板和电脑,并打开串口调试工具,以找到开发板对应串口,设置波特率115200,ASCII接收。

Image
Image

勾选忽略system id和时间戳选项,然后点击Run。即可开始软件程序的下载。

下载完成后,即可在串口调试助手上看到系统运行时打印的信息,同时,开发板上4个LED灯循环闪烁。

Image
Image

- End - 

支持RT-Thread,请关注RT-Thread公众号

Image

添加微信13924608367 为好友,注明rt-thread,拉进RT-Thread Nano微信交流群,与RT-Thread官方团队直接交流。

阅读原文可报名12月16日上海RT-Thread开发者大会,届时会与大家就RT-Thread特性、行业应用、语音交互、GUI、物联网云端接入等话题展开分享和讨论,同时还设置了动手环节(听说有imx rt1050开发板带LCD屏玩),让到场的伙伴不仅仅是听,还能参与实践。当然也少不了抽奖!

点击“阅读全文”,抢占大会席位(仅剩少量席位)
Image


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK