Tang Nano9K使用软核利用GPIO驱动游戏手柄
本次试用使用sipeed的Tang Nano 9K开发板,利用官方提供的riscv软核IP,并且扩充存储器,串口,GPIO等外设和HDMI显示接口,并将GPIO接口外扩PC游戏手柄,采集手柄按键状态,通过riscv软核处理器识别安装状态。
1. 硬件准备本次测试的基本硬件拓扑结构。以TangNano 9K为核心,包含LED灯,手柄,hdmi显示器。
TangNano 9K中包括了RISCV64软核IP,扩展了RAM,SPI接口的Flash存储器,GPIO和串口外设等,HDMI的驱动接口,以及为了保证系统运行的Reset按键,锁相环PLL的设备。 1.1 通过GPIO扩展采集游戏手柄 通过扩展GPIO采集游戏手柄上按钮的状态,本次采集手柄行的4个Button按键。
1、硬件扩展
扩展PIN25,PIN26,PIN27,PIN28四个IO点,采集手柄Button输入状态。
采用洞洞板,焊接了9K的扩展接口,也焊接了手柄的接口,并将使用的IO引出到扩展接口上。
1.2 通过GPIO扩展驱动LED小灯
LED的连接原理图
通过原理图可以了解到,小灯采用1.8V驱动,低电平有效,共有6个LED,引脚的连接关系如下表:
序号 | LED | PIN | 1 | LED1 | PIN10 | 2 | LED2 | PIN11 | 3 | LED3 | PIN13 | 4 | LED4 | PIN14 | 5 | LED5 | PIN15 | 6 | LED6 | PIN16 |
2. 工程创建2.2 打开工程
工程中包含了内核picoRV32,存储器,时钟,串口,外设,HDMI接口等。 2.3 IO扩展V代码
1) 调整picotiny.v的顶层代码
- module picotiny (
- input clk,
- input resetn,
- output tmds_clk_n,
- output tmds_clk_p,
- output [2:0] tmds_d_n,
- output [2:0] tmds_d_p,
- output flash_clk,
- output flash_c***,
- inout flash_mosi,
- inout flash_miso,
- input ser_rx,
- output ser_tx,
- inout [10:0] gpio
- );
复制代码
将inout [6:0] gpio,调整为inout [10:0] gpio ,这样给GPIO模块增加了4组IO输入。 2.4 完成物理约束
首先对代码综合一下,然后点击FloorPlanner完成物理约束定义。根据原理图的要求,和固件程序的处理要求,完成引脚分配和定义。
由于系统中用到了spi接口操作内嵌的flash存储器,所以还需要完成双目的引脚的定义,如图中所示选择。
增加游戏手柄输入引脚的对应分配关系。
将新增的4个GPIO引脚分别对应到PIN25,PIN26,PIN27,PIN28。选择这4个引脚的目的有2个: 一个是这4个IO没有特殊功能,并且引出到端子上了; 另一个是这4个IO属于BANK2,属于3.3V区域,适合使用。 2.5 布局布线 双击“Place & Route”,通常情况下是没有问题。
烧录的目标由前面的”SRAM program“,更改为“embFlash Erase,Program”。点击“program/cofigure”按钮,将前面完成的布局布线结果烧录到系统中。
3. 固件开发准备系统中为我们提供了系统固件的例程,存储在fw目录下。 3.1 工具链准备 我在windows环境下直接编译固件,所以需要windwos版的RISC-V的编译器。 然后安装处理器软件开发环境。 3.2 python环境 这个不详细写了,我们应该下载python3.6以上版本安装,同时应该选择将python的路径添加到系统的Path变量中。 3.3 编译固件准备 在picotiny目录的根目录下包含一个Makefile,我们打开它,然后调整 1) 其中的RISCV_PATH的路径,选择前面我们安装的开发环境中 risc-v的工具链的路径; 2) COMx调整为系统中实际枚举出的串口号。 保存后退出。 由于编译的过程中还需要make工具,所以,还需要将目录 盘符:GMDtoolchainGNU MCU EclipseBuildTools2.11-20180428-1604bin 添加到系统路径中。
- PYTHON_NAME ?= python
- RISCV_NAME ?= riscv-none-embed
- RISCV_PATH ?= C:/GMD/toolchain/RISC-V_toolchain
- MAKE ?= make
- FW_FILE = fw/fw-flash/build/fw-flash.v
- PROG_FILE ?= $(FW_FILE)
- COMx ?= COM11
- export PYTHON_NAME
- export RISCV_NAME
- export RISCV_PATH
- .PHONY: all brom flash clean program
- all: brom flash
- $(FW_FILE): flash
- brom:
- $(MAKE) -C fw/fw-brom
- flash:
- $(MAKE) -C fw/fw-flash
- clean:
- $(MAKE) -C fw/fw-brom clean
- $(MAKE) -C fw/fw-flash clean
- program: $(PROG_FILE)
- $(PYTHON_NAME) sw/pico-programmer.py $(PROG_FILE) $(COMx)
复制代码
3.4 编译固件
打开一个windows终端,并且进入到picotiny的根目录。编译固件,需要在终端中执行“make”,输出如下,我们可见它编译了fw-brom和fw-flash这两个固件,通常直接编译通过了。
3.5 烧录处理器固件到flash’存储器中
同上,我们直接在刚才的终端中执行“make program”,可见通过一个python的烧录工具pico-programmer.py将fw-flash固件烧录到嵌入式存储器中。 |