新星杯-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);                           //使用以上参数初始化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))

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot2 + Flowable(UI)

文章目录 引言I 技术栈软件架构基于 Vue.js 和 Element UI 的后台管理系统工程结构II 依赖rest,logic,conf 的依赖工作流flowable jar包flowable-ui所需jar包III 配置jdbc 配置 nullCatalogMeansCurrent = true引言 I 技术栈 软件架构 前端基于vue 、element-ui框架分模块设…

.Net 6.0 .Net7.0 .Net8.0 .Net9.0 使用 Serilog 按日志等级写入日志及 appsetting.json 配置方式实现

前言 最近使用最新版的Serilog记录日志时&#xff0c;发现以前有些关于Serilog的Nuget弃用了&#xff0c;最关键的是有些配置写法也改变&#xff0c;于是就整理了一下最新版的Serilog配置方式(appsetting.json)的使用 说明&#xff1a;我是用的.Net6&#xff0c;最新长期支持…

sprnigboot集成Memcached

安装Memcached 下载地址 32位系统 1.2.5版本&#xff1a;http://static.jyshare.com/download/memcached-1.2.5-win32-bin.zip 32位系统 1.2.6版本&#xff1a;http://static.jyshare.com/download/memcached-1.2.6-win32-bin.zip 32位系统 1.4.4版本&#xff1a;http://stati…

【数据分析】02- A/B 测试:玩转假设检验、t 检验与卡方检验

一、背景&#xff1a;当“审判”成为科学 1.1 虚拟场景——法庭审判 想象这样一个场景&#xff1a;有一天&#xff0c;你在王国里担任“首席审判官”。你面前站着一位嫌疑人&#xff0c;有人指控他说“偷了国王珍贵的金冠”。但究竟是他干的&#xff0c;还是他是被冤枉的&…

3dmax LOGO的符号、意义和历史,渲染100邀请码1a12

Autodesk 3ds Max 是一款 3D 建模、动画和渲染软件&#xff0c;由 Autodesk, Inc. 于 1996 年开发&#xff0c;其功能是能够创建复杂的数字场景和视觉效果&#xff0c;被专业建筑师、设计师和视频游戏创作者广泛使用&#xff0c;提供了七种语言的 Windows 版本&#xff0c;没有…

线段树优化dp,abc389F - Rated Range

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 F - Rated Range 二、解题报告 1、思路分析 考虑定义 f(i, j) 为 初始分…

青少年CTF练习平台 EasyMD5解题思路

题目 EasyMD5 PHP弱类型/弱等于的判断 翻译 上传之后网页提示&#xff1a;Not a PDF! angry!!! get out from my page 修改文件后缀为pdf 再次上传&#xff0c;答案出来了 s878926199a s155964671a 成功获取flag

Amazon MSK 开启 Public 访问 SASL 配置的方法

1. 开启 MSK Public 1.1 配置 MSK 参数 进入 MSK 控制台页面&#xff0c;点击左侧菜单 Cluster configuration。选择已有配置&#xff0c;或者创建新配置。在配置中添加参数 allow.everyone.if.no.acl.foundfalse修改集群配置&#xff0c;选择到新添加的配置。 1.2 开启 Pu…

SW - 钣金零件保存成DWG时,需要将折弯线去掉

文章目录 SW - 钣金零件保存成DWG时&#xff0c;需要将折弯线去掉概述笔记备注END SW - 钣金零件保存成DWG时&#xff0c;需要将折弯线去掉 概述 如果做需要弯折的切割件&#xff0c;最好做成钣金零件。 最近做了几个小钣金(将钣金展开&#xff0c;建立新草图&#xff0c;在2…

深度学习 Pytorch 基本优化思想与最小二乘法

在正式开始进行神经网络建模之前&#xff0c;我们还需要掌握pytorch中最核心的基础数学工具——autograd(自动微分)模块。虽然对于任何一个通用的深度学习框架都会提供许多自动优化的算法和现成的loss function&#xff0c;但如果想更深入理解神经网络&#xff0c;对深度学习的…

