完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我在 GPIO_INTR_ANYEDGE 上配置了一个 GPIO ISR。
我想在 ISR 中知道它是上升沿还是下降沿。 怎么做? 如果我只是在 ISR 中读取 GPIO 状态,它几乎总是 0,即使在上升沿也是如此。 例子: 代码:全选#define PIN GPIO_NUM_5 gpio_set_intr_type(PIN, GPIO_INTR_POSEDGE); // <<<< Rising edge only! gpio_set_direction(PIN, GPIO_MODE_INPUT); gpio_pullup_en(PIN); gpio_isr_handler_add(PIN, gpio_sda_handler, (void *) PIN); static void gpio_handler(void *arg) { uint32_t x = gpio_get_level(PIN); xQueueSendFromISR(gpio_evt_queue, &x, NULL); } static void gpio_task(void *arg) { uint32_t x; for (;;) { if (xQueueReceive(gpio_evt_queue, &x, portMAX_DELAY)) { ESP_LOGI(TAG, "GPIO[%d] intr, val: %d\n", PIN, x & 1); } } } 输出: 代码:全选I (32183) i2c-tools: GPIO[5] intr, val: 0 I (32183) i2c-tools: GPIO[5] intr, val: 0 I (32193) i2c-tools: GPIO[5] intr, val: 1 I (32193) i2c-tools: GPIO[5] intr, val: 0 I (32203) i2c-tools: GPIO[5] intr, val: 0 我需要某种延迟吗?如果是这样,多少钱?可以延迟 ISR 吗? |
|
相关推荐
1个回答
|
|
c void gpio_sda_handler(void* arg)
{ uint32_t gpio_num = (uint32_t) arg; uint32_t level = gpio_get_level(gpio_num); if(level == 1) { // 上升沿 } else { // 下降沿 } } 在 ISR 中使用 gpio_get_level() 函数读取 GPIO 状态,然后根据状态判断是上升沿还是下降沿。注意,在 ISR 中最好不要使用延迟等函数,以免影响系统响应能力。 |
|
|
|
只有小组成员才能发言,加入小组>>
1140 浏览 1 评论
577浏览 6评论
478浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
462浏览 5评论
463浏览 4评论
438浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 18:23 , Processed in 0.834385 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号