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

新星杯-ESP32智能硬件开发--ESP32的I/O组成-系统中断矩阵

本博文内容导读📕🎉🔥

ESP32开发板的中断矩阵、功能描述与实现、相关API和示例程序进行介绍

 ESP32中断矩阵将任一外部中断源单独分配到每个CPU的任一外部中断上,提供了强大的灵活性,能适应不同的应用需求。

 ESP32中断主要有以下特性:

接收71个外部中断源作为输入,为两个CPU分别生成26个外部中断(总共52个)作为输出,屏蔽CPU的NMI类型中断,查询外部中断源当前的中断状态,

包括外设中断配置寄存器、中断源、中断矩阵和中断输出寄存器。

1.外部中断源

ESP32共有71个外部中断源,有67个可以分配给两个CPU,

其余4个外部中断源只能分配给特定的CPU,每个CPU2个。GPIO_INTERRUPT_PRO和GPIO_INTERRUPT_PRO_NMI只可以分配给PRO_CPU,GPIO_INTERRUPT_APP和GPIO_INTERRUPT_APP_NMI只可以分配给APP_CPU。

因此,PRO_CPU与APP_CPU各分配到69个外部中断源。

2.CPU中断源

两个CPU(PRO_CPU和APP_CPU)各有32个中断,其中26个为外部中断。

编号 

类别 

种类 

优先级

编号 

类别 

种类 

优先级

外部中断 

电平触发 

1

16 

内部中断 

定时器 

5

外部中断 

电平触发 

1

17 

外部中断 

电平触发 

1

外部中断 

电平触发 

1

18 

外部中断 

电平触发 

1

外部中断 

电平触发 

1

19 

外部中断 

电平触发 

2

外部中断 

电平触发 

1

20 

外部中断 

电平触发 

2

外部中断 

电平触发 

1

21 

外部中断 

电平触发 

2

内部中断 

定时器 

1

22 

外部中断 

边沿触发 

3

内部中断 

软件 

1

23 

外部中断 

电平触发 

3

外部中断 

电平触发 

1

24 

外部中断 

电平触发 

4

外部中断 

电平触发 

1

25 

外部中断 

电平触发 

4

10 

外部中断 

边沿触发 

1

26 

外部中断 

电平触发 

5

11 

内部中断 

解析 

3

27 

外部中断 

电平触发 

3

12 

外部中断 

电平触发 

1

28 

外部中断 

边沿触发 

4

13 

外部中断 

电平触发 

1

29 

内部中断 

软件 

3

14 

外部中断 

NMI 

NMI

30 

外部中断 

边沿触发 

4

15 

内部中断 

定时器 

3

31 

外部中断 

电平触发 

5

3.分配外部中断源至CPU外部中断

首先,按照如下规则描述中断:记号Source_X代表某个外部中断源。记号PRO_X_MAP_REG(或 APP_X_MAP_REG)表示PRO_CPU(或 APP_CPU)的某个外部中断配置。寄存器,且此外部中断配置寄存器与外部中断源Source_X相对应。

即表4-7中“PRO_CPU(APP_CPU)-外设中断配置寄存器”一列中与“外设中断源名称”一列中的某个外部中断源处于同一行的寄存器。记号Interrupt_P表示CPU中断序号为Num_P的外部中断,Num_P的取值范围为是0~5、8~10、12~14、17~28、30~31。记号Interrupt_I表示CPU中断序号为Num_I的内部中断,Num_I的取值范围是6、7、11、15、16、29。

其次,根据中断源、寄存器、内外中断,可以这样描述中断矩阵控制器操作:将外部中断源Source_X分配到CPU(PRO_CPU或APP_CPU)。

寄存器PRO_X_MAP_REG(APP_X_MAP_REG)配成Num_P。Num_P可以取任意CPU外部中断值,CPU中断可以被多个外设共享。关闭CPU(PRO_CPU或APP_CPU)外部中断源Source_X。将寄存器PRO_X_MAP_REG(APP_X_MAP_REG)配成任意 Num_I。由于任何被配成 Num_I 的中断都没有连接到2 CPU上,选择特定内部中断值不会造成影响。

将多个外部中断源Source_Xn ORed分配到PRO_CPU(APP_CPU)的外部中断。将各个寄存器PRO_Xn_MAP_REG (APP_Xn_MAP_REG)配成同样的Num_P。这些外设中断都会触发CPU的Interrupt_P。

4.屏蔽CPU的NMI类型中断

中断矩阵能够根据信号PRO_CPU的NMI中断屏蔽(或APP_CPU的NMI中断屏蔽)暂时屏蔽所有被分配到PRO_CPU(或APP_CPU)的外部中断源的NMI中断。

