首页 > 其他分享 >ESP-IDF 学习 2 IO & interrupt 的使用

ESP-IDF 学习 2 IO & interrupt 的使用

时间:2024-10-11 10:35:05浏览次数:6  
标签:level 中断 isr ESP handler IO interrupt gpio

API of IO

使用 ESP-IDF 的时候,不似STC单片机那样,它帮助我们集成了 FreeRTOS,很少会直接访问寄存器,访问 IO 亦如此,所以我们调用它提供给我们的 API 就可以访问 IO 当前的 level
相应的,我们对 IO 初始化的时候也不是访问 IO 配置寄存器 来初始化 IO 的模式,是通过配置结构体对象,传递给 API 来进行初始化。

IO 初始化如下:

// GPIO结构体
    gpio_config_t My_GPIO_structture = {
        .pin_bit_mask = (1ULL << 32),     // GPIO32, 1左移32bit
        .mode = GPIO_MODE_OUTPUT,         // 输出模式
        .pull_up_en = GPIO_PULLUP_ENABLE, // 上拉电阻, pull up; 下拉电阻, pull down
        .pull_down_en = GPIO_PULLDOWN_DISABLE,
        .intr_type = GPIO_INTR_DISABLE,
    };
    ESP_ERROR_CHECK(gpio_config(&My_GPIO_structture)); // 配置 GPIO32且使用ESP_ERROR检查

    My_GPIO_structture.pin_bit_mask = (1ULL << 17);
    ESP_ERROR_CHECK(gpio_config(&My_GPIO_structture)); // 数码管(A段)

    My_GPIO_structture.pin_bit_mask = (1ULL << 15);
    ESP_ERROR_CHECK(gpio_config(&My_GPIO_structture)); // 数码管(B段)

设置 IO_level 或读取 IO_level 如下:

err = gpio_set_level(GPIO_NUM_17, level); // A段

// If the pad is not configured for input (or input and output) the returned value is always 0.
clockbell_level = gpio_get_level(io_num);

中断初始化

同样的,对于中断的初始化也是使用官方提供的 API ,以及写中断函数的时候使用者无需标明中断等级( 因为在宏定义里写好了 ),只需把自己的中断处理函数赋给中断接口即可

如下:

// 中断队列
static QueueSetHandle_t gpioISR_evt_queue = NULL;
static uint8_t clockbell_level = false;

/// @brief GPIO中断处理
/// @note IRAM_ATTR
/// @param arg
/// @return
static void IRAM_ATTR gpio_isr_handler(void *arg)
{
    // 中断任务内部不执行打印
    handler_count++;
    uint32_t gpio_num = (uint32_t)arg;

    // 从中断任务中发送数据到任务队列, 从中断中使用比较安全
    xQueueSendFromISR(gpioISR_evt_queue, &gpio_num, NULL);
    return;
}

/// @brief GPIO中断处理接收任务
/// @param arg
static void gpio_isr_handler_receive_task(void *arg)
{
    uint32_t io_num = 0;
    while (1)
    {
        if (xQueueReceive(gpioISR_evt_queue, &io_num, portMAX_DELAY))
        {
#if ISR_DEBUG
            printf("%s GPIO[%" PRIu32 "] intr, val: %d, handler count: %d\n",
                   __func__, io_num, gpio_get_level(io_num), handler_count);
#endif// 中断里头打印会有问题, 未知原因导致复位, 故此在接收函数里打印
            clockbell_level = (uint8_t)gpio_get_level(io_num);

        }
    }
}

void isr_init(void)
{
// 创建中断接收队列, 没有创建将会导致队列断言失败restart core
    gpioISR_evt_queue = xQueueCreate(10, sizeof(uint32_t));

    // install gpio isr service, 安装gpio中断服务
    ESP_ERROR_CHECK(gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT));

    // hook isr handler for specific gpio pin, 添加gpio中断处理函数
    ESP_ERROR_CHECK(gpio_isr_handler_add(GPIO_NUM_35,
                                         gpio_isr_handler,
                                         (void *)GPIO_NUM_35));

    // start gpio_isr task, 创建gpio中断处理接收任务
    xTaskCreatePinnedToCore(gpio_isr_handler_receive_task,
                            "gpio_isr_handler_task",
                            2048,
                            NULL,
                            10,
                            NULL,
                            0);
}

