寻求低功耗例程



  • 用途为芯片周期用i2c读传感器数据,在数据发生较大的变化时通过广播来向一个主机设备传递传感器数据。读传感器数据和广播通信已经实现,提问:芯片要怎样操作才能做到才能尽可能的功耗低呢?

    想要一份低功耗例程参考一下



  • 1、适当增大一下广播间隔
    2、数据变化不大的时候可以关闭广播,变化大的时候开启一段时间广播

    这是我们低功耗方案的逻辑
    0_1756109858191_347c92ca-9944-485f-9862-6876e54f16fa-image.png
    0_1756109892370_62750c81-1f7b-4291-979c-6a19b0e62689-image.png



  • 设置按键唤醒,可以设置为下降沿产生中断吗?

        pmu_set_pin_pull(GPIO_PORT_C, (1 << GPIO_BIT_5), true);
        pmu_port_wakeup_func_set(GPIO_PC5);
    

    上述代码是按键按下和抬起都会产生中断。



  • @ZR
    设置下降沿触发中断唤醒有提供API吗?



  • 现在还不支持配置触发边沿



  • __attribute__((section("ram_code"))) void pmu_gpio_isr_ram(void)
    {
        uint32_t gpio_value = ool_read32(PMU_REG_GPIOA_V);
    
        co_printf("gpio_value: %X\r\n", gpio_value);
    
        ool_write32(PMU_REG_PORTA_LAST, gpio_value);
    }
    

    这个PMU中GPIO中断处理函数,可以区分哪一个GPIO吗? 比如我设置PA0,PA1都可以唤醒深度睡眠,如何区分是哪一个IO口触发的中断?



  • @uplooking
    这个gpio_value 值的每位就是代表PA7到PA0口的值,能通过变化判断出是哪个引脚吧
    0_1756893954527_95d8c3a3-c92e-4367-b664-54153cec6d39-图片.png



  • 中断处理函数 PD7和PB5

    __attribute__((section("ram_code"))) void pmu_gpio_isr_ram(void)
    {
        uint32_t gpio_value = ool_read32(PMU_REG_GPIOA_V);
    
        button_toggle_detected(gpio_value);
    
        co_printf(" %s gpio_value: %x\r\n", __func__, gpio_value);
    
        ool_write32(PMU_REG_PORTA_LAST, gpio_value);
    }
    

    按下Key(PD7),运行结果如下:

    pmu_gpio_isr_ram gpio_value: 5080a03c
    pmu_gpio_isr_ram gpio_value: d080a03c
    pmu_gpio_isr_ram gpio_value: 5080a03c
    pmu_gpio_isr_ram gpio_value: d080a03c
    pmu_gpio_isr_ram gpio_value: 5080a03c
    pmu_gpio_isr_ram gpio_value: d080a03c
    pmu_gpio_isr_ram gpio_value: 5080a03c
    pmu_gpio_isr_ram gpio_value: d080a03c
    pmu_gpio_isr_ram gpio_value: 5080a03c
    pmu_gpio_isr_ram gpio_value: d080a03c
    pmu_gpio_isr_ram gpio_value: 5080a03c
    pmu_gpio_isr_ram gpio_value: d080a03c
    pmu_gpio_isr_ram gpio_value: 5080a03c
    pmu_gpio_isr_ram gpio_value: d080a03c
    pmu_gpio_isr_ram gpio_value: 5080a03c
    pmu_gpio_isr_ram gpio_value: d080a03c
    pmu_gpio_isr_ram gpio_value: 5080a03c
    pmu_gpio_isr_ram gpio_value: d080a03c
    pmu_gpio_isr_ram gpio_value: 5080a03c
    pmu_gpio_isr_ram gpio_value: d080a03c
    pmu_gpio_isr_ram gpio_value: 5080a03c
    pmu_gpio_isr_ram gpio_value: d080a03c
    pmu_gpio_isr_ram gpio_value: 5080a03c
    pmu_gpio_isr_ram gpio_value: d080a03c
    pmu_gpio_isr_ram gpio_value: 5080a03c
    pmu_gpio_isr_ram gpio_value: d080a03c
    pmu_gpio_isr_ram gpio_value: 4000a03c
    pmu_gpio_isr_ram gpio_value: c000a03c
    pmu_gpio_isr_ram gpio_value: 4000a03c
    pmu_gpio_isr_ram gpio_value: c000a03c
    pmu_gpio_isr_ram gpio_value: 5000a03c
    pmu_gpio_isr_ram gpio_value: c000a03c
    pmu_gpio_isr_ram gpio_value: 4000a03c
    pmu_gpio_isr_ram gpio_value: c000a03c
    pmu_gpio_isr_ram gpio_value: 4000a03c
    pmu_gpio_isr_ram gpio_value: d080a03c
    pmu_gpio_isr_ram gpio_value: 4000a03c
    pmu_gpio_isr_ram gpio_value: c000a03c

    
    请问一下,为啥同一个按键按下和抬起输出的值不一样?


  • 此回复已被删除!


  • @uplooking gpio按下对应的位的值为0,抬起对应的位的值是1,以PD7为例,按下如果是40(01000000),那么抬起是C0(11000000)



  • 代码如下:

    __attribute__((section("ram_code"))) void pmu_gpio_isr_ram(void)
    {
        uint32_t gpio_value = ool_read32(PMU_REG_GPIOA_V);
    
        // PB5
        if (gpio_value & GPIO_PB5)
        {
        
            co_printf("%s  gpio_value: %x\r\n", __func__, gpio_value);
        }
        else
        {
            button_toggle_detected(gpio_value);
        }
        
        // co_printf(" %s gpio_value: %x\r\n", __func__, gpio_value);
    
        ool_write32(PMU_REG_PORTA_LAST, gpio_value);
    }
    
    
    
    void user_key_init(void)
    {
        // 设置上拉 PD7 按键
        pmu_set_pin_pull(KEY_GPIO_PORT, (1 << KEY_GPIO_BIT), true);
    
        // PB5 外部中断引脚
        pmu_set_pin_pull(GPIO_PORT_B, (1 << GPIO_BIT_5), true);
    
        // PD7 PB5
        pmu_port_wakeup_func_set(KEY_GPIO | GPIO_PB5);
    
        button_init(KEY_GPIO);
    }
    
    

    问题如下:现在有PB5和PD7都设置中断唤醒,在中断处理函数pmu_gpio_isr_ram中如何区分是PD7引脚的中断,还是PB5的中断呢?