这次我们不从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; }