CN / EN
CN / EN

提问

设计支持

您的项目私密技术问题如需获得一对一支持,请点击下方联系我们。

gpio多次触发中断不响应的问题 GR551x

150***995

2024-10-22 14:48

GR5515

SDK2.0.2

void gpio_interrupt_init(void)

{

uint16_t ret;

app_io_init_t io_init = APP_IO_DEFAULT_CONFIG;

io_init.pull = APP_IO_PULLUP;

io_init.mode = APP_IO_MODE_IT_FALLING;

io_init.mux = APP_IO_MUX;

io_init.pin = APP_GPIO_INT1_PIN;

ret = app_io_event_register_cb(APP_GPIO_INT1_TYPE, &io_init, app_io_event_handler, "INT1 pin interrupt");

io_init.pin = APP_GPIO_INT2_PIN;

ret = app_io_event_register_cb(APP_GPIO_INT2_TYPE, &io_init, app_io_event_handler, "INT2 pin interrupt");

io_init.pin = APP_GPIO_INT3_PIN;

ret = app_io_event_register_cb(APP_GPIO_INT3_TYPE, &io_init, app_io_event_handler, "INT3 pin interrupt");

io_init.pin = APP_GPIO_INT4_PIN;

ret = app_io_event_register_cb(APP_GPIO_INT4_TYPE, &io_init, app_io_event_handler, "INT4 pin interrupt");

io_init.pin = APP_GPIO_INT5_PIN;

ret = app_io_event_register_cb(APP_GPIO_INT5_TYPE, &io_init, app_io_event_handler, "INT5 pin interrupt");

io_init.pin = APP_GPIO_INT6_PIN;

ret = app_io_event_register_cb(APP_GPIO_INT6_TYPE, &io_init, app_io_event_handler, "INT6 pin interrupt");

io_init.pin = APP_GPIO_INT7_PIN;

ret = app_io_event_register_cb(APP_GPIO_INT7_TYPE, &io_init, app_io_event_handler, "INT7 pin interrupt");

io_init.pin = APP_GPIO_INT8_PIN;

ret = app_io_event_register_cb(APP_GPIO_INT8_TYPE, &io_init, app_io_event_handler, "INT8 pin interrupt");

io_init.pin = APP_GPIO_EMERGENCY_PIN;

ret = app_io_event_register_cb(APP_GPIO_EMERGENCY_TYPE, &io_init, app_io_event_handler, "EMERGENCY pin interrupt");

}


void app_io_event_handler(app_io_evt_t *p_evt)

