CN / EN
CN / EN

提问

获得支持

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

GPIO中断输入检测,如何配置为双边沿触发 GR551x

手环啊

2020-10-09 16:39

文档里面没有介绍,有劳技术小哥解答下

0收藏

0赞成

walt

汇顶员工
2020-10-12 20:27

你好,gr5515 io支持下降沿,上升沿,高电平,低电平触发中断,暂不支持双沿触发

如果使用双边沿触发,可以在中断发生时更改io中断触发设置以实现功能

0条评论

0赞成

0收藏

您的评论

手环啊

2020-10-13 11:43

是这样吗?触发中断后,重新配置,但是我这样配置了之后,就只能触发一次中断,之后不管上升沿还是下降沿都进不去了,是哪里没有弄对吗?


void high_gpio(void);

void low_gpio(void);

void hal_gpio_exti_callback(gpio_regs_t* GPIOx, uint16_t GPIO_Pin)
{
gpio_pin_state_t pin_level;
if(GPIO_Pin & GPIO_KEY0)
{
pin_level = hal_gpio_read_pin(GPIO_KEY_PORT, GPIO_KEY0);
tim_delay_ms(10);
if(pin_level == GPIO_PIN_RESET)
{
printf("\r\nKEY0 down pressed.\r\n");
high_gpio();
}
else
{
printf("\r\nKEY0 up pressed.\r\n");
low_gpio();
}
}
}

void low_gpio(void)
{
gpio_init_t gpio_config = GPIO_DEFAULT_CONFIG;
gpio_config.mode = GPIO_MODE_IT_FALLING;
gpio_config.pin = GPIO_KEY0;
gpio_config.pull = GPIO_PULLUP;
hal_gpio_init(GPIO_KEY_PORT, &gpio_config);
/* Enable interrupt */
hal_nvic_clear_pending_irq(GPIO_GET_IRQNUM(GPIO_KEY_PORT));
hal_nvic_enable_irq(GPIO_GET_IRQNUM(GPIO_KEY_PORT));
}

void high_gpio(void)
{
gpio_init_t gpio_config = GPIO_DEFAULT_CONFIG;
gpio_config.mode = GPIO_MODE_IT_RISING;
gpio_config.pin = GPIO_KEY0;
gpio_config.pull = GPIO_PULLDOWN;
hal_gpio_init(GPIO_KEY_PORT, &gpio_config);
/* Enable interrupt */
hal_nvic_clear_pending_irq(GPIO_GET_IRQNUM(GPIO_KEY_PORT));
hal_nvic_enable_irq(GPIO_GET_IRQNUM(GPIO_KEY_PORT));
}


0条评论

0赞成

0收藏

您的评论

walt

汇顶员工
2020-10-19 21:32

你好,我这边做了一个aon io6的测试,代码如下:

#define KEY_TEST_PIN  APP_IO_PIN_6

static volatile bool falling_edge_triggered_flag =false;
static volatile bool rising_edge_triggered_flag =false;

void app_gpiote_event_handler(app_gpiote_evt_t *p_evt)
{
if((APP_IO_TYPE_AON== (p_evt->type))&&(KEY_TEST_PIN ==(p_evt->pin)))
{
app_io_pin_state_t pin_level = app_io_read_pin(APP_IO_TYPE_AON,KEY_TEST_PIN);

if(pin_level)
{
rising_edge_triggered_flag =true;
}

else
{
falling_edge_triggered_flag =true;
}
}
}

const app_gpiote_param_t param[] =
{
{APP_IO_TYPE_AON, KEY_TEST_PIN, APP_IO_MODE_IT_FALLING, APP_IO_PULLUP, APP_IO_NONE_WAKEUP, app_gpiote_event_handler},
};

int main(void)
{
app_gpiote_param_t tmp_param;

/* Initial printf mode and UART */
app_log_assert_init();

printf("\r\n");

app_gpiote_init(param, sizeof (param) / sizeof (app_gpiote_param_t));

memcpy(&tmp_param,param,sizeof(app_gpiote_param_t));
while(1)
{
if(rising_edge_triggered_flag)
{
app_gpiote_deinit();
sys_delay_ms(10);

printf("rising_edge_triggered_flag:%d,falling_edge_triggered_flag:%d\r\n",rising_edge_triggered_flag,falling_edge_triggered_flag);

rising_edge_triggered_flag =false;
tmp_param.mode =APP_IO_MODE_IT_FALLING;
tmp_param.pull =APP_IO_PULLUP;
app_gpiote_init(&tmp_param,1);
}

if(falling_edge_triggered_flag)
{
app_gpiote_deinit();
sys_delay_ms(10);

printf("rising_edge_triggered_flag:%d,falling_edge_triggered_flag:%d\r\n",rising_edge_triggered_flag,falling_edge_triggered_flag);

falling_edge_triggered_flag =false;
tmp_param.mode =APP_IO_MODE_IT_RISING;
tmp_param.pull =APP_IO_PULLDOWN;
app_gpiote_init(&tmp_param, 1);
}

app_log_flush();
}
}

可以使用SK板 J40-1接线测试,个人觉得使用中断后开启timer延时,会比这种方法更通用一些

谢谢

0条评论

0赞成

0收藏

您的评论

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

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

扫描关注公众号

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