如何在PL部分生成一个GPIO实例,并且在SDK中使用API调用相关硬件?
XGpio Gpio;
Status = XGpio_Initialize(&Gpio, XPAR_AXI_GPIO_0_DEVICE_ID);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
XGpio_SetDataDirection(&Gpio, 1, 0x0);
XGpio_DiscreteWrite(&Gpio,1,0x0f);
由于C语言是面向结构的语言,在这里我们可以看到,为了维护XGPIO这样一个对象,我们在调用XGpio_Initialize/XGpio_SetDataDirection/XGpio_DiscreteWrite等函数时都要传入一个对象的结构体,用来表示当前的操作指向对象,如果这些代码用C++编写的话,那我们在实例化这个对象时,只需要指定是哪个实例,此后的所有的调用都不再需要指定对象,因为这些数据都会由对象来维护。
XPAR_AXI_GPIO_0_DEVICE_ID是文件xparameters.h中的一个宏定义:
/* Definitions for driver GPIO */
#define XPAR_XGPIO_NUM_INSTANCES 1
/* Definitions for peripheral AXI_GPIO_0 */
#define XPAR_AXI_GPIO_0_BASEADDR 0x41200000
#define XPAR_AXI_GPIO_0_HIGHADDR 0x4120FFFF
#define XPAR_AXI_GPIO_0_DEVICE_ID 0
#define XPAR_AXI_GPIO_0_INTERRUPT_PRESENT 0
#define XPAR_AXI_GPIO_0_IS_DUAL 0
这个文件是由EDK自动产生的,根本当前的硬件配置自动生成的,(具体怎么生成?)
上面的宏定义其实就是对应我们在XPS中添加的一个AXI_GPIO_0外设,所以通过传递这个参数,我们就使用XGpio_Initialize函数来得到这个外设的结构体。
XGpio_SetDataDirection设定GPIO的方向,XGpio_DiscreteWrite用于向这个对象写入数据,第2个参数是指定通道,由于PL部分的GPIO有2个通道,所以这里的1表明是指定的通道1。
在点亮PL系统的LED时出现了下面一个笔误,也许是较长时间没有写代码的原因,在调用的DELAY函数前面竟然加了一个VOID,这个运行时就没有出现延时效果,不知道为什么?
while(1)
{
XGpio_DiscreteWrite(&Gpio,1,0x0);
void delay();
XGpio_DiscreteWrite(&Gpio,1,0x7);
void delay();
}
为了测试这种写法中的DELAY有没有运行,我在VS2008中新建了一个WINDOWS CONSOLE程序,测试代码如下:
while(1)
{
printf("hello1");
void delay();
printf("hello2");
void delay();
}
发现"HELLO1"和"HELLO2"都有正常输出,但是DELAY函数根本没有执行,在单步调试时VS自动跳过。
查看汇编代码如下:
while(1)
00FE13CE mov eax,1
00FE13D3 test eax,eax
00FE13D5 je wmain+57h (0FE1407h)
{
printf("hello1");
00FE13D7 mov esi,esp
00FE13D9 push offset string "hello1" (0FE5744h)
00FE13DE call dword ptr [__imp__printf (0FE82BCh)]
00FE13E4 add esp,4
00FE13E7 cmp esi,esp
00FE13E9 call @ILT+325(__RTC_CheckEsp) (0FE114Ah)
void delay();
printf("hello2");
00FE13EE mov esi,esp
00FE13F0 push offset string "hello2" (0FE573Ch)
00FE13F5 call dword ptr [__imp__printf (0FE82BCh)]
00FE13FB add esp,4
00FE13FE cmp esi,esp
00FE1400 call @ILT+325(__RTC_CheckEsp) (0FE114Ah)
void delay();
}
可以看出,根本就没有给VOID DELAY产生汇编代码。