如何在树莓派Pico的C语言中为单个引脚设置两个独立回调函数
GPIO上升沿/下降沿分别触发独立回调的正确实现
你的代码无法正常工作的核心原因是:同一个GPIO引脚只能绑定一个中断回调函数。第二次调用gpio_set_irq_enabled_with_callback会直接覆盖第一次设置的回调,最终不管是上升沿还是下降沿触发中断,只会执行ThisIsCallBack2。
要实现两种边沿分别调用独立函数的需求,正确的做法是先绑定一个统一的中断回调,在回调内部根据触发的边沿类型,分别调用对应的处理函数。
实现步骤与代码示例
- 定义各自的边沿处理函数
// 上升沿处理逻辑 void ThisIsCallBack1() { // 写入你的上升沿处理代码 } // 下降沿处理逻辑 void ThisIsCallBack2() { // 写入你的下降沿处理代码 }
- 编写统一的中断回调函数,判断边沿类型并分发调用
void unified_gpio_callback(uint gpio, uint32_t events) { // 检查是否是上升沿触发 if (events & GPIO_IRQ_EDGE_RISE) { ThisIsCallBack1(); } // 检查是否是下降沿触发 if (events & GPIO_IRQ_EDGE_FALL) { ThisIsCallBack2(); } }
- 初始化GPIO中断,同时启用两种边沿检测并绑定统一回调
// 同时监听GPIO2的上升沿和下降沿中断 gpio_set_irq_enabled_with_callback(2, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, true, &unified_gpio_callback);
额外注意事项
- 确保GPIO引脚已正确配置为输入模式(比如设置上拉/下拉电阻),避免电平抖动导致误触发。
- 如果需要处理抖动,可在回调中加入软件消抖逻辑,或者使用硬件消抖电路。
内容的提问来源于stack exchange,提问作者Tomasz Pabich
相关产品推荐
相关产品推荐

