IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> NIOS ii 实战篇 --- 按键控制LED -> 正文阅读

[嵌入式]NIOS ii 实战篇 --- 按键控制LED

目录

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 interrupt
	IOWR_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 擦除,编程,读取和校验的步骤,烧写完成。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-01-08 14:11:18  更:2022-01-08 14:13:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 12:30:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码