硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1354|回复: 2
收起左侧

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

[复制链接]

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2022-3-24 15:57:24 | 显示全部楼层 |阅读模式
是哪里用法错误吗,无法触发GPIO外部中断。

[C] 纯文本查看 复制代码
#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);
}


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106422
QQ
发表于 2022-3-24 17:03:22 | 显示全部楼层
下面是官方的例子,可以对比下

[C] 纯文本查看 复制代码
/**
 * 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[128];

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[i];
            while (*event_str != '\0') {
                *buf++ = *event_str++;
            }
            events &= ~mask;

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

回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
 楼主| 发表于 2022-3-24 18:02:20 | 显示全部楼层
28脚不行,换到20脚就可以了。官方的例子留下一个小坑等着大家踩。

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


image.png




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-20 00:23 , Processed in 0.163314 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表