手把手教你写可复用的 Picolightsleep代码,附串口调试与功耗优化
这里,我们使用 machine.lightsleep() 进入浅度睡眠模式,在进入睡眠模式时可以指定睡眠时间,从而达到更好的功耗优化;我们使用树莓派 Pico 的 GP22 引脚连接按键,设置 GP22 为下边沿触发,按键按下即可唤醒 CPU;使用串口外设来输出调试信息。
在进行浅度睡眠模式实验前,我们首先需要将 MiniUSB 数据线连接到风雅一号板-通用兼容扩展板上的串口,这里,GP0 和 GP1 是树莓派 Pico 的硬件串口 UART0 的默认引脚:

插入后实物图如下:
这里,在风雅一号板-通用兼容扩展板上我们使用树莓派 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: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")
烧录代码,连接远程终端,输出如下:


可以看到,当我们按下按键时,外部中断将 CPU 唤醒,LED 灯亮灭反转,串口输出调试信息,单片机退出浅度睡眠模式;这里,正如我们上文所说,睡眠后无法重新连接到 REPL ,重新初始化后与电脑会产生通信问题。
下面我们使用 USB 功率计连接到风雅一号板-通用兼容扩展板树莓派 Pico 的 USB 接口,对比两个模式下功耗:


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