手把手教你写可复用的 Picolightsleep代码,附串口调试与功耗优化

这里,我们使用 machine.lightsleep() 进入浅度睡眠模式,在进入睡眠模式时可以指定睡眠时间,从而达到更好的功耗优化;我们使用树莓派 Pico 的 GP22 引脚连接按键,设置 GP22 为下边沿触发,按键按下即可唤醒 CPU;使用串口外设来输出调试信息。

在进行浅度睡眠模式实验前,我们首先需要将 MiniUSB 数据线连接到风雅一号板-通用兼容扩展板上的串口,这里,GP0GP1 是树莓派 Pico 的硬件串口 UART0 的默认引脚:

1.PNG

插入后实物图如下:

这里,在风雅一号板-通用兼容扩展板上我们使用树莓派 Pico 的 GP22 引脚连接按键 USERKEY,设置 GP22 为下边沿触发,按键按下即可唤醒 CPU,可以在我们风雅一号板-通用兼容扩展板中看到,用户按键 USERKEY 在不按下时通过上拉电阻设置为高电平:

2.PNG

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

3.PNG

以下代码可以在我们提供的资料包中 elegance-devkit v1\Demo\55 Machine_Idle 文件夹找到。

浅度睡眠模式示例代码如下:

# Python env   : MicroPython v1.23.0
# -*- coding: utf-8 -*-        
# @Time    : 2024/8/23 下午2:52   
# @Author  : 李清水            
# @File    : main.py       
# @Description : 低功耗类实验,使用machine.lightsleep()方法进入睡眠模式

# ======================================== 导入相关模块 ========================================

# 导入硬件模块
import machine
from machine import UART
# 导入时间相关模块
import time

# ======================================== 全局变量 ============================================

# ======================================== 功能函数 ============================================

# 定义外部中断处理函数
def button_handler(pin: machine.Pin) -> None:
    """
​    外部中断处理函数,按下按键后翻转 LED 状态并打印信息。

​    Args:
​        pin (machine.Pin): 触发中断的按键实例。

​    Returns:
​        None

​    Raises:
​        None
​    """
​    ​# 声明全局变量
    global led, uart

    # 使用REPL打印调试信息,不会输出
    print("Button pressed!")
    # 使用串口打印调试信息
    uart.write("Button pressed!\r\n")

    # LED灯翻转
    led.toggle()

# ======================================== 自定义类 ============================================

# ======================================== 初始化配置 ==========================================

# 创建一个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)

# 创建串口对象,设置波特率为115200
uart = UART(0, 115200)
# 初始化uart对象,波特率为115200,数据位为8,无校验位,停止位为1
uart.init(baudrate  = 115200,
          bits      = 8,
          parity    = None,
          stop      = 1,
          tx        = 0,
          rx        = 1,
          timeout   = 100)

# ========================================  主程序  ===========================================

# 上电延时
time.sleep(3)
# 打印调试信息
print("FreakStudio : Using irq to wake up Pico of lightsleep mode")

# 进入 lightsleep 模式,超时时间为 100s
machine.lightsleep(100000)

# 延时1s,不然外部中断唤醒CPU后,会先执行下面语句,然后才会执行外部中断处理函数
time.sleep(1)
# 在树莓派Pico上REPL无法重新连接,该语句不会在终端显示
print("Woke up from lightsleep mode.")
# 使用串口打印调试信息,该语句会打印
uart.write("Woke up from lightsleep mode.\r\n")

烧录代码,连接远程终端,输出如下:

4.png

mmexport1782381424354.gif

可以看到,当我们按下按键时,外部中断将 CPU 唤醒,LED 灯亮灭反转,串口输出调试信息,单片机退出浅度睡眠模式;这里,正如我们上文所说,睡眠后无法重新连接到 REPL ,重新初始化后与电脑会产生通信问题。

下面我们使用 USB 功率计连接到风雅一号板-通用兼容扩展板树莓派 Pico 的 USB 接口,对比两个模式下功耗:

5.png

posted @ 2026-09-02 18:43  FreakStudio  阅读(8)  评论(0)    收藏  举报