MicroBlaze实验系列有以下6个部分:
1、GPIO
2、中断,定时器
3、UART
4、DDR
5、SPI,I2C
6、自定义外设
用GPIO,最需要关注的是,BSP中的“xgpio.h”文件,里面说明了BSP能够提供给应用程序的内置结构体和函数。
1、结构体
typedef struct {
u16 DeviceId; /* Unique ID of device */
u32 BaseAddress; /* Device base address */
int InterruptPresent; /* Are interrupts supported in h/w */
int IsDual; /* Are 2 channels supported in h/w */
} XGpio_Config;
typedef struct {
u32 BaseAddress; /* Device base address */
u32 IsReady; /* Device is initialized and ready */
int InterruptPresent; /* Are interrupts supported in h/w */
int IsDual; /* Are 2 channels supported in h/w */
} XGpio;
系统中的每一个GPIO设备,都需要分配一个XGpio。然后使用下面的函数时,需要把这个XGpio的指针作为参数传进去。
2、函数
//xgpio_sinit.c
//初始化函数,根据给定的DeviceId,初始化对应的Gpio。这个函数在执行时,会调用第二个函数。
int XGpio_Initialize (XGpio *InstancePtr, u16 DeviceId);
//根据DeviceId返回对应的XGpio_Config
XGpio_Config *XGpio_LookupConfig (u16 DeviceId);
//xgpio.c
在给定的地址位置,用给定的配置信息,初始化一个GPIO。
int XGpio_CfgInitialize(XGpio *InstancePtr, XGpio_Config * Config, u32 EffectiveAddr);
为给定的通道里的每一个单独的端口,设置信号的方向(输入/输出)。Channel是GPIO的通道号(在Vivado中放置一个GPIO时分配的编号)。DirectionMask是一个32位的位模板,0表示输出,1表示输入。
void XGpio_SetDataDirection(XGpio *InstancePtr, unsigned Channel, u32 DirectionMask);
和Java中类似,一个Set方法,一个Get方法
u32 XGpio_GetDataDirection(XGpio *InstancePtr, unsigned Channel);
写端口
void XGpio_DiscreteWrite(XGpio *InstancePtr, unsigned Channel, u32 Mask);
读端口
u32 XGpio_DiscreteRead(XGpio *InstancePtr, unsigned Channel);
//xgpio_intr.c
与中断相关的设置函数,如果要用GPIO的中断,需要在Vivado的软核配置中,允许GPIO的中断功能,并接好线。
void XGpio_InterruptGlobalEnable(XGpio *InstancePtr);
void XGpio_InterruptGlobalDisable(XGpio *InstancePtr);
void XGpio_InterruptEnable(XGpio *InstancePtr, u32 Mask);
void XGpio_InterruptDisable(XGpio *InstancePtr, u32 Mask);
void XGpio_InterruptClear(XGpio *InstancePtr, u32 Mask);
u32 XGpio_InterruptGetEnabled(XGpio *InstancePtr);
u32 XGpio_InterruptGetStatus(XGpio *InstancePtr);
//xgpio_extra.c
void XGpio_DiscreteSet(XGpio *InstancePtr, unsigned Channel, u32 Mask);
void XGpio_DiscreteClear(XGpio *InstancePtr, unsigned Channel, u32 Mask);
//xgpio_selftest.c
int XGpio_SelfTest(XGpio *InstancePtr);