是哪里用法错误吗,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);
}
下面是官方的例子,可以对比下
/**
* 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';
}
28脚不行,换到20脚就可以了。官方的例子留下一个小坑等着大家踩。
看下原理图为啥不行。估计28脚默认是ADC功能,不是GPIO输入功能。
增加如下代码后,28脚也正常。
gpio_init(PIN_TRIG);
gpio_set_dir(PIN_TRIG, GPIO_IN);
页:
[1]