信号PRO_CPU的NMI中断屏蔽和APP_CPU的NMI中断屏蔽分别来自外设进程号控制器。

5.查询外部中断源当前的中断状态

读寄存器 PRO_INTR_STATUS_REG_n(APP_INTR_STATUS_REG_n)中特定位的值就可以获知外部中断源当前的中断状态。

寄存器PRO_INTR_STATUS_REG_n(APP_INTR_STATUS_REG_n)与外部中断源的对应关系。

中断类型定义

中断的大多数功能与GPIO有关,从GPIO的头文件中有很多定义和函数是针对中断的,本节对其主要的定义和函数进行总结。在gpio_types.h或者gpio.h,头文件中的预定义。gpio_int_type_t是ESP32中断类型的定义,是枚举类型,定义如下:

typedef enum {GPIO_INTR_DISABLE = 0,     /*禁用GPIO中断*/GPIO_INTR_POSEDGE = 1,     /*GPIO中断类型:上升沿*/GPIO_INTR_NEGEDGE = 2,     /*GPIO中断类型:下降沿*/GPIO_INTR_ANYEDGE = 3,     /*GPIO中断类型:上升和下降沿*/GPIO_INTR_LOW_LEVEL = 4,   /*GPIO中断类型:低电平触发*/GPIO_INTR_HIGH_LEVEL = 5,  /*GPIO中断类型:高电平触发*/GPIO_INTR_MAX,
} gpio_int_type_t;

中断示例程序

基于ESP IDF的VS Code、Arduino和MicroPython环境的三种代码实现。

本程序将GPIO18定义为输出,GPIO4定义为输入,上拉状态,从上升沿触发中断,将GPIO18与GPIO4通过导线直接连接,GPIO18产生的脉冲触发,开始计数,对GPIO4进行余4运算,每隔4s产生中断,在串口打印中断信息。

1. 基于ESP IDF的VS Code开发环境实现方式
代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
#define GPIO_OUTPUT_IO_0    18
#define GPIO_OUTPUT_PIN_SEL  (1ULL<<GPIO_OUTPUT_IO_0)
#define GPIO_INPUT_IO_0     4
#define GPIO_INPUT_PIN_SEL  (1ULL<<GPIO_INPUT_IO_0)
#define ESP_INTR_FLAG_DEFAULT 0
static xQueueHandle gpio_evt_queue = NULL;          //FreeRTOS的队列句柄
static void IRAM_ATTR gpio_isr_handler(void* arg)     //函数gpio_isr_handler的调用规范
{uint32_t gpio_num = (uint32_t) arg;xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);    
}
static void gpio_task_example(void* arg)               //构建任务
{uint32_t io_num;for(;;) {if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) {  //接收队列printf("GPIO[%d] intr, val: %d\n", io_num, gpio_get_level(io_num));}}
}
void app_main(void)                                  //主函数
{gpio_config_t io_conf;                            //定义结构体io_conf.intr_type = GPIO_PIN_INTR_DISABLE;      //禁用中断io_conf.mode = GPIO_MODE_OUTPUT;            //设置输出模式io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;    //GPIO18的比特掩码io_conf.pull_down_en = 0;                         //禁用下拉模式io_conf.pull_up_en = 0;                           //禁用上拉模式gpio_config(&io_conf);                           //使用以上参数初始化GPIOio_conf.intr_type = GPIO_PIN_INTR_POSEDGE;     //上升沿触发中断io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL;      //GPIO4的比特掩码io_conf.mode = GPIO_MODE_INPUT;              //设置输入模式io_conf.pull_up_en = 1;                           //使能上拉模式gpio_config(&io_conf);                           //使用以上参数配置gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));  //创建队列处理中断xTaskCreate(gpio_task_example, "gpio_task_example", 2048, NULL, 10, NULL); //开启任务gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);  //安装GPIO中断服务
gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0);
//GPIO引脚挂钩ISR处理程序int cnt = 0;while(1) {printf("cnt: %d\n", cnt++);                       //打印计数vTaskDelay(1000 / portTICK_RATE_MS);         //延时1Sgpio_set_level(GPIO_OUTPUT_IO_0, cnt % 4);     //每隔4个计数,打印一次中断//gpio_set_level(GPIO_OUTPUT_IO_1, cnt % 2);}
}

2. Arduino开发环境实现
代码如下: 

void callBack(void)
{Serial.printf("GPIO 4 Interrupted\n");
}
void setup()
{Serial.begin(115200);                //设置串口监视器波特率Serial.println();pinMode(18, OUTPUT);              //GPIO18为输出模式pinMode(4, INPUT);                 //GPIO4为输入模式attachInterrupt(4, callBack, RISING);   //上升沿触发中断
}
int cnt = 0;
void loop()                         //主函数
{Serial.printf("cnt: %d\n", cnt++);    //打印计数digitalWrite(18, cnt % 4);         //每隔4个计数,打印一次中断delay(1000);                   //延时1S//detachInterrupt(4); //关闭中断
}

