WIZnet Developer Forum

[W7500x] InterruptIn button(PC_8)

InterruptIn button(PC_8);

으로
void call_start()
{
LED1=!LED1;
wait(1,5);
}
main()
{
button.fall(&call_start);
}

이렇게 인터럽트를 만들었는데
버튼을 한번 눌렀는데 call_start()를 실행하고
돌아와 다시 한번 더 call_start()이실행되는데 왜 그럴까요?

안녕하세요

함수가 반복적으로 실행되는 증상이 혹시 매번 그러나요?

아니면 어떨땐 한번만 실행되고 어떨때는 두번 실행되고 하나요?

예 매번 그럽니다. 그리고

아래 함수인데요

void call_start()
{
    NVIC_DisableIRQ(PORT2_IRQn);   // 인터럽트 Disable 해 놓으니 발생하지는 않네요
    NVIC_DisableIRQ(PORT0_IRQn);
    printf("call...\r\n");
    //disable_irq();
    alarm_relay=1;
    hook_relay=1;
    wait(0.5);
    hook_relay=0;
    alarm_relay=0;
    emer_light=1;
    amp_shutdown=1;

    comm_led=0;
    comm_ing=1;
    wait(0.9);

    while(end_sig==1)
    {
        comm_led=!comm_led;
        wait(0.5);
    }
    amp_shutdown=0;
    emer_light=0;
    comm_led=1;
    comm_ing=0;
    wait(1.0);
    //NVIC_EnableIRQ(PORT2_IRQn);   //이 Enable를 실행되게 하면 같은 증상이 일어나는 거 보니 interrupt 가 발생되는 거네요
    //NVIC_EnableIRQ(PORT0_IRQn);   // Port에 콘덴서도 달아보고 했는데 안 잡히네요
}

안녕하세요

다음과 같이 간단하게 테스트해봤습니다.

스위치로 GPIO Interrupt를 만들었습니다.

테스트 결과 이상없이 한번만 인터럽트가 발생하는것을 확인했습니다.

#include "mbed.h"

InterruptIn button(D8);
 
void call_start()
{
    printf("call...\r\n");
    wait(0.5);
}

main()
{
    button.fall(&call_start);
}

하드웨어적인 채터링효과로 GPIO가 흔들려서 인터럽트가 간혹 두번 발생할 수는 있으나

외부 스위치 문제이기때문에 드라이버나 보드동작과는 무관합니다.

또한 인터럽트 사용시 메뉴얼하게 Disable/ Enable 하지 않으셔도 동작합니다.

현재 무조건 두번 발생한다고 하셨는데

혹시 코드상에 두번 발생하도록 되어있는 부분이 있는지 확인 부탁드립니다.

또한

테스트는 mbed 최신 라이브러리를 사용했습니다.

현재 mbed 라이브러리 버전을 확인해주세요

감사합니다.

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.