资讯详情

Soc之按键控制LED

Soc之按键控制LED

  • 一、硬件设置
    • 1. 添加按键、LED
    • 2. 修改Verilog代码
    • 3. 编译
    • 4. 文件生成
  • 二、软件设置
  • 参考


一、硬件设置

1. 添加按键、LED

在Platform Designer 加两个按钮,两个按钮LED:

LED为输出: 在这里插入图片描述

Key为输入:

Assign Base Address:

Generate HDL

Show Instantiation Template

复制最后两行:

Finish

2. 修改Verilog代码

改动1:

改动2:

3. 编译

编译后,设置引脚,重新编译。

4. 文件生成

参考SoC之HelloWorld 完成 ,并替换SD卡文件。


二、软件设置

参考SoC之HelloWorld打开Eclipse并创建工程和源文件,并添加头文件:

编写C代码:

/* * key_led.c * * Created on: 2022年7月19日 * Author: Sherlock */  //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外设地址段地址掩码  static unsignedlong * led_pio_virtual_base = NULL;
static unsigned long * key_pio_virtual_base = NULL;
static void * virtual_base;



int init(){ 
        
	// open函数打开MMU,获取总线虚拟地址
	int fd = open("/dev/mem", (O_SYNC | O_RDWR));
	if (fd == -1){ 
        
		printf("Open MMU 失败!\n");
		return -1;
	}

	// 映射虚拟地址
	virtual_base = mmap(NULL, HW_REGS_SPAN, (PROT_READ | PROT_WRITE), MAP_SHARED, fd, HW_REGS_BASE);
	if ((unsigned long)virtual_base == MAP_SHARED){ 
        
		printf("地址映射失败");
		return 1;
	}

	// 获取LED和Key的地址
	led_pio_virtual_base = virtual_base +
						((unsigned long)(ALT_LWFPGASLVS_OFST + PIO_LED_BASE) & (unsigned long)(HW_REGS_MASK));
	key_pio_virtual_base = virtual_base +
						((unsigned long)(ALT_LWFPGASLVS_OFST + PIO_KEY_BASE) & (unsigned long)(HW_REGS_MASK));
	return fd;
}


int main(){ 
        
	int fd = init();
	if (fd == -1){ 
        
		printf("初始化失败\n");
		return 1;
	}

	int i;
	while (1){ 
        
		for (i = 0; i < 2; i++){ 
        
			if (!((*(key_pio_virtual_base + 0)) & (1 << i))){ 
          // 第i位是0
				*(led_pio_virtual_base + 0) = *(led_pio_virtual_base + 0) | (1 << i);  // 将第i位变1
			} else { 
        
				*(led_pio_virtual_base + 0) = *(led_pio_virtual_base + 0) & (~(1 << i)); // 将第1位变0
			}
		}
	}

	if (munmap(virtual_base, HW_REGS_SPAN) == -1){ 
        
		printf("取消映射失败\n");
		close(fd);
		return -1;
	}

	close(fd);

	return 0;
}

运行结果:


参考

SoC之Hello World

标签: hps拉绳位稳传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台