Files
esp-idf/examples/system/nmi_isr/main/nmi_isr_main.c
Omar Chebib 928859307f fix(esp_hw_support): make the NMI interrupts available for the main application
Closes https://github.com/espressif/esp-idf/issues/13629

NMI interrupt level has been freed for all the Xtensa targets, making it possible
for the main application to use it. An example has been added to show how to
proceed.
2024-08-29 13:55:47 +08:00

64 lines
1.9 KiB
C

/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
#include "freertos/FreeRTOSConfig.h"
#include "freertos/FreeRTOS.h"
#include "sdkconfig.h"
#include "driver/gpio.h"
#include "hal/gpio_ll.h"
#include "soc/interrupts.h"
#include "example_gpio.h"
extern volatile int nmi_triggered;
extern void xt_nmi(void*);
void app_main(void)
{
intr_handle_t handle;
esp_err_t err;
printf("example: Start\n");
/* Make sure we have a pull-down on the input GPIO to prevent noise (when disconnected) */
gpio_pulldown_en(EXAMPLE_GPIO_IN);
gpio_set_direction(EXAMPLE_GPIO_IN, GPIO_MODE_INPUT_OUTPUT);
/* Register the interrupt handler as an NMI. When registering high level interrupts,
* the interrupt allocator expects the handler passed as an argument to be NULL. */
err = esp_intr_alloc(ETS_GPIO_INTR_SOURCE, ESP_INTR_FLAG_IRAM | ESP_INTR_FLAG_NMI, NULL, NULL, &handle);
if (err != ESP_OK) {
printf("Failure: could not install NMI ISR, %d(0x%x)\n", err, err);
return;
}
gpio_set_intr_type(EXAMPLE_GPIO_IN, GPIO_INTR_HIGH_LEVEL);
gpio_intr_enable(EXAMPLE_GPIO_IN);
vTaskDelay(200 / portTICK_PERIOD_MS);
/* Disable interrupts on the CPU side and make sure the NMI is still triggered */
const uint32_t mask = esp_cpu_intr_get_enabled_mask();
esp_cpu_intr_disable(0xFFFFFFFF);
nmi_triggered = 0;
/* Setting EXAMPLE_GPIO_IN to 1 will trigger the NMI interrupt. */
gpio_set_level(EXAMPLE_GPIO_IN, 1);
/* Wait for the interrupt to occur */
while (nmi_triggered == 0) {
/* We cannot use vTaskDelay since the interrupts are disabled */
}
esp_cpu_intr_enable(mask);
gpio_intr_disable(EXAMPLE_GPIO_IN);
esp_intr_free(handle);
printf("example: Success\n");
}