在ip catalog里面搜索pio
设置,因为LED有四个所以输出是四位
连接线,注意这里的s1接到m0
最后要引出led
generate导出
在顶层文件添加led(大写是因为黄金工程底层引脚配置的大写)
更新rbf
更新dtb
打开eclipse
新建工程在eclipse中
//gcc标准头文件
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
//HPS厂家提供的底层定义头文件
#define soc_cv_av //开发平台Cyclone V 系列
#include "hwlib.h"
#include "socal/socal.h"
#include "socal/hps.h"
//与用户具体的HPS 应用系统相关的硬件描述头文件
#include "hps_0.h"
#define HW_REGS_BASE (ALT_STM_OFST) //HPS外设地址段基地址
#define HW_REGS_SPAN (0x04000000) //HPS外设地址段地址空间 64MB大小
#define HW_REGS_MASK (HW_REGS_SPAN - 1) //HPS外设地址段地址掩码
得到虚拟地址
int led_init(int *virtual_base){
int fd;
//1.使能mmu
void *periph_virtual_base;//外设空间虚拟地址
if ((fd = open("/dev/mem",(O_RDWR|O_SYNC)))==-1){
printf("Can't open mmu……\n");
return 1;
}
//2.映射外设地址段到用户空间
periph_virtual_base=mmap(NULL,HW_REGS_SPAN,(PROT_READ|PROT_WRITE),MAP_SHARED,fd,HW_REGS_BASE);
//3.加上外设地址段的虚拟地址、外设基于lw_axi_master桥的偏移地址
led_pio_virtual_base= periph_virtual_base +
((unsigned)(ALT_LWFPGASLVS_OFST+PIO_LED_BASE)&(unsigned)(HW_REGS_MASK));//桥的偏移地址
*virtual_base = periph_virtual_base;
return fd;
}
主函数
int main()
{
int fd;
int virtual_base;
int i;
fd = led_init(&virtual_base);
while(1)
{
*(led_pio_virtual_base + 0)=0x01;
sleep(1);
for(i=0;i<3;i++)
{
*(led_pio_virtual_base + 0)=*(led_pio_virtual_base + 0) << 1;
sleep(1);
}
}
if(munmap(virtual_base,HW_REGS_SPAN) == -1)
{
printf("Can't close mmu……\n");
return 1;
}
//关闭mmu;
close(fd);
return 0;
}