3. MicroPython开发环境实现
代码如下:

import time
import machine
from machine import Pin 
GPIO_OUTPUT=Pin(18,Pin.OUT)
GPIO_INPUT=Pin(4,Pin.IN, Pin.PULL_UP)
cnt=0                          #定义计数
interrupt = 0
interruptsCounter = 0              #计算中断事件次数
def callback(pin):                 #定义回调函数global interrupt, interruptsCounter  #声明为全局变量interrupt = 1interruptsCounter = interruptsCounter+1
GPIO_INPUT.irq(trigger=Pin.IRQ_RISING, handler=callback)
while True:GPIO_OUTPUT.value(cnt%4)time.sleep(1)cnt=cnt+1if interrupt:#state = machine.disable_irq()  #禁用计数器interrupt = 0#machine.enable_irq(state)  #重新启动计数器print("Interrupt has occurred: " + str(interruptsCounter))

相关文章:

新星杯-ESP32智能硬件开发--ESP32的I/O组成-系统中断矩阵

本博文内容导读&#x1f4d5;&#x1f389;&#x1f525; ESP32开发板的中断矩阵、功能描述与实现、相关API和示例程序进行介绍 ESP32中断矩阵将任一外部中断源单独分配到每个CPU的任一外部中断上&#xff0c;提供了强大的灵活性&#xff0c;能适应不同的应用需求。 ESP32中断主…...

4329 树的连边II

通过链式前向星来求树的直径 主要包括&#xff1a;链式前向星的初始化&#xff0c;遍历&#xff0c;使用 #include<bits/stdc.h> using namespace std; using lllong long; const int N1e59; int n,head[N],to[N<<1],nx[N<<1],cnt0; int ans0; int dp[N][2…...

Spring的Bean详解=Bean别名+作用范围+使用场景

目录 Bean的别名&#xff1a;id和name的地位等同 Bean的作用范围&#xff1a;scope单例与非单例 Bean的使用场景&#xff1a;什么时候交给容器&#xff1f;什么时候不交&#xff1f;​ Bean的别名实践&#xff08;含代码&#xff09; 如果看不懂下面的&#xff0c;例如不知道i…...

聊一聊如何适应AI时代

我的工作行业就不提了&#xff0c;处于AI的前沿阵地之一&#xff0c;AI的进步非常惊艳&#xff0c;虽然我对AI持有开放态度&#xff0c;但也恐惧&#xff0c;因为我的进步跟不上它迭代的速度。 AI能涉及的行业&#xff1a;辅助驾驶、医疗诊断、数据分析、文稿生成、工业控制...…...

dl学习笔记:(4)简单神经网络

&#xff08;1&#xff09;单层正向回归网络 bx1x2z100-0.2110-0.05101-0.051110.1 接下来我们用代码实现这组线性回归数据 import torch x torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype torch.float32) z torch.tensor([-0.2, -0.05, -0.05, 0.1]) w torch.…...

电商项目高级篇08-springCache

电商项目高级篇08-springCache 1、整合springCache2、Cacheable细节设置 1、整合springCache 1、引入依赖 <!--引入springCache--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifa…...

4.1 AI 大模型应用最佳实践:如何提升 GPT 模型使用效率与质量

AI 大模型应用最佳实践:如何提升 GPT 模型使用效率与质量 随着人工智能技术的不断进步,GPT系列大模型已经成为了自然语言处理领域的核心工具。无论是在文本生成、对话系统,还是内容创作等领域,GPT模型都展现出了强大的能力。然而,要高效、精确地使用这些模型,仍然需要一…...

Linux top命令cpu使用率计算底层原理

在Linux中&#xff0c;top命令通过读取内核提供的统计数据来计算CPU使用率。其底层原理可以概括为以下几步&#xff1a; 1. 读取 /proc/stat top命令主要从/proc/stat文件中获取CPU的统计信息。这个文件包含了每个CPU核心&#xff08;或所有核心合计&#xff09;的各种状态下的…...

vue知识点总结

vue2知识点总结 watch: watch 是 Vue 提供的一个选项&#xff0c;它允许你观察 Vue 实例上的数据变化。当观察的数据发生变化时&#xff0c;会执行相应的回调函数&#xff0c;这样你就可以对数据的变化做出响应&#xff0c;执行一些特定的操作。 export default {data() {re…...

[实现Rpc] 环境搭建 | JsonCpp | Mudou库 | callBack()

