Xilinx FPGA 使用Microblaze实现串口命令行
想在项目上使用串口命令行的方式操作工程里的某些线或者获取某些信息,FPGA使用的是Kintex-7,移植开源的letter shell适配MicroBlaze的运行。
开源的letter shell网址:letter-shell
我移植的是2.x的版本,如下图所示。
FPGA工程里面主要例化一个Microblaze软核,添加一个uart lite,一个gpio。uart管串口的接收和发送,gpio点LED灯用。还例化了一个up_axi模块,这个模块是ADI的一个开源的模块,可以把AXI Lite接口转成普通的Corebus接口,后面添加用户的读写寄存器比较方便,相对于AXI接口来讲,这个Corebus接口比较方便用户操作,当然也可以用Vivado工具自己定义一个AXI Lite模块来添加一些寄存器进去。把up_axi封装成了一个ip,可以在block design里面调用。
下面还是继续讲letter shell的移植吧,letter shell 2.x版本下载下来之后,目录如下所示
letter shell的源码修改了shell_cfg.h里几个参数。大概的作用就是在main函数的while(1)循环中调用shelltask函数,shell命令通过list的方式添加而不通过export的方式。
Microblaze的SDK工程那边就调用一下hello world的模板,然后添加一些函数进去,这也是主要参考letter shell 2.x里面README的内容。
README里的移植说明如下,
我把SDK生成的hello world改成了下面的内容。因为之前试过用export的方式不太行,README里面说用GCC编译要在ld文件里面添加个什么东西,不太会,所以就简单弄了下通过表的方式把命令列出来。
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "letter-shell-shell2.x/shell_cfg.h"
#include "letter-shell-shell2.x/shell.h"
#include "letter-shell-shell2.x/shell_ext.h"
#include"xparameters.h"
#include"xuartlite.h"
#include"xuartlite_l.h"SHELL_TypeDef shell;int ledon(int);int ledoff(int);signed char uartRead(char *data){u32 a;a=XUartLite_GetStatusReg(XPAR_AXI_UARTLITE_0_BASEADDR);if((a&1)==1){*data=XUartLite_RecvByte(XPAR_AXI_UARTLITE_0_BASEADDR);return 0;}else{return -1;}}void uartWrite(char data){XUartLite_SendByte(XPAR_AXI_UARTLITE_0_BASEADDR,data);}int ledon(int i){unsigned char data;switch(i){case 0x1: data = Xil_In32(XPAR_AXI_GPIO_0_BASEADDR);Xil_Out32(XPAR_AXI_GPIO_0_BASEADDR,data|0x1);printf("led1 is on...\r\n");break;case 0x2:data = Xil_In32(XPAR_AXI_GPIO_0_BASEADDR);Xil_Out32(XPAR_AXI_GPIO_0_BASEADDR,data|0x2);printf("led2 is on...\r\n");break;case 0x3:data = Xil_In32(XPAR_AXI_GPIO_0_BASEADDR);Xil_Out32(XPAR_AXI_GPIO_0_BASEADDR,data|0x4);printf("led3 is on...\r\n");break;case 0x4:data = Xil_In32(XPAR_AXI_GPIO_0_BASEADDR);Xil_Out32(XPAR_AXI_GPIO_0_BASEADDR,data|0x8);printf("led4 is on...\r\n");break;case 0x5:data = Xil_In32(XPAR_AXI_GPIO_0_BASEADDR);Xil_Out32(XPAR_AXI_GPIO_0_BASEADDR,data|0x10);printf("led5 is on...\r\n");break;case 0xff:Xil_Out32(XPAR_AXI_GPIO_0_BASEADDR,data|0xff);printf("all led is on...\r\n"); break;default:break;}return 0;}int ledoff(int i){int data;switch(i){case 1: data = Xil_In32(XPAR_AXI_GPIO_0_BASEADDR);if(data&0x01){Xil_Out32(XPAR_AXI_GPIO_0_BASEADDR,data&0xFE);printf("led1 is off...\r\n");}else{printf("led1 is already off...\r\n");}break;case 2:data = Xil_In32(XPAR_AXI_GPIO_0_BASEADDR);if(data&0x02){Xil_Out32(XPAR_AXI_GPIO_0_BASEADDR,data&0xFD);printf("led2 is off...\r\n");}else{printf("led2 is already off...\r\n");}break;case 3:data = Xil_In32(XPAR_AXI_GPIO_0_BASEADDR);if(data&0x04){Xil_Out32(XPAR_AXI_GPIO_0_BASEADDR,data&0xFB);printf("led3 is off...\r\n");}else{printf("led3 is already off...\r\n");}break;case 4:data = Xil_In32(XPAR_AXI_GPIO_0_BASEADDR);if(data&0x08){Xil_Out32(XPAR_AXI_GPIO_0_BASEADDR,data&0xF7);printf("led4 is off...\r\n");}else{printf("led4 is already off...\r\n");}break;case 5:data = Xil_In32(XPAR_AXI_GPIO_0_BASEADDR);if(data&0x10){Xil_Out32(XPAR_AXI_GPIO_0_BASEADDR,data&0xEF);printf("led5 is off...\r\n");}else{printf("led5 is already off...\r\n");}break;case 0xff:Xil_Out32(XPAR_AXI_GPIO_0_BASEADDR,data&0x00);printf("all led is off...\r\n");break;default:break;}return 0;}unsigned short cmdsize=3;//cmdsize must matches the commands in cmd_listSHELL_CommandTypeDef cmd_list[]={{"clr", shellClear, "clr \t--clear command line" },{"ledon", ledon, "ledon [] \t--0x1~0x5 separate led --0xff all led" },{"ledoff", ledoff, "ledoff [] \t--0x1~0x5 separate led --0xff all led" },};int main(){init_platform();shell.read = uartRead;shell.write = uartWrite;shellInit(&shell);shellSetCommandList(&shell, cmd_list, cmdsize);while(1){shellTask(&shell);}return 0;}
用putty串口助手,运行SDK打印信息如下
通过命令行控制LED打开
>>ledon 0x1
>>ledon 0x3
>>ledon 0x5
Xilinx FPGA 使用Microblaze实现串口命令行相关推荐
- Arduino 串口命令行控制继电器
手头有一块山寨的Arduino uno板,买来一直没怎用.最近工作上需要对PTC零件进行一些可靠性测试,需要在9VAC和230VAC之间不断的来回转换,正好可以用Arduino加继电器模块做了一个简单 ...
- 网御防火墙命令行管理操作
串口命令行命令介绍 ac>system show (显示系统信息防火墙序列号.版本号) ac>interface show all (显示所有网络端口的ip) ac>interf ...
- linux命令行发送串口_从命令行在Linux中发送电子邮件
linux命令行发送串口 In this article, you will learn how to send emails using the popular mail commands. It' ...
- Xilinx FPGA高速串行收发器简介
1 Overview 与传统的并行实现方法相比,基于串行I/O的设计具有很多优势,包括:器件引脚数较少.降低了板空间要求.印刷电路板(PCB)层数较少.可以轻松实现PCB设计.连接器较小.电磁干扰降低 ...
- Xilinx FPGA在线加载远程更新多重加载 QSPI加载方式 可通过PCIe/网口/串口等接口加载
Xilinx FPGA在线加载&远程更新&多重加载 QSPI加载方式 可通过PCIe/网口/串口等接口加载 源代码 需要的详谈 ID:6614999670814444294浪里个浪里个 ...
- linux 命令行操作串口
linux 命令行操作串口 1. 获取串口号 2. 配置串口属性(stty命令) 3. 串口数据读写操作 4. 解析数据 5. 后台运行 6. 绘制数据 Linux stty命令 一.参数: 二:用法 ...
- FPGA篇(十一)modelsim命令行仿真提示“vsim 不是内部或外部命令,也不是可运行的程序或批处理文件”的解决办法 (转)
安装完modelsim后,用过命令行模式仿真,如"vsim -c -do run.do",开始时是可以的. 后来偶然再用该仿真方式,发现命令行提示"vsim 不是内部或外 ...
- Xilinx FPGA的配置
http://blog.sina.com.cn/s/blog_98d98c7f0102v4ex.html http://www.cnblogs.com/aikimi7/p/3499633.html F ...
- xilinx芯片管脚使用限制_【转载】 Xilinx FPGA配置的一些细节
0 参考资料 (1) Xilinx: Development System Reference Guide. dev.pdf, v10.1 在Xilinx的doc目录下有. (2) Xilinx: V ...
最新文章
- python数值运算实例_Python矩阵常见运算操作实例总结
- cad vba 打开文件对话框_CAD文件损坏?无法打开?别急,这八种方法或许能帮到你...
- 在使用apt-get update 时更行列表,显示[Connecting to archive.ubuntu.com (2001:67c:1360:8001::21)]超时
- 斯坦福 CS228 概率图模型中文讲义 一、引言
- delphi制作上下开幕效果_显示产业国际盛会开幕,广州新型显示产值将突破2500亿...
- iOS获取手机卡IMSI信息
- React --获取服务器数据的两种方式(Axios和FetchJsonp)
- Django media 配置
- Filenet 周报丨2020.01.06-2020.01.19
- pythonappium环境搭建_python+appium 环境搭建
- 为什么有了二叉搜索树和二叉平衡树之后还需要红黑树?
- Python Scrapy爬虫框架详解
- php 单词替换,单词替换 - Shiyin's note
- 项目质量管理__七种基本质量工具__老七工具和新七工具
- Linux中gcc的常用命令
- jBox----弹出层插件
- java基础案例3-2银行存取款
- 百度地图SDK,报167错误,经纬度定位是4.9E-324的解决办法
- Idea相关操作以及相关问题
- 首席商学院新媒体运营黎想:抖音直播入门教学,点这!
热门文章
- Mac上refind定义macos+uos切换
- android加载长图片出现Bitmap too large to be uploaded into a texture的解决方案
- mysql中时间的储存方式_数据库 中“日期/时间”存储方式
- 新华三H3C无线控制器AC对接网络准入实现定制化Portal短信认证
- 速读原著-TCP/IP(tcpdump的输出)
- Java课后习题——编写程序求100以内的素数并输出
- 苹果X一直黑屏白苹果
- SpringCloud框架
- 游戏SDK到底是什么?
- 完全背包、多重背包练习总结