注:在源代码中 “ctrl+单击” 可查看详细信息
一.头文件
#include “xparameters.h” //器件参数信息
#include “xstatus.h” //包含 XST_FAILURE 和 XST_SUCCESS 的宏定义
#include “xil_printf.h” //包含 print()函数
#include “xgpiops.h” //包含 PS GPIO 的函数
#include “sleep.h” //包含 sleep()函数
二.宏定义
//PS_LED1 连接到 MIO38
#define MIO_LED1 38
//宏定义 GPIO_DEVICE_ID
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
三.函数
1.配置
<1>器件初始化
//PS 端 GPIO 驱动实例
XGpioPs gpiops_inst;
//PS 端 GPIO 配置信息
XGpioPs_Config *gpiops_cfg_ptr;
//根据器件 ID 查找配置信息
gpiops_cfg_ptr = XGpioPs_LookupConfig(GPIOPS_ID);
//初始化器件驱动
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);
//判断是否初始化成功
if (Status != XST_SUCCESS)return XST_FAILURE;
XGpioPs_Config XGpioPs_LookupConfig(u16 DeviceId);
/*
*
* This function looks for the device configuration based on the unique device
* ID. The table XGpioPs_ConfigTable[] contains the configuration information
* for each device in the system.
*
* @param DeviceId is the unique device ID of the device being looked up.
*
* @return A pointer to the configuration table entry corresponding to the
* given device ID, or NULL if no match is found.
*
* @note None.
*
******************************************************************************/
s32 XGpioPs_CfgInitialize(XGpioPs InstancePtr, const XGpioPs_Config ConfigPtr,u32 EffectiveAddr);
/*****************************************************************************/
/
*
* This function initializes a XGpioPs instance/driver.
* All members of the XGpioPs instance structure are initialized and
* StubHandlers are assigned to the Bank Status Handlers.
*
* @param InstancePtr is a pointer to the XGpioPs instance.
* @param ConfigPtr points to the XGpioPs device configuration structure.
* @param EffectiveAddr is the device base address in the virtual memory
* address space. If the address translation is not used then the
* physical address should be passed.
* Unexpected errors may occur if the address mapping is changed
* after this function is invoked.
*
* @return XST_SUCCESS always.
*
* @note None.
*
******************************************************************************/
int XGpio_Initialize(XGpio InstancePtr, u16 DeviceId);
/***************************************************************************/
/**
* Initialize the XGpio instance provided by the caller based on the
* given DeviceID.
*
* Nothing is done except to initialize the InstancePtr.
*
* @param InstancePtr is a pointer to an XGpio instance. The memory the
* pointer references must be pre-allocated by the caller. Further
* calls to manipulate the instance/driver through the XGpio API
* must be made with this pointer.
* @param DeviceId is the unique id of the device controlled by this XGpio
* instance. Passing in a device id associates the generic XGpio
* instance to a specific device, as chosen by the caller or
* application developer.
*
* @return
* - XST_SUCCESS if the initialization was successful.
* - XST_DEVICE_NOT_FOUND if the device configuration data was not
* found for a device with the supplied device ID.
*
* @note None.
*
*****************************************************************************/
<2>中断配置
//建立中断系统,使能KEY按键的下降沿中断
// @param GicInstancePtr是一个指向XScuGic驱动实例的指针
// @param gpio是一个指向连接到中断的GPIO组件实例的指针
// @param GpioIntrId是Gpio中断ID
// @return 如果成功返回XST_SUCCESS, 否则返回XST_FAILURE
int setup_interrupt_system(XScuGic *gic_ins_ptr, XGpioPs *gpio, u16 GpioIntrId)
{
int status;
XScuGic_Config *IntcConfig; //中断控制器配置信息
//查找中断控制器配置信息并初始化中断控制器驱动
IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
if (NULL == IntcConfig) {
return XST_FAILURE;
}
status = XScuGic_CfgInitialize(gic_ins_ptr, IntcConfig,
IntcConfig->CpuBaseAddress);
if (status != XST_SUCCESS) {
return XST_FAILURE;
}
//设置并使能中断异常
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
(Xil_ExceptionHandler) XScuGic_InterruptHandler, gic_ins_ptr);
Xil_ExceptionEnable();
//为中断设置中断处理函数
status = XScuGic_Connect(gic_ins_ptr, GpioIntrId,
(Xil_ExceptionHandler) intr_handler, (void *) gpio);
if (status != XST_SUCCESS) {
return status;
}
//使能来自于Gpio器件的中断
XScuGic_Enable(gic_ins_ptr, GpioIntrId);
//设置KEY按键的中断类型为下降沿中断,按ctrl+单击查看其他类型
XGpioPs_SetIntrTypePin(gpio, KEY, XGPIOPS_IRQ_TYPE_EDGE_FALLING);
//使能按键KEY中断
XGpioPs_IntrEnablePin(gpio, KEY);
return XST_SUCCESS;
}
//设置中断优先级和触发类型(高电平触发)
XScuGic_SetPriorityTriggerType(&scugic_inst, GPIO_INT_ID, 0xA0, 0x1);
中断处理函数:
//中断处理函数
// @param CallBackRef是指向上层回调引用的指针
static void intr_handler(void *callback_ref)
{
XGpioPs *gpio = (XGpioPs *) callback_ref;
//读取KEY按键引脚的中断状态,判断是否发生中断
if (XGpioPs_IntrGetStatusPin(gpio, KEY)){
key_press = TRUE;
XGpioPs_IntrDisablePin(gpio, KEY); //屏蔽按键KEY中断
//XGpioPs_IntrClearPin(&gpio, KEY); //清除按键KEY中断
//XGpioPs_IntrEnablePin(&gpio, KEY); //使能按键KEY中断
}
}
<3>uart配置
//UART初始化函数
int uart_init(XUartPs* uart_ps)
{
int status;
XUartPs_Config *uart_cfg;
uart_cfg = XUartPs_LookupConfig(UART_DEVICE_ID);
if (NULL == uart_cfg)
return XST_FAILURE;
status = XUartPs_CfgInitialize(uart_ps, uart_cfg, uart_cfg->BaseAddress);
if (status != XST_SUCCESS)
return XST_FAILURE;
//UART设备自检
status = XUartPs_SelfTest(uart_ps);
if (status != XST_SUCCESS)
return XST_FAILURE;
//设置工作模式:正常模式
XUartPs_SetOperMode(uart_ps, XUARTPS_OPER_MODE_NORMAL);
//设置波特率:115200
XUartPs_SetBaudRate(uart_ps,115200);
//设置RxFIFO的中断触发等级
XUartPs_SetFifoThreshold(uart_ps, 1);
return XST_SUCCESS;
}
中断函数
//UART中断处理函数
void uart_intr_handler(void *call_back_ref)
{
XUartPs *uart_instance_ptr = (XUartPs *) call_back_ref;
u32 rec_data = 0 ;
u32 isr_status ; //中断状态标志
//读取中断ID寄存器,判断触发的是哪种中断
isr_status = XUartPs_ReadReg(uart_instance_ptr->Config.BaseAddress,
XUARTPS_IMR_OFFSET);
isr_status &= XUartPs_ReadReg(uart_instance_ptr->Config.BaseAddress,
XUARTPS_ISR_OFFSET);
//判断中断标志位RxFIFO是否触发
if (isr_status & (u32)XUARTPS_IXR_RXOVR){
rec_data = XUartPs_RecvByte(XPAR_PSU_UART_0_BASEADDR);
//清除中断标志
XUartPs_WriteReg(uart_instance_ptr->Config.BaseAddress,
XUARTPS_ISR_OFFSET, XUARTPS_IXR_RXOVR) ;
}
XUartPs_SendByte(XPAR_PSU_UART_0_BASEADDR,rec_data);
}
2.GPIO操作
//设置指定引脚的方向:0 输入,1 输出
XGpioPs_SetDirectionPin(&Gpio, MIOLED0, 1);
//使能指定引脚输出:0 禁止输出使能,1 使能输出
XGpioPs_SetOutputEnablePin(&Gpio, MIOLED0, 1);
//向指定引脚写入数据:0 或 1
XGpioPs_WritePin(&Gpio, MIOLED0, 0x0);
//从指定引脚读入数据
XGpioPs_ReadPin(&gpiops_inst, MIO_KEY2)
//配置PL AXI GPIO
XGpio_SetDataDirection(&axi_gpio_inst, KEY_CHANNEL, 1); //设置PL AXI GPIO 通道1为输入
XGpio_InterruptEnable(&axi_gpio_inst, KEY_MASK); //使能通道1中断
XGpio_InterruptGlobalEnable(&axi_gpio_inst); //使能AXI GPIO全局中断
3.其他
//uart打印
print(“MIO Test! \n\r”);
//延时 1 秒
sleep(1);
本文转自 https://blog.csdn.net/qq_32971095/article/details/136315297,如有侵权,请联系删除。