求助,配置按键pin引脚中断,出现类似卡死的现象

使用的SF32LB525UC6芯片,PA34引脚接入按键下拉,按下时高电平。参考SDK编程指南→RT-Thread 设备驱动→PIN设备的示例1-中断模式。配置这个引脚为上升沿触发,按键按下时在main函数中的每秒的打印引脚电平没有了,像卡死了一样。去掉这个pin_irq()这个初始化函数,按键按下时正常每秒打印高电平 pin_read value=1. :persevering_face:
以开启了#define RT_USING_PIN 1 #define BSP_USING_GPIO 1

static void pin_irq_callback(void *args) {
   rt_kprintf(“pin_irq_callback!”);
}

void pin_irq(void)
{
    rt_base_t pin_id = GET_PIN(1,34); //Get GPIOA_34 pin id
    //Set pin input mode
    HAL_PIN_Set(PAD_PA34, GPIO_A34, PIN_PULLDOWN, 1);
    rt_pin_mode(pin_id, PIN_MODE_INPUT_PULLDOWN);
    //Enable rasing edge interrupt mode
    rt_pin_attach_irq(pin_id, PIN_IRQ_MODE_RISING, pin_irq_callback, RT_NULL);
    rt_pin_irq_enable(pin_id, 1);
}

int main(void)
{
    /* Output a message on console using printf function */
    rt_kprintf(“Start Test!\n”);
    int v;
    rt_base_t pin_id = GET_PIN(1,34);
    pin_irq();
    while (1)
    {
        v = rt_pin_read(pin_id);
        rt_kprintf(“pin_read value=%d.\r\n”, v);
        rt_thread_mdelay(1000);
    }
    return 0;
}

串口打印

Serial Debug 2025-09-27 100628.txt (722 字节)

不知道你用的是哪种板子,具体死机情况是什么样的。
试了和你一样的代码,没有死机,能够输出pin_read value=1;但是会一直一直进入中断输出"pin_irq_callback!"

后面换成43号,也会出现类似一直进入中断输出"pin_irq_callback!"问题,但是去掉

HAL_PIN_Set(PAD_PA34, GPIO_A34, PIN_PULLDOWN, 1);这行代码就正常了。你可以试试。

static void pin_irq_callback(void *args) {
   rt_kprintf("pin_irq_callback!");
}


void pin_irq(void)
{
    rt_base_t pin_id = GET_PIN(1,43); //Get GPIOA_34 pin id
    //Set pin input mode
    rt_pin_mode(pin_id, PIN_MODE_INPUT_PULLDOWN);
    //Enable rasing edge interrupt mode
    rt_pin_attach_irq(pin_id, PIN_IRQ_MODE_RISING, pin_irq_callback, RT_NULL);
    rt_pin_irq_enable(pin_id, 1);
}

int main(void)
{
    rt_kprintf("Start Test!\n");
    int v;
    rt_base_t pin_id = GET_PIN(1,43);
    pin_irq();
    while (1)
    {
        v = rt_pin_read(pin_id);
        rt_kprintf("pin_read value=%d.\r\n", v);
        rt_thread_mdelay(1000);
    }
    return 0;
}

感谢回复,我也换成了黄山派板子,使用你下面提供的代码,43引脚。我现在的现象是上电正常每秒打印 pin_read value=0. ,我按下这个43引脚的按键,串口助手里面是没有pin_read value=1.这条打印的,也没有进入中断里面的pin_irq_callback!打印。打印似乎就卡住了,松手之后每秒的打印也是没有了,也没有打印任何报错信息,就像死机了一样,可太奇怪了 :tired_face:

我重新新建了个工程,发现就可以了,正常触发中断。之前的工程唯一的区别就是开启了 Enable ulog 。这是为何会出现这个故障 :face_without_mouth:

开启Enable ISR log.就可以完美解决,但是并没有在中断回调函数中调用log函数,只是开启了但使用了rt_kprintf也会出现故障 :thinking:

1 个赞

问题可能是这样吧,我也试了一下。开启Enable ISR log 后就正常了。

1 个赞

是的,一旦开了ulog,即使rt_kprintf最终调用的还是ulog的函数