从其中可见,进入中断以后迅速的发送了一个队列消息。在中断以外,创建了一个任务来接收中断任务发送的队列消息,而真正检测 IO_level 也是在接收函数里头

标签:level,中断,isr,ESP,handler,IO,interrupt,gpio
From: https://www.cnblogs.com/JPW-2024/p/18457373

相关文章

  • selenium.comon.exceptionsSessioMotcreatedException: Message: session not created
    这个错误是因为您的ChromeDriver版本不支持当前安装的Chrome浏览器版本。错误信息指出,您的ChromeDriver只支持Chrome版本127,但您当前的Chrome浏览器版本是129.0.6068.90。要解决此问题,可以尝试以下步骤:更新ChromeDriver:下载与您当前Chrome浏览器版本兼容的ChromeDriver。可以......
  • 结合HCI和空口理解BLE AUDIO CIS
    背景CIS,coordinateisochronosstream,是BLEAUDIO单播形式的数据流,在前面文章https://blog.csdn.net/Jzj1234555/article/details/142416588?spm=1001.2014.3001.5502我们了解了BLEAUDIO从连接到建立CIS的大概流程,但CIS到底是什么样的形式,如何在空中传播,里面的细节我们......
  • Result Maps collection already contains value for xxx.xxx.dao.BaseResultMap错误
    重复引入jar包问题解决方法,在pom文件中排除这个jar包原:<dependency><groupId>com.hedu</groupId><artifactId>sweet-template-webapp</artifactId><version>1.0</version></dependency>排除后:&......
  • webservice接口调用报:由于 ContractFilter 在 EndpointDispatcher 不匹配,因此 Action
    1、问题:<s:Envelopexmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><s:Fault><faultcodexmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">a:ActionNotSupported</faultcode><faul......
  • POJ1797-Heavy Transportation
    继续刷邝斌飞最短路专题垃圾POJ继续挂可用平台每次翻译都用这个,之前一段一段帖,今儿刚发现登陆可以无限制帖然后翻译......
  • ValueError: Unsupported callback API version: version 2.0 added a callback_api_v
     2024/10/1021:25:44PM-ERROR-InternalServerError:/abcTraceback(mostrecentcalllast):File"/root/abc/backend/venv/lib/python3.8/site-packages/django/core/handlers/exception.py",line47,ininnerresponse=get_response(reque......
  • AndroidSDK下载(不通过AndroidStudio)
    下载命令行工具在androiddeveloper滚动到Commandlinetoolsonly下载对应操作系统的命令行工具。笔者下载了windows版本的,其目录结构如下:└─cmdline-tools├─bin│apkanalyzer.bat│avdmanager.bat│lint.bat│profgen......
  • visual studio原生支持C++的含义
    “原生支持C++”指的是一个开发工具(如IDE、操作系统、库等)直接且全面地支持C++编程语言,无需额外的配置或外部插件。这意味着开发工具能够原生处理C++代码的编写、编译、调试、运行等工作,通常包括以下几个方面:编译器支持:工具自带或能够直接集成C++编译器(如MicrosoftVisualC+......
  • selenium:ActionChains类模拟鼠标和键盘操作(6)
    selenium包中提供了ActionChains类,主要用于鼠标和键盘的一些操作,比如鼠标移动,鼠标按键,或者是悬停和拖放等;模拟键盘按键输入,比如按住control+C键等。使用时先导入该类:fromselenium.webdriverimportActionChainsActionChains类的方法介绍 ActionChains类常用方法函......
  • Gradio 5 稳定版正式发布
    在过去的几个月里,我们一直在努力工作,今天,我们想向大家展示成果:Gradio5稳定版现已发布。有了Gradio5,开发者可以构建生产级的机器学习Web应用,这些应用不仅性能优越、可扩展、设计精美、易于访问,而且还遵循了最佳的Web安全实践。更重要的是,只需几行Python代码即可实现。......