目录

1. 生成PIO,并配置

2. PIO对应的寄存器

3. API函数

4. PIO外部中断

5. 上电自启动功能

6. 程序flash固化


1. 生成PIO,并配置

PIO IP核为avalon-MM从端口(NIOS内部互联总线接口)和通用I/O端口(FPGA PIN脚或verilog的设计接口)提供一个存储器映射(memory-mapped,存储区域和地址线一一对应的)接口。如下图所示:

1)添加PIO的IP(对于NIOS内核,需要的功能基本都是通过搭建一个个IP核实现软核的功能 。STM32的IC包含MCU、存储器、中断、外设、FLASH、JTAG接口等,对应到NIOS,基本都是以IP核的形式出现)。 其中,数据宽度选择4,代表着一共需要配置4个外设接口。

2)每添加一个IP结构,均需要重新分配基地址,即为这个功能/外设分配寄存器的访问地址。

3)  生成NIOS II 核后,新建软件程序工程。可以在BSP的system.h中查看这个内核可以操作的外设包含哪些,一般与调用的IP核相关。例如在本项目中使用了PIO,那么就可以看到与PIO相关的配置。如下:

可以在driver目录下,查看这个项目支持包里面定义的函数。如下:这个项目里只有jtag、时钟、nios、system ID、on-chip-ram以及PIO这些IP核,因此包含的函数主要时uart的以及pio的。例如:altera_avalon_pio_regs.h中包含了PIO的API函数。

2. PIO对应的寄存器

对PIO进行编程,就如对STM23的I/O口的操作,均是对寄存器进行操作。对地址的操作主要是通过基地址+偏移地址。如下所示:

edgecapture是与中断配合使用。

每个IP在eclipse中都有对应的寄存器描述文件,主要定义了IP的寄存器映射,硬件设备的宏定义以及操作的方法和函数等。

3. API函数

这里,与STM32的编程很相似,都是对外设的寄存器所在的地址进行操作,对一个外设,包含了各种不同的寄存器,但是这里面又与STM32有一些不同,例如,在STM32中要实现点亮LED灯,需要配置接口的使能寄存器,还有输出使能,并对ODR寄存器置位或清零,但是这里只需要操作下面的函数即可,因此有些不同,不同处还需要进一步研究。

IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_LED_BASE,1<<i);

这里关于PIO包含的API函数有:

#include <io.h>#define IOADDR_ALTERA_AVALON_PIO_DATA(base)           __IO_CALC_ADDRESS_NATIVE(base, 0)
#define IORD_ALTERA_AVALON_PIO_DATA(base)             IORD(base, 0)
#define IOWR_ALTERA_AVALON_PIO_DATA(base, data)       IOWR(base, 0, data)#define IOADDR_ALTERA_AVALON_PIO_DIRECTION(base)      __IO_CALC_ADDRESS_NATIVE(base, 1)
#define IORD_ALTERA_AVALON_PIO_DIRECTION(base)        IORD(base, 1)
#define IOWR_ALTERA_AVALON_PIO_DIRECTION(base, data)  IOWR(base, 1, data)#define IOADDR_ALTERA_AVALON_PIO_IRQ_MASK(base)       __IO_CALC_ADDRESS_NATIVE(base, 2)
#define IORD_ALTERA_AVALON_PIO_IRQ_MASK(base)         IORD(base, 2)
#define IOWR_ALTERA_AVALON_PIO_IRQ_MASK(base, data)   IOWR(base, 2, data)#define IOADDR_ALTERA_AVALON_PIO_EDGE_CAP(base)       __IO_CALC_ADDRESS_NATIVE(base, 3)
#define IORD_ALTERA_AVALON_PIO_EDGE_CAP(base)         IORD(base, 3)
#define IOWR_ALTERA_AVALON_PIO_EDGE_CAP(base, data)   IOWR(base, 3, data)#define IOADDR_ALTERA_AVALON_PIO_SET_BIT(base)       __IO_CALC_ADDRESS_NATIVE(base, 4)
#define IORD_ALTERA_AVALON_PIO_SET_BITS(base)         IORD(base, 4)
#define IOWR_ALTERA_AVALON_PIO_SET_BITS(base, data)   IOWR(base, 4, data)#define IOADDR_ALTERA_AVALON_PIO_CLEAR_BITS(base)       __IO_CALC_ADDRESS_NATIVE(base, 5)
#define IORD_ALTERA_AVALON_PIO_CLEAR_BITS(base)         IORD(base, 5)
#define IOWR_ALTERA_AVALON_PIO_CLEAR_BITS(base, data)   IOWR(base, 5, data)

4. PIO外部中断

NIOS ii的中断。其支持32个硬件中断,和STM32一样,每个中断都会对应一个中断服务函数(ISR),检测到中断时,都会现判断中断的优先级,然后再调用ISR。因此,同样与STM32,我们在应用中断时,首先需要使能中断,并且确定其优先级。然后编写中断服务函数。

