I/O常见问题

1. 如何处理IO漏电导致睡眠功耗高的问题(睡眠前如何正确进行IO的配置和检测)?

  • 需要按照应用笔记中介绍的上下拉电阻配置原则,正确配置每个IO的上下拉电阻。

  • 在分析问题时,可以在睡眠前把每个IO的上下拉配置情况读取出来逐一检查。具体的做法是,实现睡眠前检测IO的函数,函数里面把GPIO、AON IO、MSIO的上下拉配置都读取出来;然后通过pwr_mgmt_register_io_dump_func()把该函数注册到睡眠前的函数钩子io_dump_func_t。这样真正进入睡眠前,SDK就会调用上下拉配置读取的函数,把睡眠前的IO上下拉配置读取出来进行检查。具体方法可参考论坛讨论“GR551x 如何在睡眠前测量GPIO上下拉状态分析GPIO配置是否正确”。

2. 如何处理IO中断丢失的问题?

  • 检查中断回调函数app_io_event_handler()中,根据p_evt判断中断引脚号时,不能用if…else…的结构,因为可能存在几个引脚同时响应一个回调函数的情况。SDK的示例代码是正确的判断结构:

    if (p_evt->pin == APP_GPIO_KEY0_PIN)
    {
    }
    if (p_evt->pin == APP_GPIO_KEY1_PIN)
    {
    }
    
  • 引脚中断是分组的,GPIO0~15响应的是EXT0_IRQ,GPIO16~31响应的是EXT1_IRQ,GPIO32~33响应的是EXT2_IRQ,AON IO响应的是AON_EXT_IRQ。同一组的引脚如果它们的中断触发时间比较接近,那么它们可能会同时响应一个IRQ。

3. IO有没有推挽输出模式?

  • GR5xx系列芯片的IO没有推挽输出模式。各个IO的驱动电流有限,具体可参见Datasheet关于IO章节的Electrical Specifications部分。

4. 利用IO翻转输出方波,频率误差很大,是什么原因?

  • 检查是否设置IO电平的函数执行效率慢导致。如果需要快速翻转IO,可以在初始化完成后调用LL层函数,比如ll_gpio_set_output_pin\ll_gpio_reset_output_pin、ll_gpio_toggle_pin,AON_GPIO\MSIO同理。

  • 此外,函数放在SRAM执行可以进一步提高速率,在函数名前加SECTION_RAM_CODE即可。