完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
设置了一个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个回答
|
|
从您的描述来看,ESP32的GPIO中断可能没有稳定触发,导致输出波形不稳定。为了解决这个问题,我们可以从以下几个方面进行排查和优化:
1. **中断优先级**:确保您的输入GPIO中断具有适当的优先级。如果中断优先级设置得太低,可能会被其他中断任务抢占,导致中断未能及时触发。 2. **中断配置**:检查您的GPIO中断配置是否正确。例如,确保您已经正确设置了中断类型(如上升沿、下降沿或双边沿触发)。 3. **硬件问题**:检查您的硬件连接是否稳定,确保输入信号没有受到干扰或噪声的影响。 4. **软件滤波**:在中断服务程序中添加软件滤波,以消除可能的抖动或噪声。例如,您可以在中断服务程序中添加一个简单的计数器,只有当检测到一定数量的连续相同信号时才触发中断。 5. **中断服务程序优化**:优化您的中断服务程序,确保它尽可能高效。避免在中断服务程序中执行耗时的操作,以减少中断响应时间。 6. **中断标志位检查**:在中断服务程序中,检查中断标志位是否被正确设置。如果标志位没有被正确设置,中断可能不会被触发。 7. **中断服务程序注册**:确保您已经正确注册了中断服务程序。如果中断服务程序没有被正确注册,中断将不会被触发。 8. **ESP32固件版本**:检查您的ESP32固件版本是否为最新版本。有时候,固件中的bug可能会导致中断问题。如果可能,请尝试升级到最新版本的固件。 9. **调试和日志记录**:在中断服务程序中添加调试和日志记录,以便更好地了解中断触发的情况。这可以帮助您确定问题所在,并找到解决方案。 10. **其他中断源**:检查是否有其他中断源可能影响到您的GPIO中断。如果有,尝试调整其他中断源的优先级或配置,以减少对GPIO中断的影响。 通过以上步骤,您应该能够找到导致GPIO中断不稳定的原因,并采取相应的措施解决问题。希望这些建议能帮助您解决问题,让每一个输入信号都被检测到。 |
|
|
|
只有小组成员才能发言,加入小组>>
486 浏览 1 评论
552浏览 6评论
461浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
443浏览 5评论
445浏览 4评论
415浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 20:14 , Processed in 0.671953 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号