单片机最直接的与外界沟通的方式的就是GPIO了:引脚输入获取用户按键、传感器状态;引脚输出控制继电器、执行开关。没有比这个再直接的了。
MCUSH的交互终端是通过“gpio”命令来控制的,先看看用法帮助:
=>gpio --help
usage: gpio [--loop[=]] [-p ] [--input[=]]
[--output[=]] [--set[=]] [--clr[=]]
[--toggle[=]] [-n] [-U] [-D]
options:
-l/--loop default 1000ms
-p/--port port[.bit] name, eg 0[.0]
-i/--input set input mode mask
-o/--output set output mode mask
-s/--set set output high mask
-c/--clr set output low mask
-t/--toggle toggle output mask
-n/--number query
-U/--pullup with pullup resister
-D/--pulldown with pulldown resister
=>
首先要说明,不同单片机端口命名方式是不同的,有用数字编号,有用字母编号(如STM32),这里统一换成用数字编号(PA对应P0,PB对应P1……)。
假设PA0连接1个用户按键(接了上拉电阻,按下低电平,松开高电平),PA1连接1个继电器控制端(输出高电平继电器动作),那么按键的检测命令是:
=>gpio -p0.0 -i
=>gpio -p0.0
1
=>
先通过“-i”参数将PA0端口设置成输入模式,第二行无任何参数,则返回这个引脚状态:1表示高电平(按键松开)。
继电器的输出控制命令是:
=>gpio -p0.1 -o -c
=>gpio -p0.1 -s
=>
“-o”参数将引脚PA1设置成输出模式,同时“-c”设置低电平。第二行“-s”参数设置高电平(继电器动作)。
通常一个端口会有多个引脚,怎样一起控制呢?假设PE口的16个引脚分别接了16个LED灯(高电平输出点亮),将它们同时点亮:
=>gpio -p4 -o 0xFFFF -s 0xFFFF
=>
如果这16个端口分别接了16个上拉的按键,同时检测它们的状态:
=>gpio -p4 -i 0xFFFF
=>gpio -p
0x0000FFFF
=>
下面再用Python演绎一遍,让PA1的继电器和PA0的按键联动(注意PA1输出与PA0输入是电平翻转的):
from mcush import *
m=Mcush.Mcush('/dev/ttyUSB0')
m.pinInput('0.0')
m.pinOutputLow('0.1')
while True:
m.pinSetVal('0.1', m.pinIsLow('0.0'))
控制IO就是这么简单,知道之前提到的循环开关机测试实验怎么写了吧?
最后写个流水灯结束本篇,下一篇讲讲蜂鸣器控制。
import time
from mcush import *
m=Mcush.Mcush('/dev/ttyUSB0')
m.gpio('4',o=0xFFFF,c=0xFFFF)
output=0x00FF
while True:
print( hex(output) )
m.gpio('4',s=output, c=(~output)&0xFFFF)
time.sleep(0.5)
output=output<<1
if output & 0x10000:
output = (output & 0xFFFF) | 0x0001