目录 1. 项目介绍 2. 技术选型 3. 开发环境和环境搭建 Ubuntu-22.04环境搭建 1. 安装 wget&#xff08;一般情况下默认会自带&#xff09; 2. 更换国内软件源 ① 备份原始 /etc/apt/sources.list 文件 ② 编辑软件源文件 ③ 更新软件包列表 3. 安装常用工具 3.1 安装…...

llamafactory使用8张昇腾910b算力卡lora微调训练qwen2-72b大模型

说明 我需要在昇腾服务器上对Qwen2-72B大模型进行lora微调&#xff0c;改变其自我认知。 我的环境下是8张910B1卡。显存约512GB。 准备&#xff1a;安装llamafactory 请参考官方方法安装llamafactory&#xff1a;https://github.com/hiyouga/LLaMA-Factory 特别强调下&…...

C++,设计模式,【目录篇】

文章目录 1. 简介2. 设计模式的分类2.1 创建型模式&#xff08;Creational Patterns&#xff09;&#xff1a;2.2 结构型模式&#xff08;Structural Patterns&#xff09;&#xff1a;2.3 行为型模式&#xff08;Behavioral Patterns&#xff09;&#xff1a; 3. 使用设计模式…...

《目标检测数据集下载地址》

一、引言 在计算机视觉的广袤领域中&#xff0c;目标检测宛如一颗璀璨的明星&#xff0c;占据着举足轻重的地位。它宛如赋予计算机一双锐利的 “眼睛”&#xff0c;使其能够精准识别图像或视频中的各类目标&#xff0c;并确定其位置&#xff0c;以边界框的形式清晰呈现。这项技…...

C 语言的void*到底是什么?

一、void* 的类型任意性 void* 是一种通用指针类型。它可以指向任意类型的数据。例如&#xff0c;它可以指向一个整数&#xff08;int&#xff09;、一个浮点数&#xff08;float&#xff09;、一个字符&#xff08;char&#xff09;或者一个结构体等。在C语言中&#xff0c;当…...

Linux中的文件上传和下载

Linux中的文件上传和下载 一、连接 SFTP 在 SecureCRT 中&#xff0c;将鼠标移动到连接窗口的标题上&#xff0c;按鼠标右键&#xff0c;选择“连接 SFTP”标签&#xff0c;即可进入 SFTP 模式。 二、基本指令及用途 1. 显示当前目录 显示本地当前目录&#xff1a;lpwd 示例…...

DDD - 微服务落地的技术实践

文章目录 Pre概述如何发挥微服务的优势怎样提供微服务接口原则微服务的拆分与防腐层的设计 去中心化的数据管理数据关联查询的难题Case 1Case 2Case 3 总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服…...

fgets、scanf存字符串应用

题目1 夺旗&#xff08;英语&#xff1a;Capture the flag&#xff0c;简称 CTF&#xff09;在计算机安全中是一种活动&#xff0c;当中会将“旗子”秘密地埋藏于有目的的易受攻击的程序或网站。参赛者从其他参赛者或主办方偷去旗子。 非常崇拜探姬的小学妹最近迷上了 CTF&am…...

鸿蒙动态路由实现方案

背景 随着CSDN 鸿蒙APP 业务功能的增加&#xff0c;以及为了与iOS、Android 端统一页面跳转路由&#xff0c;以及动态下发路由链接&#xff0c;路由重定向等功能。鸿蒙动态路由方案的实现迫在眉睫。 实现方案 鸿蒙版本动态路由的实现原理&#xff0c;类似于 iOS与Android的实…...

Spring-boot3.4最新版整合swagger和Mybatis-plus

好家伙,今天终于开始用spring-boot3开始写项目了&#xff0c;以后要彻底告别1.x和2.x了&#xff0c;同样的jdk也来到了最低17的要求了,废话不多说直接开始 这是官方文档的要求jdk最低是17 maven最低是3.6 一. 构建工程,这一步就不需要给大家解释了吧 二. 整合Knife4j 1.大于…...

基于Java的高校实习管理平台

基于Java的高校实习管理平台是一个专为高校设计的信息化管理工具&#xff0c;旨在通过信息化手段简化实习管理流程&#xff0c;提高管理效率&#xff0c;增强学校、企业与学生之间的沟通与协作。&#xff1a; 一、系统背景与意义 随着教育体系的不断完善和就业市场的日益竞争…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

Matlab实现任意伪彩色图像可视化显示

Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中&#xff0c;如何展示好看的实验结果图像非常重要&#xff01;&#xff01;&#xff01; 1、灰度原始图像 灰度图像每个像素点只有一个数值&#xff0c;代表该点的​​亮度&#xff08;或…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...