当前位置: 首页 > news >正文

Zynq7020 SDK 初学篇(5)- 中断

1.开发背景

       基于上一个篇章 GPIO 使用,引入中断的使用。

2.开发需求

        PS 和 PL 按键输入中断,并输出对应的日志打印

3.开发环境

        Zynq7020 + Vivado2017.4

4.实现步骤

4.1 设计配置

PL Key0 56 

PS key0 12

PS key1 11

4.2 代码编写

GPIO 配置

#ifndef MSP_GPIO_H
#define MSP_GPIO_H#include "xgpiops.h"/* PS GPIO 映射 */
#define BOARD_LED0      (7)
#define BOARD_KEY0      (12)
#define BOARD_KEY1      (11)
#define CORE_LED        (0)/* PL GPIO 映射 */
#define EMIO_LED0       (54)
#define EMIO_LED1       (55)
#define EMIO_KEY0       (56)int mspGpio_Init(void);
void mspGpio_SetOutput(unsigned char gpioId, unsigned char state);
unsigned char mspGpio_GetInput(unsigned char gpioId);XGpioPs* mspGpio_GetPsHandle(void);#endif
#include "mspGpio.h"/* gpio 设备,不知为何为 0 */
#define GPIO_DEVICE_ID      XPAR_XGPIOPS_0_DEVICE_ID    // 0static XGpioPs s_psGpio = {0};/* GPIO 初始化 */
int mspGpio_Init(void)
{/* 通过设备 ID 找到对应的配置指针 */XGpioPs_Config *ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);/* 通过配置指针初始化GPIO */int Status = XGpioPs_CfgInitialize(&s_psGpio, ConfigPtr,ConfigPtr->BaseAddr);if (Status != XST_SUCCESS){return -1;}/* 设置  GPIO 方向输出,这里为什么会共用一个 GPIO 结构体?参数一致?  */XGpioPs_SetDirectionPin(&s_psGpio, CORE_LED, 1);XGpioPs_SetDirectionPin(&s_psGpio, BOARD_LED0, 1);XGpioPs_SetDirectionPin(&s_psGpio, BOARD_KEY0, 0);XGpioPs_SetDirectionPin(&s_psGpio, BOARD_KEY1, 0);XGpioPs_SetDirectionPin(&s_psGpio, EMIO_LED0, 1);XGpioPs_SetDirectionPin(&s_psGpio, EMIO_LED1, 1);XGpioPs_SetDirectionPin(&s_psGpio, EMIO_KEY0, 0);/* 使能 GPIO */XGpioPs_SetOutputEnablePin(&s_psGpio, BOARD_LED0, 1);XGpioPs_SetOutputEnablePin(&s_psGpio, CORE_LED, 1);XGpioPs_SetOutputEnablePin(&s_psGpio, EMIO_LED0, 1);XGpioPs_SetOutputEnablePin(&s_psGpio, EMIO_LED1, 1);return 0;
}/* 设置输出 */
void mspGpio_SetOutput(unsigned char gpioId, unsigned char state)
{XGpioPs_WritePin(&s_psGpio, gpioId, state);
}/* 获取输入 */
unsigned char mspGpio_GetInput(unsigned char gpioId)
{return XGpioPs_ReadPin(&s_psGpio, gpioId);
}/* 获取 PS GPIO 句柄 */
XGpioPs* mspGpio_GetPsHandle(void)
{return &s_psGpio;
}

        中断配置

