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

news2025/1/19 11:41:10

本博文内容导读📕🎉🔥

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);                           //使用以上参数初始化GPIO
    io_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);         //延时1S
        gpio_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 = 1
  interruptsCounter = interruptsCounter+1
GPIO_INPUT.irq(trigger=Pin.IRQ_RISING, handler=callback)
while True:
    GPIO_OUTPUT.value(cnt%4)
    time.sleep(1)
    cnt=cnt+1
    if interrupt:
        #state = machine.disable_irq()  #禁用计数器
        interrupt = 0
        #machine.enable_irq(state)  #重新启动计数器
        print("Interrupt has occurred: " + str(interruptsCounter))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2278898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软路由系统iStoreOS 一键安装 docker compose

一键安装命令 大家好&#xff01;今天我来分享一个快速安装 docker-compose 的方法。以下是我常用的命令&#xff0c;当前版本是 V2.32.4。如果你需要最新版本&#xff0c;可以查看获取docker compose最新版本号 部分&#xff0c;获取最新版本号后替换命令中的版本号即可。 w…

CSRF攻击XSS攻击

概述 ​在 HTML 中&#xff0c;<a>, <form>, <img>, <script>, <iframe>, <link> 等标签以及 Ajax 都可以指向一个资源地址&#xff0c;而所谓的跨域请求就是指&#xff1a;当前发起请求的域与该请求指向的资源所在的域不一样。这里的域指…

企业分类相似度筛选实战:基于规则与向量方法的对比分析

文章目录 企业表相似类别筛选实战项目背景介绍效果展示基于规则的效果基于向量相似的效果 说明相关文章推荐 企业表相似类别筛选实战 项目背景 在当下RAG&#xff08;检索增强生成&#xff09;技术应用不断发展的背景下&#xff0c;掌握文本相似算法不仅能够助力信息检索&…

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)角点检测

角点检测&#xff08;Corner Detection&#xff09;是计算机视觉和图像处理中重要的步骤&#xff0c;主要用于提取图像中的关键特征&#xff0c;以便进行后续的任务&#xff0c;比如图像匹配、物体识别、运动跟踪等。下面介绍几种常用的角点检测方法及其应用。 1. Harris角点检…

RC2在线加密工具

RC2是由著名密码学家Ron Rivest设计的一种传统对称分组加密算法&#xff0c;它可作为DES算法的建议替代算法。RC2是一种分组加密算法&#xff0c;RC2的密钥长度可变&#xff0c;可以从8字节到128字节&#xff0c;安全性选择更加灵活。 开发调试上&#xff0c;有时候需要进行对…

玩转大语言模型——使用graphRAG+Ollama构建知识图谱

系列文章目录 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型——使用graphRAGOllama构建知识图谱 文章目录 系列文章目录前言下载和安装用下载项目的方式下载并安装用pip方式下载并安装 生成知…

【王树森搜索引擎技术】相关性01:搜索相关性的定义与分档

工业界是怎么做的&#xff1f; 制定标注规则 -> 标注数据 -> 训练模型 -> 线上推理搜索产品和搜索算法团队定义相关性标注规则 认为地将 (q,d) 相关性划分为 4个 或 5个 档位相关性文档规则非常重要&#xff01;假如日后有大幅度变动&#xff0c;需要重新标注数据&am…

学习threejs,使用FlyControls相机控制器

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.FlyControls 相机控制…

LabVIEW 程序中的 R6025 错误

R6025错误 通常是 运行时库 错误&#xff0c;特别是与 C 运行时库 相关。这种错误通常会在程序运行时出现&#xff0c;尤其是在使用 C 编译的程序或依赖 C 运行时库的程序时。 ​ 可能的原因&#xff1a; 内存访问冲突&#xff1a; R6025 错误通常是由于程序在运行时访问无效内…

第4章 Kafka核心API——Kafka客户端操作

Kafka客户端操作 一. 客户端操作1. AdminClient API 一. 客户端操作 1. AdminClient API

Tarjan算法笔记

Tarjan 内容概要 dfs 搜索树 首先&#xff0c;我们要知道&#xff0c;Tarjan 算法来源于搜索树&#xff0c;那是什么呢&#xff0c;顾名思义就是按照搜索的顺序来遍历&#xff0c;所产生的顺序构成的树。首先我们可以来举个有向图的例子&#xff1a; 所以我们可以知道 dfs 生…

socket网络通信基础

目录 一、套接字编程基本流程 二、TCP流式协议及Socket编程的recv()和send() 三、读写无阻塞-完美掌握I/O复用 select&#xff08;&#xff09;函数详解 poll&#xff08;&#xff09;函数详解 epoll () 函数详解 一、套接字编程基本流程 原文链接&#xff1a;Socket编程…

接口防篡改+防重放攻击

接口防止重放攻击&#xff1a;重放攻击是指攻击者截获了一次有效请求(如交易请求),并在之后的时间里多次发送相同的请求&#xff0c;从而达到欺骗系统的目的。为了防止重放攻击&#xff0c;通常需要在系统中引入一种机制&#xff0c;使得每个请求都有一个唯一的标识符(如时间戳…

庄小焱——2024年博文总结与展望

摘要 大家好&#xff0c;我是庄小焱。岁末回首&#xff0c;2024 年是我在个人成长、博客创作以及生活平衡方面收获颇丰的一年。这一年的经历如同璀璨星辰&#xff0c;照亮了我前行的道路&#xff0c;也为未来的发展奠定了坚实基础。 1. 个人成长与突破 在 2024 年&#xff0c…

在线base64转码工具

在线base64转码工具&#xff0c;无需登录&#xff0c;无需费用&#xff0c;用完就走。 官网地址&#xff1a; https://base64.openai2025.com 效果&#xff1a;

鸿蒙学习构建视图的基本语法(二)

一、层叠布局 // 图片 本地图片和在线图片 Image(https://developer.huawei.com/allianceCmsResource/resource/HUAWEI_Developer_VUE/images/080662.png) Entry Component//自适应伸缩 设置layoutWeight属性的子元素与兄弟元素 会按照权重进行分配主轴的空间// Position s…

OA-CNN:用于 3D 语义分割的全自适应稀疏 CNN

大家读完觉得有帮助记得及时关注和点赞&#xff01;&#xff01;&#xff01; 1介绍 2相关工作 基于点的学习。 基于 CNN 的学习。 动态卷积。 3全能自适应 3D 稀疏 CNN 3.1空间适应性感受野 赋予动机。 体素网格。 金字塔网格分区。 Adaptive 聚合器。 3.2自适应关…

利用 LNMP 实现 WordPress 站点搭建

部署MySQL数据库 在主机192.168.138.139主机部署数据库服务 包安装数据库 apt-get install mysql-server 创建wordpress数据库和用户并授权 mysql> create database wordpress;#MySQL8.0要求指定插件 mysql> create user wordpress192.168.138.% identified with mys…

Vue2.0的安装

1.首先查看是否已经安装了node.js 选择以管理员方式打开命令提示符&#xff08;权限较高&#xff09;&#xff0c;或者通过cmd的方式打开 打开后输入node -v 查看自己电脑是否安装node&#xff0c;以及版本号 node -v 如果没有的话&#xff0c;请查看Node.js的安装 2.Vue和脚…

OpenEuler学习笔记(一):常见命令

OpenEuler是一个开源操作系统&#xff0c;有许多命令可以用于系统管理、软件安装、文件操作等诸多方面。以下是一些常见的命令&#xff1a; 一、系统信息查看命令 uname 用途&#xff1a;用于打印当前系统相关信息&#xff0c;如内核名称、主机名、内核版本等。示例&#xff…