{

BaseType_t xHigherPriorityTaskWoken = pdFALSE;

QueueIOReadPacket io_wr_packet;

app_io_pin_state_t pin_level = APP_IO_PIN_RESET;

if (p_evt->arg != NULL)

{

// printf("%s\r\n", (char *)p_evt->arg);

}


if (p_evt->pin == APP_GPIO_INT1_PIN) //int1

{

pin_level = app_io_read_pin(APP_GPIO_INT1_TYPE, APP_GPIO_INT1_PIN);

if (pin_level == APP_IO_PIN_RESET)

{

delay_ms(20);

do

{

pin_level = app_io_read_pin(APP_GPIO_INT1_TYPE, APP_GPIO_INT1_PIN);

} while(pin_level == APP_IO_PIN_SET);


io_wr_packet.daughtboard_index = 0;

}

}

if (p_evt->pin == APP_GPIO_INT2_PIN) //int2

{

pin_level = app_io_read_pin(APP_GPIO_INT2_TYPE, APP_GPIO_INT2_PIN);

if (pin_level == APP_IO_PIN_RESET)

{

delay_ms(20);

do

{

pin_level = app_io_read_pin(APP_GPIO_INT2_TYPE, APP_GPIO_INT2_PIN);

} while(pin_level == APP_IO_PIN_SET);


io_wr_packet.daughtboard_index = 1;

}

}

if (p_evt->pin == APP_GPIO_INT3_PIN) //int3

{

pin_level = app_io_read_pin(APP_GPIO_INT3_TYPE, APP_GPIO_INT3_PIN);

if (pin_level == APP_IO_PIN_RESET)

{

delay_ms(20);

do

{

pin_level = app_io_read_pin(APP_GPIO_INT3_TYPE, APP_GPIO_INT3_PIN);

} while(pin_level == APP_IO_PIN_SET);


io_wr_packet.daughtboard_index = 2;

}

}

if (p_evt->pin == APP_GPIO_INT4_PIN) //int4

{

pin_level = app_io_read_pin(APP_GPIO_INT4_TYPE, APP_GPIO_INT4_PIN);

if (pin_level == APP_IO_PIN_RESET)

{

delay_ms(20);

do

{

pin_level = app_io_read_pin(APP_GPIO_INT4_TYPE, APP_GPIO_INT4_PIN);

} while(pin_level == APP_IO_PIN_SET);


io_wr_packet.daughtboard_index = 3;

}

}

if (p_evt->pin == APP_GPIO_INT5_PIN) //int5

{

pin_level = app_io_read_pin(APP_GPIO_INT5_TYPE, APP_GPIO_INT5_PIN);

if (pin_level == APP_IO_PIN_RESET)

{

delay_ms(20);

do

{

pin_level = app_io_read_pin(APP_GPIO_INT5_TYPE, APP_GPIO_INT5_PIN);

} while(pin_level == APP_IO_PIN_SET);


io_wr_packet.daughtboard_index = 4;

}

}

if (p_evt->pin == APP_GPIO_INT6_PIN) //int6

{

pin_level = app_io_read_pin(APP_GPIO_INT6_TYPE, APP_GPIO_INT6_PIN);

if (pin_level == APP_IO_PIN_RESET)

{

delay_ms(20);

do

{

pin_level = app_io_read_pin(APP_GPIO_INT6_TYPE, APP_GPIO_INT6_PIN);

} while(pin_level == APP_IO_PIN_SET);


io_wr_packet.daughtboard_index = 5;

}

}

if (p_evt->pin == APP_GPIO_INT7_PIN) //int7

{

pin_level = app_io_read_pin(APP_GPIO_INT7_TYPE, APP_GPIO_INT7_PIN);

if (pin_level == APP_IO_PIN_RESET)

{

delay_ms(20);

do

{

pin_level = app_io_read_pin(APP_GPIO_INT7_TYPE, APP_GPIO_INT7_PIN);

} while(pin_level == APP_IO_PIN_SET);


io_wr_packet.daughtboard_index = 6;

}

}

if (p_evt->pin == APP_GPIO_INT8_PIN) //int8

{

pin_level = app_io_read_pin(APP_GPIO_INT8_TYPE, APP_GPIO_INT8_PIN);

if (pin_level == APP_IO_PIN_RESET)

{

delay_ms(20);

do

{

pin_level = app_io_read_pin(APP_GPIO_INT8_TYPE, APP_GPIO_INT8_PIN);

} while(pin_level == APP_IO_PIN_SET);


io_wr_packet.daughtboard_index = 7;

}

}

if (p_evt->pin == APP_GPIO_EMERGENCY_PIN) //int8

{

pin_level = app_io_read_pin(APP_GPIO_EMERGENCY_TYPE, APP_GPIO_EMERGENCY_PIN);

if (pin_level == APP_IO_PIN_RESET)

{

delay_ms(20);

do

{

pin_level = app_io_read_pin(APP_GPIO_EMERGENCY_TYPE, APP_GPIO_EMERGENCY_PIN);

} while(pin_level == APP_IO_PIN_SET);

}

}

board_led_on();

delay_ms(20);

board_led_off();

}


#define APP_GPIO_INT1_PIN APP_IO_PIN_8

#define APP_GPIO_INT1_TYPE APP_IO_TYPE_NORMAL


#define APP_GPIO_INT2_PIN APP_IO_PIN_9

#define APP_GPIO_INT2_TYPE APP_IO_TYPE_NORMAL


#define APP_GPIO_INT3_PIN APP_IO_PIN_10

#define APP_GPIO_INT3_TYPE APP_IO_TYPE_NORMAL


#define APP_GPIO_INT4_PIN APP_IO_PIN_11

#define APP_GPIO_INT4_TYPE APP_IO_TYPE_NORMAL


#define APP_GPIO_INT5_PIN APP_IO_PIN_12

#define APP_GPIO_INT5_TYPE APP_IO_TYPE_NORMAL


#define APP_GPIO_INT6_PIN APP_IO_PIN_13

#define APP_GPIO_INT6_TYPE APP_IO_TYPE_NORMAL


#define APP_GPIO_INT7_PIN APP_IO_PIN_14

#define APP_GPIO_INT7_TYPE APP_IO_TYPE_NORMAL


#define APP_GPIO_INT8_PIN APP_IO_PIN_15

#define APP_GPIO_INT8_TYPE APP_IO_TYPE_NORMAL




#define APP_GPIO_EMERGENCY_PIN APP_IO_PIN_3

#define APP_GPIO_EMERGENCY_TYPE APP_IO_TYPE_AON

每次复位中断能正常工作,看到LED点亮, 但是触发几十次后,就不响应中断了。 9个GPIO都不响应。不响应的时候使用示波器观察信号源仍然正常的,每次按键有一个向下的脉冲。

0收藏

0赞成

Seiyou

汇顶员工
2024-10-22 16:56

你好,可以确认一下系统是否进入了睡眠状态,或者直接禁用睡眠模式看看是否还有问题。

在GR5515中,只有AON_GPIO可以将系统从睡眠状态下唤醒。

禁用睡眠模式的方法:

在user_periph_setup.c中找到pwr_mgmt_mode_set函数调用,将入参改为PMR_MGMT_ACTIVE_MODE

0条评论

0赞成

0收藏

您的评论

登录后可回答问题,请 注册

我们时刻倾听您的声音
联系销售

扫描关注公众号

打开微信,使用“扫一扫”即可关注