#include "mspExit.h"#include "xscugic.h"#include "mspCore.h"
#include "mspGpio.h"
#include "mspTimer.h"static XScuGic intc = {0};   //通用中断控制器驱动实例//以下常量映射到xparameters.h文件
#define GPIO_DEVICE_ID      XPAR_XGPIOPS_0_DEVICE_ID      //PS端GPIO器件ID
#define INTC_DEVICE_ID      XPAR_SCUGIC_SINGLE_DEVICE_ID  //通用中断控制器ID
#define GPIO_INTERRUPT_ID   XPAR_XGPIOPS_0_INTR           //PS端GPIO中断IDstatic void intr_handler(void *callback_ref);/* 初始化中断接口 */
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按键的中断类型为下降沿中断XGpioPs_SetIntrTypePin(gpio, BOARD_KEY0, XGPIOPS_IRQ_TYPE_EDGE_FALLING);XGpioPs_SetIntrTypePin(gpio, BOARD_KEY1, XGPIOPS_IRQ_TYPE_EDGE_FALLING);XGpioPs_SetIntrTypePin(gpio, EMIO_KEY0, XGPIOPS_IRQ_TYPE_EDGE_FALLING);//使能按键KEY中断XGpioPs_IntrEnablePin(gpio, BOARD_KEY0);XGpioPs_IntrEnablePin(gpio, BOARD_KEY1);XGpioPs_IntrEnablePin(gpio, EMIO_KEY0);return XST_SUCCESS;
}/* 中断初始化 */
int mspExit_Init(void)
{setup_interrupt_system(&intc, mspGpio_GetPsHandle(), XPAR_XGPIOPS_0_INTR);return 0;
}/* 中断处理 */
void intr_handler(void *callback_ref)
{/* 强行延时 */
//    mspTimer_DelayMs(100);XGpioPs *gpio = (XGpioPs *) callback_ref;//读取KEY按键引脚的中断状态,判断是否发生中断if (XGpioPs_IntrGetStatusPin(gpio, BOARD_KEY1)){printf("key = %d\r\n", BOARD_KEY1);XGpioPs_IntrClearPin(gpio, BOARD_KEY1);      //清除按键KEY中断}else if (XGpioPs_IntrGetStatusPin(gpio, BOARD_KEY0)){printf("key = %d\r\n", BOARD_KEY0);XGpioPs_IntrClearPin(gpio, BOARD_KEY0);      //清除按键KEY中断}else if (XGpioPs_IntrGetStatusPin(gpio, EMIO_KEY0)){printf("key = %d\r\n", EMIO_KEY0);XGpioPs_IntrClearPin(gpio, EMIO_KEY0);      //清除按键KEY中断}
}

4.3 运行结果

http://www.lryc.cn/news/434428.html

相关文章:

  • 如何清缓存
  • 《计算机算法设计与分析》笔记
  • 智能指针怎么就智能了?
  • mysql 限制用户登录次数超过3次就 锁定账户在一段时间内不运行操作
  • 深度学习中的常用线性代数知识汇总——第二篇:行列式、逆矩阵、特征值与特征向量
  • 《MaPLe: Multi-modal Prompt Learning》中文校对版
  • MFC修改控件ID的详细说明
  • MySQL高可用配置及故障切换
  • AI模型一体机:智能办公的未来
  • jina的Embedding Reranker
  • Prompt Engineer: 使用Thought来提升LLM的回复能力
  • tekton构建标准ci(clone repo, test, build push img)
  • 【电力系统】复杂网络分析在电力系统规范中的应用
  • CDGA|推动数据治理与传统产业深度融合:策略与实践路径
  • 【FastAPI】离线使用Swagger UI 或 国内网络如何快速加载Swagger UI
  • Linux:从入门到放弃
  • SVM 监督学习
  • 奖励模型的训练
  • Ubuntu22.04之禁止内核自动更新(二百六十八)
  • kaggle题-房价预测(Pytorch),手把手教,全文代码解释
  • PulseSensor心率传感器详解(STM32)
  • NISP 一级 | 3.1 网络基础知识
  • 模拟网络丢包常用方法以及工具
  • ABC 370 E - Avoid K Partition
  • C++: set与map容器的介绍与使用
  • 单片机-STM32 看门狗(八)
  • iOS 18.1将上线新功能,可惜这波国内的小伙伴无缘了
  • MySQL中DML操作(二)
  • LLMs技术 | 整合Ollama实现本地LLMs调用
  • 【C-实践】文件服务器(3.0)