乐鑫技术交流
直播中

乔丽娜

7年用户 1068经验值
私信 关注
[问答]

esp32部分gpio口中断未触发是怎么回事?

设置了一个80微妙的硬件定时器用作输出IO口控制。一个输入IO口中断,用作控制输出IO口的波形。
输入IO口的信号稳定发生,但是输入IO口的中断并没有稳定触发,会出现部分中断未触发的情况,导致输出IO口不能稳定的输出波形。请问我应该这么做才能让每一个输入信号都被检测到呢?
代码如下:
volatile u32_t  zero_bit=0;void IRAM_ATTR testgpio_isr_handler(void* arg){                zero_bit=0;}void IRAM_ATTR gpio_isr_handler_zerow(void* arg){         int changebrg=50;        if(zero_bit>105)          gpio_set_level(LIGHT_GPIO, 0);//把这个GPIO输出低电平        else if(zero_bit>=50)          gpio_set_level(LIGHT_GPIO, 1);//把这个GPIO输出高电平        else          gpio_set_level(LIGHT_GPIO, 0);//把这个GPIO输出低电平       zero_bit++;}static int gpio_input_init(void){   //GPIO口结构体定义    gpio_config_t io_conf;    //边沿触发    io_conf.intr_type =GPIO_PIN_INTR_ANYEDGE;    //选择为输入模式    io_conf.mode = GPIO_MODE_INPUT;    //配置GPIO_OUT寄存器    io_conf.pin_bit_mask = (1<<23);//输入io口23    //设置下拉    io_conf.pull_down_en = 0;    //设置上拉    io_conf.pull_up_en = 1;    //最后配置使能    gpio_config(&io_conf);        //输出IO口配置    io_conf.mode = GPIO_MODE_OUTPUT;    io_conf.intr_type =GPIO_PIN_INTR_DISABLE;    //bit mask of the pins that you want to set,e.g.GPIO5    io_conf.pin_bit_mask = (1<<5); //输出IO口5    //disable pull-down mode    io_conf.pull_down_en = 0;    //disable pull-up mode    io_conf.pull_up_en = 0;    //configure GPIO with the given settings    gpio_config(&io_conf);        //配置中断    gpio_install_isr_service(0);    gpio_isr_handler_add(GPIO_INPUT_ZERO, testgpio_isr_handler, (void*) GPIO_INPUT_ZERO);        return 0;}void app_main(){  gpio_input_init();  esp_timer_handle_t test_p_handle = 0;        //定义一个周期重复运行的定时器结构体        esp_timer_create_args_t test_periodic_arg = {         .callback = &gpio_isr_handler_zerow, //设置回调函数        .arg = NULL, //不携带参数        .name = "gpio_pwm" //定时器名字        };        vTaskDelay(1000/ portTICK_RATE_MS);        ESP_ERROR_CHECK(esp_timer_create(&test_periodic_arg , &test_p_handle));        ESP_ERROR_CHECK(esp_timer_start_periodic(test_p_handle, 80));}
```
                           

回帖(1)

王秀珍

2024-6-26 17:18:06
从您的描述来看,ESP32的GPIO中断可能没有稳定触发,导致输出波形不稳定。为了解决这个问题,我们可以从以下几个方面进行排查和优化:

1. **中断优先级**:确保您的输入GPIO中断具有适当的优先级。如果中断优先级设置得太低,可能会被其他中断任务抢占,导致中断未能及时触发。

2. **中断配置**:检查您的GPIO中断配置是否正确。例如,确保您已经正确设置了中断类型(如上升沿、下降沿或双边沿触发)。

3. **硬件问题**:检查您的硬件连接是否稳定,确保输入信号没有受到干扰或噪声的影响。

4. **软件滤波**:在中断服务程序中添加软件滤波,以消除可能的抖动或噪声。例如,您可以在中断服务程序中添加一个简单的计数器,只有当检测到一定数量的连续相同信号时才触发中断。

5. **中断服务程序优化**:优化您的中断服务程序,确保它尽可能高效。避免在中断服务程序中执行耗时的操作,以减少中断响应时间。

6. **中断标志位检查**:在中断服务程序中,检查中断标志位是否被正确设置。如果标志位没有被正确设置,中断可能不会被触发。

7. **中断服务程序注册**:确保您已经正确注册了中断服务程序。如果中断服务程序没有被正确注册,中断将不会被触发。

8. **ESP32固件版本**:检查您的ESP32固件版本是否为最新版本。有时候,固件中的bug可能会导致中断问题。如果可能,请尝试升级到最新版本的固件。

9. **调试和日志记录**:在中断服务程序中添加调试和日志记录,以便更好地了解中断触发的情况。这可以帮助您确定问题所在,并找到解决方案。

10. **其他中断源**:检查是否有其他中断源可能影响到您的GPIO中断。如果有,尝试调整其他中断源的优先级或配置,以减少对GPIO中断的影响。

通过以上步骤,您应该能够找到导致GPIO中断不稳定的原因,并采取相应的措施解决问题。希望这些建议能帮助您解决问题,让每一个输入信号都被检测到。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分