手把手教你写可复用的 Pico 空闲模式代码,附功耗优化技巧
在以下示例中,我们在循环中调用 machine.idle() 函数,使 CPU 进入空闲模式,降低功耗,通过配合外部中断,可以在有外部事件发生时,快速唤醒 CPU 进行处理。
这里,在风雅一号板-通用兼容扩展板上我们使用树莓派 Pico 的 GP22 引脚连接按键 USERKEY,设置 GP22 为下边沿触发,按键按下即可唤醒 CPU,可以在我们风雅一号板-通用兼容扩展板中看到,用户按键 USERKEY 在不按下时通过上拉电阻设置为高电平:

而当按下按键时为低电平,因此设置为下边沿触发:

以下代码可以在我们提供的资料包中 elegance-devkit v1\Demo\55 Machine_Idle 文件夹找到。
示例代码如下:
# Python env : MicroPython v1.23.0
# -*- coding: utf-8 -*-
# @Time : 2024/8/23 下午2:31
# @Author : 李清水
# @File : main.py
# @Description : 低功耗类实验,使用machine.idle()方法进入空闲模式
# ======================================== 导入相关模块 ========================================
# 导入硬件模块
import machine
# 导入时间相关模块
import time
# ======================================== 全局变量 ============================================
# ======================================== 功能函数 ============================================
# 定义外部中断处理函数
def button_handler(pin: machine.Pin) -> None:
"""
外部中断处理函数,按下按键后翻转 LED 状态并打印信息。
Args:
pin (machine.Pin): 触发中断的按键实例。
Returns:
None
Raises:
None
"""
# 声明全局变量
global led
# LED灯翻转
led.toggle()
# 打印调试信息
print("Button pressed!")
# ======================================== 自定义类 ============================================
# ======================================== 初始化配置 ==========================================
# 上电延时3s
time.sleep(3)
# 打印调试信息
print("FreakStudio : Using irq to wake up Pico of idle mode")
# 创建一个LED对象
led = machine.Pin(25, machine.Pin.OUT)
# 设置 GPIO22 为输入,并使能上拉电阻
button_pin = machine.Pin(22, machine.Pin.IN, machine.Pin.PULL_UP)
# 配置外部中断
button_pin.irq(trigger=machine.Pin.IRQ_FALLING, handler=button_handler)
# ======================================== 主程序 ===========================================
# 主程序循环
while True:
# 在循环中调用 machine.idle() 函数,降低 CPU 功耗
machine.idle()
# 打印消息以指示主循环正在运行
print("System is idling...")
# 为了避免打印过于频繁,可以加一个延时
time.sleep(1)
烧录代码,连接远程终端,输出如下:


可以看到,当我们按下按键时,外部中断将 CPU 唤醒,LED 灯亮灭反转,同时终端输出调试信息。
下面我们使用 USB 功率计连接到风雅一号板-通用兼容扩展板树莓派 Pico 的 USB 接口,对比两个模式下功耗:


* 在以下示例中,我们在循环中调用 `machine.idle()` 函数,使 CPU 进入空闲模式,降低功耗,通过配合外部中断,可以在有外部事件发生时,快速唤醒 CPU 进行处理。
浙公网安备 33010602011771号