Ceph与RAID在存储中的协同工作过程

本文将结合架构图&#xff0c;详细讲解Ceph与RAID如何在存储环境中相互配合&#xff0c;共同提供高效且可靠的存储服务。 架构概述 从上图中可以看到&#xff0c;Ceph的架构主要分为四个层次&#xff1a; 客户端和服务接口层&#xff1a;这一层包括客户端访问存储应用的接口…

PyTest自学-认识PyTest

1 PyTest自学-认识PyTest 1.1 PyTest可以用来做什么&#xff1f; PyTest是一个自动化测试框架&#xff0c;支持单元测试和功能测试&#xff0c;有丰富的插件&#xff0c;如&#xff0c;pytest-selemium, pytest-html等。 1.2 安装pytest 使用pip install -U pytest。 1.3 py…

【MathType】mathtype在word中格式问题

【MathType】mathtype在word中格式问题 1. 问题解决方法效果 2.新的问题解决方法效果 1. 问题 mathtype在word中格式显示不全 解决方法 CtrlC&#xff1a;选中全部——>段落——>设置为单倍行距 效果 已经可以全部显示出来&#xff0c;但是还有新问题&#xff01;…

当设置dialog中有el-table时,并设置el-table区域的滚动,看到el-table中多了一条横线

问题&#xff1a;当设置dialog中有el-table时&#xff0c;并设置el-table区域的滚动&#xff0c;看到el-table中多了一条横线&#xff1b; 原因&#xff1a;el-table有一个before的伪元素作为表格的下边框下&#xff0c;初始的时候已设置&#xff0c;在滚动的时候并没有重新设置…

华为AI培训-NLP实验

中文分词、命名实体识别、语义词性标注、语句逻辑推理、文本摘要、机器翻译、文本情感分析、内容创作 1 实验介绍 1.1 实验背景 中文分词、命名实体识别、语义词性标注、语句逻辑推理是自然语言处理领域中的重要任务。中文分词是将连续的汉字序列切分成有意义的词语序列…

一文大白话讲清楚webpack基本使用——4——vue-loader的配置和使用

一文大白话讲清楚webpack基本使用——4——vue-loader的配置和使用 1. 建议按文章顺序从头看是看 第一篇&#xff1a;一文大白话讲清楚啥是个webpack第二篇&#xff1a;一文大白话讲清楚webpack基本使用——1——完成webpack的初步构建第三篇一文大白话讲清楚webpack基本使用…

【从零开始入门unity游戏开发之——C#篇46】C#补充知识点——命名参数和可选参数

考虑到每个人基础可能不一样&#xff0c;且并不是所有人都有同时做2D、3D开发的需求&#xff0c;所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】&#xff1a;主要讲解C#的基础语法&#xff0c;包括变量、数据类型、运算符、…

< OS 有关 > 阿里云:轻量应用服务器 的使用 安装 Tailscale 后DNS 出错, 修复并替换 apt 数据源

VPS 配置 主机&#xff1a;vCPU x2, 512MB, 20GB位置&#xff1a;阿里云&#xff0c;日本.东京OS&#xff1a; ubuntu24.20 原因&#xff1a; 这篇是操作过程的记录文章。 2 个月前&#xff0c; 在阿里云买了台 vps 。当时本想放到韩国&#xff0c;因为它离北京近。 但最便…

第6章 ThreadGroup详细讲解(Java高并发编程详解:多线程与系统设计)

1.ThreadGroup 与 Thread 在Java程序中&#xff0c; 默认情况下&#xff0c; 新的线程都会被加入到main线程所在的group中&#xff0c; main线程的group名字同线程名。如同线程存在父子关系一样&#xff0c; Thread Group同样也存在父子关系。图6-1就很好地说明了父子thread、父…

力扣刷题—爬楼梯

文章目录 一、题目二、示例三、解析四、代码 一、题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 二、示例 输入&#xff1a; n 2输出&#xff1a; 2三、解析 用f(x)表示爬到第x级台阶的方…