1)硬件配置:按键使用中断,确定优先级
        这个过程是在Qsys中完成。如下,在QSYS中对KEY IP核生成,以及中断配置。如下图所示,在QSYS中添加PIO的IP核,然后设置其数据宽度,选择输入/输出。因为要设置中断,中断分为电平触发和边沿触发,因此需要设置同步捕捉边沿。

上面相当于硬件配置,要使用中断还需要软件注册中断函数,相当于SM32的配置中断向量表 。

2)软件注册中断函数

注册中断函数ISR,函数原型为:

int alt_irq_register(alt_u32 id, alt_u32_irq, alt_irq_func_isr,void*isr_context, void* flag);

id:中断优先级,即所注册的ISR是为哪个中断优先级的中断服务的;

alt_u32_irq:中断号;

alt_irq_func_isr:中断服务函数;

void*isr_context:中断服务函数的形参,没有时给0就行;

void* flag:保留的参数,没有时给0就行。

3)编写中断服务函数

与一般的函数定义没什么区别,只是对ISR的函数原型有特定的要求:void ISR_handler(void* context, alt_u32 id);

context:传给ISR的形参,可以是UNLL;

如下:

中断函数为:(中断函数的执行需要先对中断进行注册)

void ISR_handle_buttom(void * context)
{key_flag=~key_flag;IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY_BASE,0X0);//clear the interrupt
}

中断初始化函数:

void init_botton_pio(void)
{IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_KEY_BASE,0X1); //enable the interruptIOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY_BASE,0X0);//clear edge capture regist alt_ic_isr_register(PIO_KEY_IRQ_INTERRUPT_CONTROLLER_ID,PIO_KEY_IRQ,ISR_handle_buttom,NULL,0X0);
}

程序运行开始时,先使能按键对应的中断,然后将边沿捕捉寄存器清零,以便在中断来临时可以置1。然后用alt_ic_isr_register函数来进行中断注册,这样在中断产生时就知道需要执行哪个中断函数。其中,PIO_KEY_IRQ_INTERRUPT_CONTROLLER_ID,PIO_KEY_IRQ来自于system.h。

在使用上面的函数时,注意需要调用一些PIO的头文件以及中断的头文件:

#include <stdio.h>
#include <system.h> // 包含底层寄存器宏定义等
#include <altera_avalon_pio_regs.h>  //PIO的寄存器和函数
#include <unistd.h>
#include <sys/alt_irq.h>  // sys是中断头文件的目录,需要指定,不然找不到
#include <alt_types.h> //定义了常用的数据类型

5. 上电自启动功能

即如果使用RAM作为程序的存储会,掉电后数据和程序均丢失。如果使用外部的flash存储程序就不会丢失,上电后会自动读取flash程序,称为上电自启动。方法如下面。

6. 程序flash固化

要实现掉电程序不丢失,首先需要将程序存储在flash中,因此用Qsys生成NIOS II时,需要调用EPCS FLASH,并配置如下:

1)IP核内部的参数可以默认,生成IP核并连线。同时双击export栏的PIN,将外部接口输出;

2)配置NIOS的基地址,reset vector为FPGA复位或上电时从外部的flash中读取程序。Exception vector为其他的RAM存储器,这里是on-chip-ram,意思是FPGA把从flash的应用程序拷贝到RAM中后,应用程序才开始执行。

3) 生成NIOS II,更新并生成引脚。通过pin planning与外部PIN连接。

4)编写程序并building project。下载.sof文件到FPGA(nios ii --> quartus ii programmer)。

5)nios ii --> flash programmer -->file --> new -->选择 get flash programmer system details from SOPC information file -->在SOPC information file name 选择本项目对应的 kernel.sopcinfo-->ok;

6)  -->Connections ,连接成功后,有弹框出现。-->close;

7)-->add,在output_file文件夹下找到.sof文件,flash programmer工具会自动将.sof文件转换成.flash文件,用于EPCS FLASH烧录;

8)-->add,继续添加nios ii的应用程序.elf文件  --->start 开始烧写。通过短暂的 FLASH 擦除,编程,读取和校验的步骤,烧写完成。

