이 블로그는 임베디드 컴퓨터를 이용한 장치(시스템) 개발과 원격제어에 필요한 지식을 공유 하기 위한 블로그 입니다.
실제 개발과 프로그램 예를 위하여 Microchip 사의 ATmega128를 사용한 보드와 Arduino Mega 보드(ATmega2560), Raspberry Pi Pico, Raspberry Pi, WiFi 모듈을 사용 합니다.

gpio-interrupt-pico-c

Pico GPIO control - C/C++ SDK
Raspberry Pi Pico GPIO Port와 Interrupt - C/C++ SDK


  • Raspberry Pi Pico GPIO Port
    • 일반적인 GPIO Port의 이해에 도움이 되는 참고자료: "ATmega128 I/O Port"

    • RP2040 GPIO Port
      • Pi Pico GPIO Port의 논리적 구조(Logical structure)

      • Raspberry Pi Pico는 RP2040 마이크로 컨트롤러에서 사용할 수 있는 User bank(GPIO0 to GPIO29)의 핀 가운데 Raspberry Pi Pico 보드 핀에 연결된 26개(GP0 - GP22 까지와 GP26, GP27, GP28번)의 핀을 사용할 수 있다. GP23, GP24, GP25, GP29 핀은 Pi Pico 보드의 핀에 연결되지 않았기 때문에 사용할 수 없다.
      • GP22를 제외한 다른 GPIO 핀은 프로그램 설정으로 미리 설정된 다른 목적(PIO, SPI, UART, I2C, ADC, PWM, GPCLK)으로 사용할 수 있다. 그러나 동시에 다른 기능으로 설정할 수는 없다.
      • GPIO 핀의 외부 Interrupt 기능을 설정할 수 있다.
      • 각 GPIO의 CTRL 레지스터에 있는 FUNCSEL 필드에 기능(Function) 코드를 Writing 하면 해당 기능(Function)이 설정된다.
      • 참고자료: "RP2040 Datasheet"의 "2.19.2. Function Select"를 참고 바람.

      • 각 GPIO는 한 번에 하나의 기능을 선택할 수 있다. 각 주변 장치 입력(예: UART0 RX)은 한 번에 하나의 GPIO만 선택해야 한다.
    • GPIO Pads
    • Pad는 칩의 내부 로직과 외부 회로 사이의 전기적 인터페이스(electrical interface)이다.

      GPIO의 IO pad(1개) Diagram

      • 각 GPIO는 "Pad"를 통해 칩 외부에 연결된다.
      • Pad는 신호의 전압 레벨을 변환하고 더 높은 전류를 지원하며 정전기 방전(ESD) 이벤트에 대한 보호 기능을 제공한다.
      • Pad의 전기적 기능은 외부 회로의 요구 사항을 충족하도록 조정할 수 있다.
        • 출력 구동 전류의 강도를(2mA, 4mA, 8mA 또는 12mA) 설정할 수 있다.
        • 출력 슬루율(slew rate)을 느리게 또는 빠르게 설정할 수 있다.
        • 입력 히스테리시스(Schmitt trigger mode드) 기능 활성화가 가능하다.
        • 풀업 또는 풀다운(Pull-up or Pull-down)을 활성화하여 출력 드라이버가 활성화되지 않은 경우 출력 신호 레벨을 설정할 수 있다.
        • Pad가 사용되지 않거나 연결되지 않았거나 아날로그 신호에 연결된 경우 전류 소비를 줄이기 위해 입력 버퍼를 비 활성화할 수 있다.

    • GPIO Interrupts
      • 각 GPIO 핀은 아래와 같이 4종류의 외부 Interrupt를 생성할 수 있다.
        • Level high(Logical 1)
        • Level Low(Logical 0)
        • Positive edge( Transition from active low to active high)
        • Negative edge( Transition from active high to active low)
      • 레벨 인터럽트(Level interrupts)는 래치되지 않는다. 만약 핀이 Logical 1 이고 Level high 인터럽트가 활성화된 경우 핀이 Logical 0로 변경되는 순간 비활성화된다.
      • 에지 인터럽트(Edge interrupts)는 자동으로 INTR 레지스터(Rg)에 저장된다. INTR 레지스터에 저장된 Edge interrupts 상태는 해당 Interrupt 가 실행되거나 INTR 레지스터에 Writing operation을 실행하면 Cleare 된다.
      • 세 가지 인터럽트 대상(proc 0, proc 1,dormant_wake)에 각각 enable, status, force 레지스터가 있다. proc 0의 경우 Enable Rg(PROC0_INTE0), Status Rg(PROC0_INTS0), Force Rg(PROC0_INTF0) 가 있다.
      • 휴면 깨우기(Dormant wake)는 ROSC 또는 XOSC를 휴면 모드에서 깨우는 데 사용된다.

    • GPIO에 사용하는 레지스터(Registers)
    • GPIO에 사용하는 Rg는 기술적인 내용을 포함하고 종류가 많기 때문에 각 Rg에 대한 설명은 생략한다. 그러나 GPIO에 사용하는 Rg 이름과 상수는 프로그램 과정에서 필요하기 때문에 참고자료를 첨부한다.

      참고자료: "RP2040 Datasheet"의 "2.19.6. List of Registers"를 참고 바람.

        일반적인 이용자는 아래 레지스터(Registers) 요약 설명은 생략하여도 된다.

      • GPIO에 사용하는 레지스터(Registers) 요약
        • User Bank IO Rg: User Bank IO Rg는 기본 주소 0x40014000(SDK에서 IO_BANK0_BASE로 정의됨)에서 시작한다.

        • IO_BANK0: GPIOi_STATUS
        • GPIO0_STATUS - GPIO29_STATUS를 저장하는 Rg(위에서 i는 0 . . . 29)

        • IO_BANK0: GPIOi_CTRL

          GPIO0_CTRL - GPIO29_CTRL를 저장하는 Rg(위에서 i는 0 . . . 29). GPIO의 기능 선택(Function select)과 재정의(Overrides)에 사용한다.

        • IO_BANK0: INTRi

          GPIO0_LEVEL_LOW, GPIO0_LEVEL_HIGH, GPIO0_EDGE_LOW, GPIO0_EDGE_HIGH - - - GPIO29_EDGE_HIGH

          GPIO0 - GPIO29의 Raw Interrupts 상태(위에서 i는 0, 1, 2, 3)를 저장한다. 각 GPIO의 상태를 4Bits(1 Word(32 bits)에 8개 GPIO의 Raw Interrupts를 저장하기 때문에 30개의 GPIO를 위하여 4 Word 가 필요)를 사용하여 저장한다.

        • IO_BANK0: PROC0_INTEi
        • GPIO0_LEVEL_LOW, GPIO0_LEVEL_HIGH, GPIO0_EDGE_LOW, GPIO0_EDGE_HIGH - - - GPIO7_EDGE_HIGH

          PROC0의 Interrupt Enable(위에서 i는 0, 1, 2, 3)를 설정한다. 각 GPIO에 4종류(4Bits 사용)의 Interrupt를 설정할 수 있다. 1 Word(32 bits)에 8개 Interrupt(30개의 GPIO를 위하여 4 Word 가 필요)를 설정한다.

        • IO_BANK0: PROC0_INTFi
        • GPIO0_LEVEL_LOW, GPIO0_LEVEL_HIGH, GPIO0_EDGE_LOW, GPIO0_EDGE_HIGH - - - GPIO7_EDGE_HIGH

          PROC0의 Interrupt Force(위에서 i는 0, 1, 2, 3)를 설정한다. 각 GPIO에 4종류(4Bits 사용)의 Interrupt Force를 설정할 수 있다. 1 Word(32 bits)에 8개 Interrupt Force를 설정한다.

        • IO_BANK0: PROC0_INTSi
        • GPIO0_LEVEL_LOW, GPIO0_LEVEL_HIGH, GPIO0_EDGE_LOW, GPIO0_EDGE_HIGH - - - GPIO7_EDGE_HIGH

          Masking 및 forcing 실행 후 PROC0의 Interrupt status(위에서 i는 0, 1, 2, 3). 각 GPIO의 상태는 4종류(4Bits 사용) 중 한 상태일 수 있다.

        • IO_BANK0: PROC1_INTEi
        • GPIO0_LEVEL_LOW, GPIO0_LEVEL_HIGH, GPIO0_EDGE_LOW, GPIO0_EDGE_HIGH - - - GPIO7_EDGE_HIGH

          PROC1의 Interrupt Enable(위에서 i는 0, 1, 2, 3)를 설정한다. 각 GPIO에 4종류(4Bits 사용)의 Interrupt를 설정할 수 있다. 1 Word(32 bits)에 8개 Interrupt(30개의 GPIO를 위하여 4 Word 가 필요)를 설정한다.

        • IO_BANK0: PROC1_INTFi
        • GPIO0_LEVEL_LOW, GPIO0_LEVEL_HIGH, GPIO0_EDGE_LOW, GPIO0_EDGE_HIGH - - - GPIO7_EDGE_HIGH

          PROC1의 Interrupt Force(위에서 i는 0, 1, 2, 3)를 설정한다. 각 GPIO에 4종류(4Bits 사용)의 Interrupt Force를 설정할 수 있다. 1 Word(32 bits)에 8개 Interrupt Force를 설정한다.

        • IO_BANK0: PROC1_INTSi
        • GPIO0_LEVEL_LOW, GPIO0_LEVEL_HIGH, GPIO0_EDGE_LOW, GPIO0_EDGE_HIGH - - - GPIO7_EDGE_HIGH

          Masking 및 forcing 실행 후 PROC1의 Interrupt status(위에서 i는 0, 1, 2, 3). 각 GPIO의 상태는 4종류(4Bits 사용) 중 한 상태일 수 있다.

        • DORMANT_WAKE_INTEi
        • GPIO0_LEVEL_LOW, GPIO0_LEVEL_HIGH, GPIO0_EDGE_LOW, GPIO0_EDGE_HIGH - - - GPIO7_EDGE_HIGH

          Dormant_wake의 Interrupt Enable(위에서 i는 0, 1, 2, 3)를 설정한다. 각 GPIO에 4종류(4Bits 사용)의 Interrupt를 설정할 수 있다. 1 Word(32 bits)에 8개 Interrupt(30개의 GPIO를 위하여 4 Word 가 필요)를 설정한다.

        • DORMANT_WAKE_INTFi
        • GPIO0_LEVEL_LOW, GPIO0_LEVEL_HIGH, GPIO0_EDGE_LOW, GPIO0_EDGE_HIGH - - - GPIO7_EDGE_HIGH

          Dormant_wake의 Interrupt Force(위에서 i는 0, 1, 2, 3)를 설정한다. 각 GPIO에 4종류(4Bits 사용)의 Interrupt Force를 설정할 수 있다. 1 Word(32 bits)에 8개 Interrupt Force를 설정한다.

        • DORMANT_WAKE_INTSi
        • GPIO0_LEVEL_LOW, GPIO0_LEVEL_HIGH, GPIO0_EDGE_LOW, GPIO0_EDGE_HIGH - - - GPIO7_EDGE_HIGH

          Masking 및 forcing 실행 후 Dormant_wake의 Interrupt status(위에서 i는 0, 1, 2, 3). 각 GPIO의 상태는 4종류(4Bits 사용) 중 한 상태일 수 있다.


  • 자주 사용하는 GPIO 관련 함수 - C/C++ SDK
    • Raspberry Pi Pico C/C++ SDK
      • Raspberry Pi Pico SDK(Software Development Kit)는 RP2040 기반 장치를 위한 C, C++ 또는 Arm 어셈블리 언어로 프로그램을 작성하는 데 필요한 헤더, 라이브러리 및 빌드 시스템을 제공하여 개발자가 용이하게 프로그램을 개발할 수 있도록 지원한다.

      • SDK는 임베디드 C 또는 C++ 개발자에게 친숙한 API와 프로그래밍 환경(Hardware에 대한 이해가 적은 경우에도 효율적인 프로그래밍이 가능하도록함)을 제공하도록 설계되었다.
      • 한 번에 하나의 프로그램이 기존의 main() Method로 장치에서 실행된다.
      • 표준 C/C++ 라이브러리는 DMA, IRQ, 다양한 기능을 갖는 주변 장치 와 PIO(Programmable IO)를 포함한 RP2040의 하드웨어에 액세스하기 위한 API와 함께 지원된다.
      • 참고자료: Raspberry Pi Pico C/C++ SDK

    • GPIO의 기능을 설정하는 함수
      • 이곳에서는 자주 사용하는 GPIO의 기능을 설정하는 함수에 대하여만 설명한다.

        참고자료: Raspberry Pi Pico C/C++ SDK자료 "4.1.10. hardware_gpio"에 GPIO의 기능을 설정하는 함수에 대한 전체 설명이 있다.

      • gpio_init: GPIO 초기화(I/O 활성화 및 func를 GPIO_FUNC_SIO(Single-cycle IO block)로 설정)하고, Output enable과 value을 Clear(즉, 입력으로 설정) 한다.
        • 기본형: void gpio_init (uint gpio)
        • 매개 변수
          • gpio: GPIO number
      • gpio_init_mask: gpio_mask에 Set된 GPIO를 모두 초기화(init)한다.
        • 기본형: void gpio_init_mask (uint gpio_mask)
        • 매개 변수
          • gpio_mask: 초기화(init)할 GPIO를 지정하는 mask.
      • gpio_pull_down: 지정된 GPIO를 Pull down으로 설정한다.
        • 기본형: static void gpio_pull_down (uint gpio)
        • 매개 변수
          • gpio: GPIO number
      • gpio_pull_up: 지정된 GPIO를 Pull up으로 설정한다.
        • 기본형: static void gpio_pull_up (uint gpio)
        • 매개 변수
          • gpio: GPIO number
      • gpio_disable_pulls: 해당하는 GPIO의 Pull 기능을 Disable 한다.
        • 기본형: static void gpio_disable_pulls (uint gpio)
        • 매개 변수
          • gpio: GPIO number
      • gpio_set_dir: 지정된 GPIO의 Direction을 설정한다.
        • 기본형: static void gpio_set_dir (uint gpio, bool out)
        • 매개 변수
          • gpio: GPIO number
          • out: True 인 경우 Out port로 설정되고, False 인 경우 Input port로 설정된다.
      • gpio_set_dir_all_bits: 모든 GPIO Pin의 방향을 설정 값으로 동시에 설정한다.
        • 기본형: static void gpio_set_dir_all_bits (uint32_t values)
        • 매개 변수
          • values: 모든 GPIO Pin의 방향을 설정하는 값. 대응하는 Bit 가 1인 경우 Output Port로 설정되고, 0인 경우 Input Port로 설정된다.
    • GPIO의 값을 설정(or 변경)하는 함수
      • gpio_put: 지정된 GPIO를 Set or Clear 한다.
        • 기본형: static void gpio_put (uint gpio, bool value)
        • 매개 변수
          • gpio: GPIO number
          • value: False(0) 인 경우 Clear, True(1) 인 경우 Set 한다.
      • gpio_clr_mask: mask에 설정된 Bit에 대응하는(Bit위치 번호에 대응하는) GPIO 값을 Clear(Low) 한다.
        • 기본형: static void gpio_clr_mask (uint32_t mask)
        • 매개 변수
          • mask: Bitmask of GPIO values to clear, as bits 0-29
      • gpio_put_all: 전체 GPIO의 값을 value로 설정한다.
        • 기본형: static void gpio_put_all (uint32_t value)
        • 매개 변수
          • value: GPIO에 설정하고자 하는 Bitmask(values), 0-29 Bits 가 동시에 Bitmask 값으로 설정된다.
      • gpio_put_masked: mask에 Set된 GPIO의 값을 value 값으로 설정한다.
        • 기본형: static void gpio_put_masked (uint32_t mask, uint32_t value)
        • 매개 변수
          • mask: 값을 변경하고자 하는 GOIP의 Bitmask(0-29 bits)
          • value: Bitmask의 1 위치에 설정하고자 하는 값(Value).
      • gpio_xor_mask: mask에 Set된 Bit의 GPIO 값을 Toggle 한다.
        • 기본형: static void gpio_xor_mask (uint32_t mask)
        • 매개 변수
          • mask: 값을 Toggle 하고자 하는 GOIP의 Bitmask(0-29 bits)
    • GPIO의 상태(값)을 확인하는 함수
      • gpio_get: 해당 GPIO의 상태을 갖어온다.
        • 기본형: static bool gpio_get (uint gpio)
        • 매개 변수
          • gpio: GPIO number
        • Returns: 현재 GPIO 상태. Low인 경우 0, High인 경우 Non-zero 가 Return 된다.
      • gpio_get_all: 모든 GPIO의 상태를 갖어온다.
        • 기본형: static uint32_t gpio_get_all (void)
        • 매개 변수: 없음
        • Returns: 모든 GPIO(Bits 0-29)의 상태가 32Bits 정수에 저장된다.
      • gpio_get_dir: 지정된 GPIO의 Direction을 가져온다.
        • 기본형: static uint gpio_get_dir (uint gpio)
        • 매개 변수
          • gpio: GPIO numberg: GPIO
        • Returns: Output port인 경우 1, Input port인 경우 0
    • Switch(Push button)와 LED를 사용하는 프로그램 예
      • 이 프로그램은 Switch(Input port)와 LED(Output port)의 설정과 제어를 이해하기 위한 예 이다.

        참고자료: 일반적인 I/O port programming에 대한 예는 "ATmega128 I/O Port"를 참고하기 바람.

        실험을 위한 회로 구성 예

        주: Raspberry Pi Pico는 GPIO25를 On-board LED 제어에 사용하고, Raspberry Pi Pico W는 WL_GPIO0(Infineon CYW43439의 GPIO0)를 On-board LED 제어에 사용한다.

        주: 위 회로에서 LED 회로(보드에 점선으로 연결)는 개발보드에 내장된 LED를 사용하기 때문에 실제 회로 구성은 하지 않아도 된다.

      • Switch(Push button)의 상태를 LED에 출력하는 프로그램 예
      • 실험을 위한 준비
        • Button switch: 위 그림과 같이 Button switch를 GPIO22에 연결한다.
        • 주: Pull up 저항은 RP2040 Microcontroller에 내장되어 있기 때문에 별도로 추가하지 않는다.

          참고자료: Pull up 저항의 이해를 위한 예는 "ATmega128 I/O Port - Switch Interfacing"를 참고하기 바람.

        • LED: 개발보드에 내장되어 있기 때문에 별도의 회로를 필요로 하지 않는다.
      • 실험 방법
        • "새 Project를 생성하고 Build 하기"를 참고하여 sw_status_led Project를 생성한다.
        • 위 프로그램을 복사하여 Project 내의 "sw_status_led.c"에 저장 한다.
        • "새 Project를 생성하고 Build 하기"를 참고하여 Project를 Build 한다.
        • 주: 처음 Project를 생성한 다음 nmake를 실행하면 AhnLab V3 바이러스 프로그램이 설치된 경우 malware/Win.Generic.C4992917 바이러스가 발견되었다는 메세지가 출력되고 Fatal error 가 발생하여 컴파일이 중단된다. 그러나 Error 메세지를 무시하고 한번더 nmake를 실행하면 컴파일이 잘 진행된다.

          주: AhnLab V3 바이러스 프로그램의 Home -> 보안 상태 설정에서 PC 실시간 검사를 Off 상태로 하면 이 문제가 발생하지 않음.

        • "Build 한 프로그램을 Pi Pico 보드에 Load(Flashing) 하고 실행하기"를 참고하여 sw-status-led.uf2를 Pi Pico 보드에 Upload 하여 실행한다.
        • 실험
          • GPIO22에 연결된 외부 Switch를 Push 하거나 Release 하며 LED(GPIO25)의 상태를 관찰 한다.
          • 버튼(GPIO22 Pin)을 누르면 LED가 Off 되고 누르지 않으면 On 상태가 된다.

  • 외부 인터럽트(External interrupt)
    • External interrupt 개요
      • External interrupt 은
        • External interrupt는 주변장치의 서비스 요청에 맞추어(동기 하여) 서비스를 실행 한다.
        • 외부 장치의 요구에 의해서 Interrupt가 발생하면 현재 실행 중인 프로그램을 잠시 멈추고, Interrupt에 의하여 요구된 작업을 먼저 수행한 후에 다시 원래의 프로그램으로 복귀하여 실행 한다.
        • Embedded System의 Program은 대부분 Interrupt Drive 방식으로 작성 한다.
        • 참고자료: External interrupt 이해를 위한 예는 " ATMega128 External Interrupt"를 참고하기 바람.

      • External Interrupt에 사용하는 GPIO Pins
        • Pico의 GPIO Pin은 모두 외부 신호를 받아 이 신호에 대응하는 인터럽트(External interrupt)를 발생 시키는 목적으로 사용 할 수 있다.
      • External Interrupt Trigger Events
        • 각 외부 인터럽트 핀에 대해 인터럽트를 트리거하는 5가지 다른 이벤트(응용 프로그램에 따라 선택)가 있다.

        • RISING : Rising Edge에서 Interrupt이 Trigger 된다.
        • FALLING : FALLING Edge에서 Interrupt이 Trigger 된다.
        • HIGH : HIGH 상태에서 Interrupt이 Trigger 된다.
        • LOW : LOW 상태에서 Interrupt이 Trigger 된다.
        • CHANGE : Pin의 상태가 변하면(HIGH -> LOW or LOW -> HIGH) Interrupt이 Trigger 된다.
        • 펄스 신호의 4가지 상태 예: 4가지 상태에 CHANGE를 포함하면 5가지 상태가 된다.

    • External Interrupt 관련 함수
      • gpio_set_irq_enabled: 지정된 GPIO에 대해 Interrupt를 사용하거나 사용하지 않도록 설정한다.
        • 기본형: void gpio_set_irq_enabled (uint gpio, uint32_t events, bool enabled)
        • 매개 변수
          • gpio: GPIO number
          • events: Interrupt를 발생 시키는 Event 신호의 Type
          • 0x1: Low level, 0x2: High level, 0x4: Falling edge, 0x8: Rising edge

          • enabled: Enable or disable flag
          • true: Interrupt enabled, false: Interrupt disabled

      • gpio_acknowledge_irq: GPIO 인터럽트 Acknowledge Flag를 Clear 한다.
        • 기본형: void gpio_acknowledge_irq (uint gpio, uint32_t events)
        • 매개 변수
          • gpio: GPIO number
          • events: Clear할 Events의 Bitmask.
      • gpio_set_irq_enabled_with_callback: 지정된 GPIO의 Interrupts를 Enable 한다.
        • 기본형: void gpio_set_irq_enabled_with_callback (uint gpio, uint32_t events, bool enabled, gpio_irq_callback_t callback)
        • 매개 변수
          • gpio: GPIO number
          • events: Interrupt events의 Type .
          • 0x1: Low level, 0x2: High level, 0x4: Edge low, 0x8: Edge high

          • enabled: Enable or disable flag
          • true: Interrupt enabled, false: Interrupt disabled

          • callback: GPIO irq 발생시 호출되는 사용자 함수. 하나의 Processor에 하나의 callback 함수만 설정할 수 있다. 여러개의 GPIO에서 발생하는 Interrupt를 처리하여야 하는 경우에는 callback 함수에 전달되는 인수(uint gpio, uint32_t events)를 이용하여 각 GPIO에서 발생하는 Interrupt를 구분하여 처리하여야 한다.
          • GPIO callback 함수 예


    • 프로그램 예: External Interrupt(SW)를 이용한 LED 제어
      • Switch를 누르면 LED의 상태가 Toggle(현재 상태가 On 이면 Off 상태로, Off 상태인 경우는 On 상태로 됨)되는 프로그램 예
      • 실험을 위한 준비
        • Button switch: 위 그림과 같이 Button switch를 GPIO22에 연결한다.
        • LED: 개발보드에 내장되어 있기 때문에 별도의 회로를 필요로 하지 않는다.
      • 실험 방법
        • "새 Project를 생성하고 Build 하기"를 참고하여 switch-toggle-led-interrupt Project를 생성한다.
        • 위 프로그램을 복사하여 Project 내의 "switch-toggle-led-interrupt.c"에 저장 한다.
        • "새 Project를 생성하고 Build 하기"를 참고하여 Project를 Build 한다.
        • "Build 한 프로그램을 Pi Pico 보드에 Load(Flashing) 하고 실행하기"를 참고하여 switch-toggle-led-interrupt.uf2를 Pi Pico 보드에 Upload 하여 실행한다.
        • 실험
          • GPIO22에 연결된 외부 Switch를 Push 하면 LED의 상태가 Toggle(현재 On 상태이면 Off되고, Off 상태이면 On 상태로 변환) 되어야 한다.
          • 주: Switch의 상태가 이상적이지 않기 때문에 Switch를 누르면 Switch bouncing 현상에 의하여 가끔 오동작이 발생한다.

      • Switch를 누르면 LED의 상태가 Toggle(현재 상태가 On 이면 Off 상태로, Off 상태인 경우는 On 상태로 됨)되는 프로그램(Debouncing 기능을 포함) 예
      • 실험을 위한 준비
        • Button switch: 위 그림과 같이 Button switch를 GPIO22에 연결한다.
        • LED: 개발보드에 내장되어 있기 때문에 별도의 회로를 필요로 하지 않는다.
      • 실험 방법
        • "새 Project를 생성하고 Build 하기"를 참고하여 switch-toggle-led-int-timer Project를 생성한다.
        • 위 프로그램을 복사하여 Project 내의 "switch-toggle-led-int-timer.c"에 저장 한다.
        • "새 Project를 생성하고 Build 하기"를 참고하여 Project를 Build 한다.
        • "Build 한 프로그램을 Pi Pico 보드에 Load(Flashing) 하고 실행하기"를 참고하여 switch-toggle-led-int-timer.uf2를 Pi Pico 보드에 Upload 하여 실행한다.
        • 실험
          • GPIO22에 연결된 외부 Switch를 Push 하면 LED의 상태가 Toggle(현재 On 상태이면 Off되고, Off 상태이면 On 상태로 변환) 된다.
          • 주: Debouncing 기능이 포함되어 Switch를 누르면 LED의 상태가 바르게 Toggle 된다.

            주: 이 프로그램은 Interrupt 루틴 내에 Time delay Code를 포함하고 있다. 일반적으로 Interrupt 루틴 내에 Time delay 또는 실행 시간이 많이 걸리는 함수 등을 사용하면 않된다. 그러나 아직 다른 Debouncing 기술을 소개하지 않은 상태 이기 때문에 쉬은 이해를 위하여 이 프로그램에서는 Interrupt 루틴 내에 Time delay Code를 사용하였다.


  • Pico GPIO Port와 Interrupt 관련 페이지 보기