Xilinx FPGA ML605 开发笔记——跑马灯程序
2014-09-26 15:51
411 查看
上一篇笔记http://blog.csdn.net/stormragewang/article/details/39008553记录了如何创建一个hello world工程,现在我们使用基本的IO操作,写一个跑马灯的小程序。
这次我们不从ISE创建工程,直接从Xilinx Platform Studio中创建一个新环境
打开界面后选择使用向导创建工程
接下来选择工程的存储位置
接下来是选择开发板的型号
然后选择你需要的外设,我这个跑马灯程序只需要LED和LED_BUTTONS,串口用来输出信息
选择你需要的外设点击“完成”就可以了,之后进入工程的编辑界面,我们什么都不做,直接依次运行左边的Implement Flow就可以了
到最后Export这一步选择“Export and Launch SDK"就可以打开SDK了
在SK中我们新建一个Demo_LED的hello world工程,在工程对应的BSP工程下的sys.mss文件中有你添加的外设的相关文档和示例,直接选择LED就可以,效果如下图
第二个xgpio_example.c中有如何使用示例代码
但是请注意
1、截图中有个axi_gpio_0,那是因为中间我把LED删除了,然后通过添加GPIO的IP核方式添加到LED的连线上
2、示例代码是有问题的,我们参考相关的函数就好
3、默认的LED只作为GPIO的输出线,所以XGpio_DiscreteRead函数不好使。需要把它改为IO线(在Xilinx Platform Studio中修改)
然后修改约束文件(system.ucf)使GPIO的IO线连接LED(仅参考LED的接线)
3、改成IO线后需要使用XGpio_SetDataDirection函数来设置数据的传递方向才能再读写数据,下面是我最终的代码
#include <stdio.h>
#include "xparameters.h"
#include "xgpio.h"
#include "xgpio_l.h"
XGpio Gpio_LEDS;
#define LED_DELAY 5000000
#define LED_CHANNEL 1
#define LED_NUM 8
int show_leds(void)
{
int status;
int index = 0;
u32 DATAS[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
u32 tmp;
volatile int Delay;
status = XGpio_Initialize(&Gpio_LEDS, XPAR_GPIO_0_DEVICE_ID);
if (status != XST_SUCCESS) {
return XST_FAILURE;
}
XGpio_SetDataDirection(&Gpio_LEDS, LED_CHANNEL, 0x00000000);
XGpio_DiscreteWrite(&Gpio_LEDS, LED_CHANNEL, 0x00);
while (1) {
XGpio_SetDataDirection(&Gpio_LEDS, LED_CHANNEL, 0x00000000);
XGpio_DiscreteWrite(&Gpio_LEDS, LED_CHANNEL, DATAS[index]);
index ++;
index = index % LED_NUM;
for (Delay = 0; Delay < LED_DELAY; Delay++);
XGpio_SetDataDirection(&Gpio_LEDS, LED_CHANNEL, 0xFFFFFFFF);
tmp = XGpio_DiscreteRead(&Gpio_LEDS, LED_CHANNEL);
xil_printf("Read the data:%d\r\n", tmp);
}
return XST_SUCCESS;
}
这次我们不从ISE创建工程,直接从Xilinx Platform Studio中创建一个新环境
打开界面后选择使用向导创建工程
接下来选择工程的存储位置
接下来是选择开发板的型号
然后选择你需要的外设,我这个跑马灯程序只需要LED和LED_BUTTONS,串口用来输出信息
选择你需要的外设点击“完成”就可以了,之后进入工程的编辑界面,我们什么都不做,直接依次运行左边的Implement Flow就可以了
到最后Export这一步选择“Export and Launch SDK"就可以打开SDK了
在SK中我们新建一个Demo_LED的hello world工程,在工程对应的BSP工程下的sys.mss文件中有你添加的外设的相关文档和示例,直接选择LED就可以,效果如下图
第二个xgpio_example.c中有如何使用示例代码
但是请注意
1、截图中有个axi_gpio_0,那是因为中间我把LED删除了,然后通过添加GPIO的IP核方式添加到LED的连线上
2、示例代码是有问题的,我们参考相关的函数就好
3、默认的LED只作为GPIO的输出线,所以XGpio_DiscreteRead函数不好使。需要把它改为IO线(在Xilinx Platform Studio中修改)
然后修改约束文件(system.ucf)使GPIO的IO线连接LED(仅参考LED的接线)
# # pin constraints # NET CLK_N LOC = "H9" | DIFF_TERM = "TRUE" | IOSTANDARD = "LVDS_25"; NET CLK_P LOC = "J9" | DIFF_TERM = "TRUE" | IOSTANDARD = "LVDS_25"; NET Push_Buttons_5Bits_TRI_I[0] LOC = "G26" | IOSTANDARD = "LVCMOS15"; NET Push_Buttons_5Bits_TRI_I[1] LOC = "A19" | IOSTANDARD = "LVCMOS15"; NET Push_Buttons_5Bits_TRI_I[2] LOC = "G17" | IOSTANDARD = "LVCMOS15"; NET Push_Buttons_5Bits_TRI_I[3] LOC = "A18" | IOSTANDARD = "LVCMOS15"; NET Push_Buttons_5Bits_TRI_I[4] LOC = "H17" | IOSTANDARD = "LVCMOS15"; NET RESET LOC = "H10" | IOSTANDARD = "SSTL15" | TIG; # # additional constraints # NET "CLK" TNM_NET = sys_clk_pin; TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 200000 kHz; # # the LED constraints # NET axi_gpio_0_GPIO_IO_pin[0] LOC = "AC22" | IOSTANDARD = "LVCMOS15"; NET axi_gpio_0_GPIO_IO_pin[1] LOC = "AC24" | IOSTANDARD = "LVCMOS15"; NET axi_gpio_0_GPIO_IO_pin[2] LOC = "AE22" | <span style="white-space:pre"> </span>IOSTANDARD = "LVCMOS15"; NET axi_gpio_0_GPIO_IO_pin[3] LOC = "AE23" | <span style="white-space:pre"> </span>IOSTANDARD = "LVCMOS15"; NET axi_gpio_0_GPIO_IO_pin[4] LOC = "AB23" | IOSTANDARD = "LVCMOS15"; NET axi_gpio_0_GPIO_IO_pin[5] LOC = "AG23" | IOSTANDARD = "LVCMOS15"; NET axi_gpio_0_GPIO_IO_pin[6] LOC = "AE24" | IOSTANDARD = "LVCMOS15"; NET axi_gpio_0_GPIO_IO_pin[7] LOC = "AD24" | IOSTANDARD = "LVCMOS15"; # IOSTANDARD = "LVCMOS25"; # the uart constraints # NET axi_uartlite_0_RX_pin LOC = "J24" | IOSTANDARD = "LVCMOS15"; NET axi_uartlite_0_TX_pin LOC = "J25" | IOSTANDARD = "LVCMOS15";再重新生成bit文件和导出到SDK中
3、改成IO线后需要使用XGpio_SetDataDirection函数来设置数据的传递方向才能再读写数据,下面是我最终的代码
#include <stdio.h>
#include "xparameters.h"
#include "xgpio.h"
#include "xgpio_l.h"
XGpio Gpio_LEDS;
#define LED_DELAY 5000000
#define LED_CHANNEL 1
#define LED_NUM 8
int show_leds(void)
{
int status;
int index = 0;
u32 DATAS[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
u32 tmp;
volatile int Delay;
status = XGpio_Initialize(&Gpio_LEDS, XPAR_GPIO_0_DEVICE_ID);
if (status != XST_SUCCESS) {
return XST_FAILURE;
}
XGpio_SetDataDirection(&Gpio_LEDS, LED_CHANNEL, 0x00000000);
XGpio_DiscreteWrite(&Gpio_LEDS, LED_CHANNEL, 0x00);
while (1) {
XGpio_SetDataDirection(&Gpio_LEDS, LED_CHANNEL, 0x00000000);
XGpio_DiscreteWrite(&Gpio_LEDS, LED_CHANNEL, DATAS[index]);
index ++;
index = index % LED_NUM;
for (Delay = 0; Delay < LED_DELAY; Delay++);
XGpio_SetDataDirection(&Gpio_LEDS, LED_CHANNEL, 0xFFFFFFFF);
tmp = XGpio_DiscreteRead(&Gpio_LEDS, LED_CHANNEL);
xil_printf("Read the data:%d\r\n", tmp);
}
return XST_SUCCESS;
}
相关文章推荐
- Xilinx FPGA ML605 开发笔记——简单中断实现
- Xilinx FPGA ML605 开发笔记——Hello world工程
- C++学习笔记-后台服务程序开发模式
- 《MFC深入浅出》学习笔记--------Win32 SDK 程序开发流程
- 基于uClinux的开发应用程序-Helloworld和跑马灯程序
- 做了四年的winfrm,最近开始开发web程序,学习笔记如下:
- Android 学习笔记5---程序开发模式&拨号器&短信发送器小例程
- 微软软件项目开发方法--如何编写优秀的程序( 主讲:林斌 )视频笔记
- Android开发学习笔记:我的第一个Android程序--HelloWorld
- c#window程序开发入门系列--自学笔记
- 【学习笔记】零基础C#窗口程序开发入门
- 20110510 Brew工程师培训笔记——第二十六章 开发一个完整的BREW程序
- 手机程序开发笔记
- ACE学习笔记二(开发聊天程序)
- C#实现的中国象棋程序开发笔记——遇到困难,请大家帮忙!!
- c#window程序开发入门系列--自学笔记之WebBrowser
- C++学习笔记-后台服务程序开发模式
- C#实现的中国象棋程序开发笔记——遇到困难,请大家帮忙!!
- MC55开发之GPRS远程登陆程序的具体设计(独家整理!保证是你见过的MC55开发最全的笔记~~)
- MSP430学习笔记2-跑马灯程序,熟悉定时器寄存器的配置。