armfly 发表于 2022-3-24 15:57:24

是哪里用法错误吗,RP2040无法触发GPIO外部中断。

是哪里用法错误吗,无法触发GPIO外部中断。


#define PIN_TRIG      28      // 硬件触发口线

int main()
{
gpio_init(25);
gpio_set_dir(25, GPIO_OUT);
gpio_put(25, 1);
gpio_set_irq_enabled_with_callback(PIN_TRIG, GPIO_IRQ_EDGE_RISE, true, &TrigCallback);
while(1);
}

static void TrigCallback(uint gpio, uint32_t events)
{
    gpio_put(25, 0);
}

eric2013 发表于 2022-3-24 17:03:22

下面是官方的例子,可以对比下

/**
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
*/

#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/gpio.h"

static char event_str;

void gpio_event_string(char *buf, uint32_t events);

void gpio_callback(uint gpio, uint32_t events) {
    // Put the GPIO event(s) that just happened into event_str
    // so we can print it
    gpio_event_string(event_str, events);
    printf("GPIO %d %s\n", gpio, event_str);
}

int main() {
    stdio_init_all();

    printf("Hello GPIO IRQ\n");
    gpio_set_irq_enabled_with_callback(2, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, true, &gpio_callback);

    // Wait forever
    while (1);

    return 0;
}


static const char *gpio_irq_str[] = {
      "LEVEL_LOW",// 0x1
      "LEVEL_HIGH", // 0x2
      "EDGE_FALL",// 0x4
      "EDGE_RISE"   // 0x8
};

void gpio_event_string(char *buf, uint32_t events) {
    for (uint i = 0; i < 4; i++) {
      uint mask = (1 << i);
      if (events & mask) {
            // Copy this event string into the user string
            const char *event_str = gpio_irq_str;
            while (*event_str != '\0') {
                *buf++ = *event_str++;
            }
            events &= ~mask;

            // If more events add ", "
            if (events) {
                *buf++ = ',';
                *buf++ = ' ';
            }
      }
    }
    *buf++ = '\0';
}

armfly 发表于 2022-3-24 18:02:20

28脚不行,换到20脚就可以了。官方的例子留下一个小坑等着大家踩。

看下原理图为啥不行。估计28脚默认是ADC功能,不是GPIO输入功能。
增加如下代码后,28脚也正常。
    gpio_init(PIN_TRIG);
    gpio_set_dir(PIN_TRIG, GPIO_IN);






页: [1]
查看完整版本: 是哪里用法错误吗,RP2040无法触发GPIO外部中断。