ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ESP-IDF 인터럽트 (vscode)
    소프트웨어 2023. 3. 18. 14:50

    #esp32 윈도우 vscode 환경
    #선행(필수) ESP-IDF 윈도우 개발환경 세팅(VSCODE)
    #선행(필수)  ESP-IDF 외부 폴더에서 예제 파일 실행(VSCODE)

    #선행(필수) ESP-IDF GPIO 인풋, 아웃풋(VSCODE)


    1) 인터럽트 (Interrupt)

    최우선으로 처리 해야 할 기능 구현.

    인터럽트 신호가 들어오면 하던 일 제쳐 두고 인터럽트 함수 먼저 처리.

    A -> B -> A -> B -> A 중간에 멈춤 -> 인터럽트 함수 -> A이어서 처리

     

     

    2) 인터럽트 신호

    - Rising edge : 버튼을 누른 순간 발생

    - Falling edge : 버튼에서손을 뗄 때 발생

    - Change : Falling, Rising 둘 다 감지 (버튼 눌렀다 떼면 신호 두 번 감지)

    - Low : Low voltage 감지

    - High : High voltage 감지

    *스위치 PULL DOWN 상태일 때 설명

    *버튼 입력 인터럽트시 Rising edge 또는 Falling edge 가 적합

     

     

    #include <stdio.h>
    #include "freertos/FreeRTOS.h"
    #include "freertos/task.h"
    #include "freertos/queue.h"
    #include "driver/gpio.h"
    
    #define INPUT_SWITCH 19
    
    QueueHandle_t gpio_evt_queue = NULL;
    
    //아래, interrupt 발생시 진입 함수. 인터럽트 목적에 맞게 코드(Delay, 함수) 최소화
    static void IRAM_ATTR gpio_isr_handler(void *args)
    {
        int pinNumber = (int)args;
        xQueueSendFromISR(gpio_evt_queue, &pinNumber, NULL);
    }
    
    
    void gpio_task(void *params)
    {
        int gpio_pin, count = 0;
        while (true)
        {
            if (xQueueReceive(gpio_evt_queue, &gpio_pin, portMAX_DELAY))  // gpio_evt_queue 큐에 값이 있으면 if문 진입, 없으면 block
            {
                printf("GPIO %d was pressed %d times. The state is %d\n", gpio_pin, count++, gpio_get_level(INPUT_SWITCH));
            }
        }
    }
    
    void app_main()
    {
        gpio_set_direction(INPUT_SWITCH, GPIO_MODE_INPUT);
        gpio_pulldown_en(INPUT_SWITCH);  // 소프트웨어 풀다운 Enable
        gpio_pullup_dis(INPUT_SWITCH);   // 소프트웨어 풀업 Disable
        gpio_set_intr_type(INPUT_SWITCH, GPIO_INTR_POSEDGE);
    
        gpio_evt_queue = xQueueCreate(10, sizeof(int));
        xTaskCreate(gpio_task, "gpio_task", 2048, NULL, 1, NULL);
    
        gpio_install_isr_service(0);
        gpio_isr_handler_add(INPUT_SWITCH, gpio_isr_handler, (void *)INPUT_SWITCH);
    }

     

     

    3) 부록 : 우선순위(선행학습 : FreeRTOS)

    위 그림의,

    - 우선순위가 낮은 A가 Running 중에 B가 Ready에 들어오면

    - A는 Blocked 되고 B가 선점하여 실행 됩니다.

    - B와 C의 관계도 동일 합니다.

     

    ESP-IDF의 FreeRTOS에서 Task는 우선 순위 0~24(25단계)를 갖습니다.

    인터럽트는 우선순위가 가장 높은 24 보다도 더 높은 우선순위로 선점해서 Running 됩니다.

    인터럽트가 실행 되는 동안 모든 Task들은 Blocked 상태이기 때문에

    인터럽트 함수는 최대한 빨리 끝이 나야 합니다.

    그러기 위해서 인터럽트 함수는 간결해야 하고 delay를 사용하면 안 됩니다.

    복잡한 코드와 delay는 아래 방법으로 인터럽트 외부에서 처리 되어야 합니다.

    - Queue (포스트 예정)

    - Semaphore (포스트 예정)

     

    인터럽트가 여러개 있다면, 먼저 실행된 인터럽트가 우선순위를 갖습니다.

    또는, 인터럽트에도 우선순위를 줄 수 있습니다.

    가장 낮은 우선 순위의 인터럽트도 일반 Task의 가장 높은 우선 순위보다 높습니다.

     

     

     

     

    *공부하는 입장에서 정리중인 자료들 입니다.


    ESP-IDF 윈도우 개발환경 세팅 (VSCODE)
    ESP-IDF 외부 폴더에서 예제 파일 실행 (VSCODE)
    ESP-IDF GPIO 인풋, 아웃풋 (VSCODE)
    ESP-IDF 인터럽트 (VSCODE)

    ESP-IDF 디바운싱 (esp32, vscode)
    ESP-IDF .c .h 참조 cMakeLists (vscode)

    ESP-IDF components 참조 cMakeLists (vscode)
    ESP-IDF LCD 출력(vscode)
    ESP-IDF 메모리 - Flash (vscode)
    ESP-IDF 메모리 - SRAM (vscode)
    ESP-IDF FreeRTOS - buffer (vscode)

    ESP-IDF 쿨링팬 FG센서, PWM제어(vscode)

     

     

    <포스트 예정>

    *ESP-IDF 메모리 - ROM
    *LCD - 메뉴 만들고 버튼으로 메뉴 이동(터미널로 작업)
    *LCD - 2차원 배열로 메뉴 진입, 뒤로가기(터미널로 작업)
    *LCD - 메뉴 만든 것 LCD 출력
    *LCD - 메뉴 UI 제작.  연두색 블럭은 메인 메뉴 회색 블럭은 서브 메뉴
            (1.팬  1-1.ON  1-2.OFF  1-3.BACK   2.LED  2-1.밝기 약  2-2.밝기 중  2-3.밝기 강   2-4.BACK   3.빛 밝기 출력 lux(+PPFD 변환)
    *Easy EDA툴 활용하여 커스텀 ESP32 보드 제작
    *LCD - LCD , 팬 , 펌프 ,  ESP32 연결 가능한 PCB 제작 주문.
    *LCD - 간이 스마트팜 제작
    *ESP32 JTAG 디버그
    *FreeRTOS
    *FreeRTOS - QUEUE
    *FreeRTOS - timer
    *FreeRTOS - Semaphore , mutex
    *FreeRTOS - event group , notification
    *FreeRTOS - buffer
    *ESP-IDF I2C SPI UART
    *ESP-IDF wifi
    *ESP-IDF MQTT
    *ESP-IDF Server (XAMPP 로컬 서버 연결)

    *DIY 컨테이너 / 유리온실 스마트팜 제작

     

     
     
     
     
     
     
Designed by PixelSpace