这几天在学习zynq,zynq芯片集成了两片arm a9的内核,和xilinx的fpga可编程部分集成在一块芯片上面。刚开始学习的时候使用vivado,感觉xilinx的vivado和sdk做的真的是很垃圾,太不人性化了,这也直接导致了我花了三天时间才学会了怎么分别用PS的MIO和PL部分点灯。主要都是因为一些软件使用上的细节问题,所以我觉得这软件做得不够人性化。好了,说了这么多,下面开始详细介绍了,很多资料都是讲如何用arm通过IP去用PL部分点灯,这部分我就不讲了,附件里面的lab2讲得很详细了(添加不了附件,放百度云盘里了http://pan.baidu.com/s/1c0ldfCs)。用arm的MIO点灯这部分我尽量写详细一点,不过太细节的我也就不说啦~~
STEP1:选择MIO Configuration,勾选中GPIO_MIO,我的开发板上的MIO7和MIO8上连着两个LED,所以这里选择MIO7和MIO8作为输出口,disable上拉pullup,我们使用这两个引脚,设置好了之后点击OK。这里吐槽一下,选择了GPIO_MIO后,所有的MIO就都被选择了,但是我只想用两个MIO7和MIO8这两个引脚啊,不知道怎么破,有人知道的话请告诉我一下~~
STEP2:后面就是常规的步骤一步一步来。不过有几点需要注意,就是如果你是在原来的工程上面修改的,建议你在export hardware时把原来工程的.sdk文件夹里面的东西全都删掉,然后再重新产生比特流,export hardware。我就是在这里吃了亏,在原来的工程上面修改后,export hardware后重新编译工程后,不知道为什么新的工程里面的xparameter.h里面没有对我的改动做相应的更新,所以导致我始终搞不明白如何使用PS的MIO做GPIO。这里再说一下,在sdk里面的bsp文件夹下的include文件中有一个xparameter.h文件,这个文件是对你在vivado中设计的硬件做一些定义,用过altera的nios的人都知道,nios就是通过一个system.h(好像是这个,记不大清了)来获取硬件配置参数。后来我把sdk全删掉重新export时就发现新的xparameter.h里面就出现了我想要的东西,就是PS的MIO相关定义。下面用图来说明。
.sdk文件夹中的内容,.hdf是生成比特流后产生的文件,应该是记录配置相关的参数,sdk工程根据这个文件生成对应的bsp文件。
bsp文件夹下面的include下面会有xparameter.h文件。
xparameter.h里面关于ps的GPIO的宏定义,程序就是根据XPAR_XGPIOPS_0_DEVICE_ID来找到这个对应的外设的,这个在后面的代码中会看到。如果你使用了PL部分的GPIO,也会有一个pl部分的GPIO的宏定义,和这个类似。注意这个是PS部分的,所以都用GPIOPS表示。如果你到了这一步,就说明前面的步骤都是对的了。要是没有,就说明前面的步骤哪里出错啦。
STEP3:现在就说说在sdk中如何用程序实现PS的GPIO的操作。主要是看bsp下面的libsrc中的gpiops文件中的代码。这个是xilinx已经实现好了的底层驱动,你只需要调用就可以了。
int led_gpiops()
{
int led_cnt;
XGpioPs_Config* ConfigPtr;
ConfigPtr = XGpioPs_LookupConfig(XPAR_XGPIOPS_0_DEVICE_ID);
if (ConfigPtr == (XGpioPs_Config *)NULL) {
return XST_FAILURE;
}
if(XST_SUCCESS == XGpioPs_CfgInitialize(&GpioPs, ConfigPtr, ConfigPtr->BaseAddr));
else return XST_FAILURE;
XGpioPs_SetDirection(&GpioPs, 0, 0x0180);
XGpioPs_SetOutputEnable(&GpioPs, 0, 0x0180);//pin8 pin7
//XGpioPs_SetDirectionPin(&GpioPs, 7, 1);
while(1)
{
for(led_cnt=0;led_cnt<512;led_cnt++)
{
XGpioPs_Write(&GpioPs, 0, led_cnt);
printf("Led_cnt: %x\r\n", led_cnt);
//delay();
}
}
}
对于代码的理解,你可以自己去查看调用的那几个函数的功能,很简单的。不过还是强调一下,xilinx提供的bsp里面的底层驱动中对于PL的GPIO和PS的GPIOPS的底层驱动是有区别的,两者在很多地方不同,比如关于引脚方向设置,PL的GPIO是0设置为输出,PS的GPIOPS是1设置为输出。自己看看xilinx提供的驱动的函数说明就会知道啦。只是注意一下就好了。
折腾了好几天终于把PS部分的LED给点亮啦~~