NIOS ii 实战篇 --- 按键控制LED相关推荐

  1. 奋斗的小孩系列 FPGA学习altera系列: 第十篇 按键控制LED

    奋斗的小孩系列 FPGA学习altera系列: 第十篇 按键控制LED 作者:奋斗的小孩 郝旭帅(转载请注明出处) 大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术江 ...

  2. Nios ii 实战篇--- DDR2

    目的:通过nios II上的实现软核读写DDR2 相比之前的hello world项目的区别在于1. 在 Qsys 系统中添加 DDR2 的 IP 核,以及DDR2 IP 核的参数配置:2. 在 Ec ...

  3. Arduino基础入门篇07—按键控制LED灯

    前面介绍了Arduino数字I/O,通过控制数字引脚输出来控制LED灯亮灭.本篇将介绍数字I/O的输入功能,通过检测按键状态来控制LED灯亮灭,把LED的亮灭变成人为可控制的. 1. 实验材料 Uno ...

  4. petalinux zynq spi_ZYNQ 系列 01 | PL 实现按键控制 LED(1)

    注:本篇文章由[开源骚客:OpenSoc]公众号首发,现转载至头条号. 新的开始,这一篇文章,就算是使用 Vitis 开发 ZYNQ 的第一篇文章吧. 计划把 ZYNQ 开发写成一个系列,所使用的的软 ...

  5. 基于FPGA的两位按键控制LED数码管加减计数实验

    两位按键控制LED数码管加减计数实验 这是一篇拖了一个多月的文章,主要是基于FPGA利用按键消抖原理与动态数码管驱动原理相结合,来实现一个利用两位按键来控制数码管实现0-99的加法计数或者减法计数功能 ...

  6. 实现米思齐按键控制LED灯

    这篇文章是关于Arduino借助Mixly IDE软件的一个实验,有兴趣的同学可以看看.有什么错误的还请大家指出,我们一起探讨.由于很多人对于Arduino还不太了解,所以这里先简单介绍一下. 1.A ...

  7. 按键控制led灯python程序_树莓派使用threading函数实现多按键控制LED灯

    讲两个知识点.一个是关于上拉和下拉,另一个是关于threading函数. 1.上拉电阻和下拉电阻 上拉就是把一个不确定的信号通过一个电阻连接到高电位,这样在开关断开是信号为高电位,开关合上时信号为低电 ...

  8. STM32F103系列之按键控制LED灯

    上篇已经介绍了点灯的操作了,本篇主要介绍按键控制LED灯进行相关操作. 同样,我们需要对GPIO进行相关的初始化配置,这里我们将LED相关的代码全部放在LED.C和LED.H文件里面. LED.C文件 ...

  9. FPGA(1)基础入门 -- 按键控制led灯

    目录 效果说明 1.配置输入输出变量 2.变量赋值 3.配置引脚(输入输出变量) 代码 效果说明 key1按键按下,led1被点亮. key2按键按下,led2被点亮. 1.配置输入输出变量 inpu ...

  10. led计数电路实验报告_「正点原子FPGA连载」第八章 按键控制LED灯实验

    1)实验平台:正点原子开拓者FPGA开发板 2)本实例源码下载:请移步正点原子官网 第八章 按键控制LED灯实验 按键是常用的一种控制器件.生活中我们可以见到各种形式的按键,由于其结构简单,成本低廉等 ...

最新文章

  1. [原]对Linux环境下任务调度一点认识
  2. HDU 2836 (离散化DP+区间优化)
  3. 计算机网络平台实验,计算机网络实验
  4. mysql性能优化:my.cnf配置文件
  5. C++STL中swap函数操作与内存地址改变的简析
  6. Spring Boot Web应用开发 CORS 跨域请求支持
  7. win10操作技巧介绍,很实用!
  8. Linux中的Ramdisk和Initrd
  9. idea怎么跳转到源代码_mooc-IDEA 项目/文件之间跳转--002
  10. C#分析URL参数获取参数和值得对应列表(一)
  11. 【C#】1.2 控制台应用程序学习要点
  12. Atitit java播放mp3 目录 1.1. 不能直接支持mp3播放。。需要解码播放转化为pcm 1 1.2. 使用\javalayer类库播放 3 1.3. ,就是普通的java sound
  13. 小程序简介好看的登录页面(附源码)
  14. win10安装win10X虚拟机教程
  15. html使用iframe包含pdf文件,HTMLiframe用法总结收藏.pdf
  16. arcgis图层合并裁剪
  17. Docker中LNMP分布式容器部署
  18. 10x 程序员工作法 - 划重点 | “自动化”主题的重点内容回顾汇总
  19. RAID5系统架构和扩容
  20. 大商创是用哪种php柜架写的,大商创X二次开发基本规范与流程

热门文章

  1. 印度软件外包领军企业上演安然门
  2. 中国平安会不会成为美国的世通或者安然?
  3. e8 c 虚拟服务器,电信光猫e8-c怎么设置拨号方式上网
  4. 腾讯中层裁员10%,互联网资本进入寒流时代
  5. 如何装计算机网络驱动,网卡驱动安装,详细教您电脑网卡驱动怎么安装
  6. python文档:控制流(if,for,函数,lambda等)
  7. 基于控制台的老虎机Java Demo
  8. bada开发——简单介绍
  9. win7计算机如何设置密码,电脑win7怎么设置开机密码
  10. 找回 坚果云 的 选择性同步 功能