一. GPIO
1. 创建gpio对象
from machine import Pin
gpio = Pin(GPIOn, direction, pullMode, level)
参数:
- GPIOn: 引脚号 int类型
EC600SCN/EC600NCN平台引脚对应关系如下(引脚号为模块外部引脚编号):
GPIO1 – 引脚号10
GPIO2 – 引脚号11
GPIO3 – 引脚号12
GPIO4 – 引脚号13
GPIO5 – 引脚号14
GPIO6 – 引脚号15
GPIO7 – 引脚号16
GPIO8 – 引脚号39
GPIO9 – 引脚号40
GPIO10 – 引脚号48
GPIO11 – 引脚号58
GPIO12 – 引脚号59
GPIO13 – 引脚号60
GPIO14 – 引脚号61
GPIO15 – 引脚号62
GPIO16 – 引脚号63
GPIO17 – 引脚号69
GPIO18 – 引脚号70
GPIO19 – 引脚号1
GPIO20 – 引脚号3
GPIO21 – 引脚号49
GPIO22 – 引脚号50
GPIO23 – 引脚号51
GPIO24 – 引脚号52
GPIO25 – 引脚号53
GPIO26 – 引脚号54
GPIO27 – 引脚号55
GPIO28 – 引脚号56
GPIO29 – 引脚号57
- direction : IN – 输入模式,OUT – 输出模式
- pullMode : 输入输出模式
PULL_DISABLE – 浮空模式
PULL_PU – 上拉模式
PULL_PD – 下拉模式
- level : 0 - 设置引脚为低电平, 1- 设置引脚为高电平
关于GPIO我想多说一下:
我使用如下语句打印了一下Pin对象
from machine import Pin
print(dir(Pin))
发现和官方文档描述不一致, 让我不知所措😱😱😱, 为什么没有21~29引脚呢? 难道我固件下错了? 难道是这些引脚有其它默认用途??
2. 读取引脚电平
Pin.read()
参数:
无返回值
PIN脚电平,0-低电平,1-高电平。
3.设置引脚高低电平
Pin.write(value)
参数:
- value int 0 - 当PIN脚为输出模式时,设置当前PIN脚输出低;1 - 当PIN脚为输出模式时,设置当前PIN脚输出高
返回值
设置成功返回整型值0,设置失败返回整型值-1。
4. 举例: LED闪烁
为了防止死循环无法跳出,我都用固定次数的循环代替while True
from machine import Pin # 导入Pin模块
import utime # 导入utime模块led = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_DISABLE, 0) # GPIO11配置成输出模式,默认输出0
for i in range(30):led.write(0 if led.read() else 1) #用read读取led的状态,然后取反utime.sleep(1)
5. 举例2: 按键亮灯灭灯
KEY1亮灭灯,KEY2结束程序
from machine import Pin # 导入Pin模块
import utime # 导入utime模块key1_pin = Pin.GPIO13
led1_pin = Pin.GPIO11
key2_pin = Pin.GPIO12 #用来打破while省的我重新烧固件 led = Pin(led1_pin, Pin.OUT, Pin.PULL_DISABLE, 0)
key1 = Pin(key1_pin, Pin.IN, Pin.PULL_PU, 1)
key2 = Pin(key2_pin, Pin.IN, Pin.PULL_PU, 1)ledflag = True
while key2.read():if not key1.read():utime.sleep_ms(50)if not key1.read():ledflag = not ledflagwhile not key1.read():passled.write(ledflag)utime.sleep_ms(10)print("end")
二. 外部中断
EC600 14个 外部中断引脚。 从GPIO1~GPIO14
EC600SCN平台引脚对应关系如下(引脚号为模块外部引脚编号):
GPIO1 – 引脚号10
GPIO2 – 引脚号11
GPIO3 – 引脚号12
GPIO4 – 引脚号13
GPIO5 – 引脚号14
GPIO6 – 引脚号15
GPIO7 – 引脚号16
GPIO8 – 引脚号39
GPIO9 – 引脚号40
GPIO10 – 引脚号48
GPIO11 – 引脚号58
GPIO12 – 引脚号59
GPIO13 – 引脚号60
GPIO14 – 引脚号61
1. 创建中断
from machine import ExtInt
extint = ExtInt(GPIOn, mode, pull, callback)
参数:
- GPIOn: 引脚号 int类型
- mode : 设置触发方式:
IRQ_RISING – 上升沿触发
IRQ_FALLING – 下降沿触发
IRQ_RISING_FALLING – 上升和下降沿触发 - pull : 初始上下拉
PULL_DISABLE – 浮空模式
PULL_PU – 上拉模式
PULL_PD – 下拉模式 - callback: 中断触发回调函数
2. 使能extint对象外部中断
extint.enable()
参数
无返回值
成功返回整型0,失败返回整型-1。
3. 禁用与extint对象关联的中断
extint.disable()
参数
无返回值
成功返回整型0,失败返回整型-1。
4. 返回引脚映射的行号
extint.line()
参数
无返回值
引脚映射的行号。
举例: 中断点灯
from machine import ExtInt,PinledFlag = False
key2 = Pin(Pin.GPIO12, Pin.IN, Pin.PULL_PU, 1)
led = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PU, 0)
def key1_callback(args):global ledFlagledFlag = not ledFlagprint(args)print("switch led to:" , ledFlag)led.write(ledFlag)key1 = ExtInt(ExtInt.GPIO13, ExtInt.IRQ_FALLING, ExtInt.PULL_PU, key1_callback)
key1.enable()
while key2.read():pass
三. PWM
EC600SCN平台,支持PWM0-PWM3,对应引脚如下:
PWM0 – 引脚号52
PWM1 – 引脚号53
PWM2 – 引脚号70
PWM3 – 引脚号69
1. 创建一个pwm对象
from misc import PWM
pwm = PWM(PWM.PWMn,PWM.ABOVE_xx, highTime, cycleTime)
参数:
2. 开启PWM输出
pwm.open()
参数
无返回值
成功返回整型0,失败返回整型-1。
3. 关闭PWM输出
pwm.close()
参数
无返回值
成功返回整型0,失败返回整型-1。
4. 举例: 呼吸灯
这个PWM 😂😂, 没用调节占空比的API, 如果我们要做呼吸灯, 只能不断地实例化PWM类😂😂
from misc import PWM
import utimeduty = 1for i in range(10):for i in range(1, 101):duty = ipwm = PWM(PWM.PWM0, PWM.ABOVE_10US, duty, 100)pwm.open()utime.sleep_ms(20)print(duty)for i in range(100, 0,-1):duty = ipwm = PWM(PWM.PWM0, PWM.ABOVE_10US, duty, 100)pwm.open()utime.sleep_ms(20)print(duty)
pwm.close()
四. ADC
EC600S平台支持ADC0,ADC1,对应引脚如下
ADC0 – 引脚号19
ADC1 – 引脚号20
1. 实例化一个ADC对象
from misc import ADC
adc = ADC()
2. 打开adc
adc.open()
参数
无返回值
成功返回整型0,失败返回整型-1。
3. 读取指定通道的电压值,单位mV
adc.read(ADCn)
参数
- ADCn : ADC0 – 引脚号19 ADC1 – 引脚号20
这里我要说一下,官方手册表明两个ADC,但我板子上有4个ADC(ADC0~3), 我看了EC600S的手册的确是2个ADC,可能是开发板为EC600U预留的
返回值
成功返回指定通道电压值,错误返回整型-1。
3. 关闭ADC
adc.close()
参数
无返回值
成功返回整型0,失败返回整型-1。
4. 举例 读取输入电压
from misc import ADC
import utime
adc = ADC()for i in range(25):print("reading ADC :",adc.read(ADC.ADC0)/1000,"V")utime.sleep(1)
五. UART
1. 实例化UART对象
from machine import UART
uart1 = UART(UART.UART1, 115200, 8, 0, 1, 0)
参数:
2. 接收缓存器中有多少字节的数据未读
uart.any()
参数
无返回值
返回接收缓存器中有多少字节的数据未读。
3. 从串口读取数据
uart.read(nbytes)
参数
- nbytes : 要读取的字节数
返回值
返回读取的数据。
4. 发送数据到串口。
uart.write(data)
参数
- data: string类型. 发送的数据
返回值
返回发送的字节数。
5. 关闭串口
uart.close()
参数
无返回值
成功返回整型0,失败返回整型-1。
6. 举例: 串口收发
这里, 我们使用Main串口,标号UART.UART2 , 但是注意在开发板上这个Main串口竟然是RXD1 TXD1,不要想当然弄错了 😂😂😂
from machine import UART
from machine import Pin key2 = Pin(Pin.GPIO12, Pin.IN, Pin.PULL_PU, 1)
uart = UART(UART.UART2, 115200, 8, 0, 1, 0)while key2.read():msgLen = uart.any()if msgLen:msg = uart.read(msgLen)utf8_msg = msg.decode()print(utf8_msg)uart.write('rev msg and send back: ')uart.write(utf8_msg)