mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-11-04 06:11:06 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			65 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			65 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");
 | 
						|
 | 
						|
    gpio_reset_pin(EXAMPLE_GPIO_IN);
 | 
						|
    /* 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");
 | 
						|
}
 |