上学期末做项目,要用到下位机实现底层的硬件控制。然而STM32板子价格疯涨。看着本来十几块的小板子一下子涨到近40块,这个功能相似的树莓派pico板子倒被我看上了。虽然最后为了求稳,我还是用了STM32板子,不过借着这个机会我也成功搞来了几块pico玩。
网上关于pico的教程十分少且碎,我只能看官方文档慢慢学。目前笔记也不很全、甚至可以说有些乱,但说不定可以帮后来人尽快地上手。
目录
上电刷机
挺简单的,按住BOOTSET键用microUSB连电脑,之后就可以用uf2程序以文件复制的方式刷机了。
MicroPython的uf2文件可以从这里下载:microPython环境
而对于C/C++而言,需要编译出uf2文件,然后如上烧进板子中。
管脚图
MicroPython控制
machine
模块
machine.Pin
GPIO类。通过类似下面的代码可以实现对GPIO的操作。
switch = Pin(0, Pin.IN, Pin.PULL_DOWN) # 设置下拉输入
trigger = Pin(1, Pin.IN, Pin.PULL_UP) # 设置上拉输入
led = Pin(25, Pin.OUT) # 板载LED为25号GP
state = 0
def change():
global state
state = 1-state
def setLED(pin): # 中断处理函数,接收一个参数为触发者的Pin对象
led.value(state)
# 无参数时,value()返回引脚的值
# 有参数时,value(i)设置引脚值为i
trigger.irq(setLED, Pin.IRQ_FALLING) # 设置下降沿触发中断
while True:
if switch.value(): # 如果为高电平
change()
while switch.value():
pass # 在降回低电平之前,等待
引脚设置相当方便~
初始化:
初始化需要至少指定GP引脚,GP对应的物理引脚见上图。同时要指定I/O,若未指定,则引脚默认置0。
p1 = Pin(0)
p2 = Pin(1, Pin.IN)
p3 = Pin(2, Pin.OUT)
指定为OUT时,引脚初始为低电平,可以使用high()
函数或on()
函数来置位、用low()
函数或off()
函数来复位、用value(v)
函数来直接指定值、用toggle()
函数来反转高低电平。此时,还可以用value()
函数来查询引脚的电平高低。具体可以看下面两节。
指定为IN时,引脚初始电平为初始化时所处电平,但可以指定上拉输入和下拉输入:
p4 = Pin(3, Pin.IN, Pin.PULL_UP)
p5 = Pin(4, Pin.IN, Pin.PULL_DOWN)
此时,high()
、low()
、on()
、off()
、toggle()
和value(v)
都可以顺利调用但不会生效。使用value()
函数可以正常查询引脚电平。
除了默认的初始化,还可以使用重初始化函数init()
,除了无需设置引脚,其他同上。
设置引脚电平:
仅能对OUT GP设置。高电平为3V3。
使用high()
、on()
、value(1)
来置位,即将引脚电平置高;使用low()
、off()
、value(0)
来复位,即将引脚电平置低;使用toggle()
来反转高低。
led = Pin(25, Pin.OUT)
led.high()
sleep(2)
led.low()
sleep(3)
while True:
led.toggle()
sleep(0.5)
读取引脚电平:
对各类GP,皆可读取。
使用value()
来读取,高电平返回1,低电平返回0。
led = Pin(25, Pin.OUT)
button = Pin(0, Pin.IN, Pin.PULL_DOWN)
while True:
led.value(button.value())
设置/查询中断:
对各类GP皆可设置中断。
使用irq(func[, flag])
函数来设置。第一个参数指定中断触发调用的函数,函数须有一个参数,用来接收触发中断的Pin对象。第二个参数可选,用来指定上升沿/下降沿触发,默认为IRQ_FALLING | IRQ_RISING
,即电平任意变化触发。
函数会返回GP的irq
对象。它的flags()
方法可以查询当前触发状态,未触发则为0,否则为IRQ_FALLING
或IRQ_RISING
之一。它的trigger()
方法返回中断种类,未设置中断则为0,否则为IRQ_FALLING
、IRQ_RISING
或IRQ_FALLING | IRQ_RISING
之一。
无参数调用irq()
则只会返回GP的irq
对象。
button = Pin(0, Pin.IN, Pin.PULL_UP)
def handler(pin):
print('I am pulled down.' if pin.irq().flags() == Pin.IRQ_FALLING else 'I am pulled up.')
button.irq(handler)
machine.PWM
直接上官方例程吧,因为挺简单的。
官方例程:
# Example using PWM to fade an LED.