Luat实例教程:gpio
本示例实现的功能是:IO输入输出以及串口中断回调函数的使用
1.在编辑工具建立一个test.lua的文件(不一定叫这个名字,用户可以自己随便取名)
2.设置本文件被全体可见。也就意味着,一旦test被某一文件加载,则test在任何文件中均可被看见,即test中全局变量和函数均可被任何文件调用。
module(...,package.seeall)
3.test文件头需要 require "pins" 模块。加载后,就可以调用pins.lua库文件中的全局变量和函数了,调用形式为pins变量 以及sms.函数。
require "pins"
4.定义print函数,调试用
local function print(...)
_G.print("test",...)
end
5.定义PIN脚
pin值定义如下:
Air200:
- pio.P0_0 - pio.P0_31表示GPIO_0 - GPIO_31
- pio.P1_0 - pio.P1_9 表示 GPO_0 - GPO_9
其他模块:
- pio.P0_XX:表示GPIOXX,例如pio.P0_15,表示GPIO15
- pio.P1_XX:表示GPIO(XX+32),例如pio.P1_8,表示GPIO40
注:GPIO号大于等于32的,请用P1。例如,GPIO32,设置为pio.P1_0
dir值定义如下(默认值为pio.OUTPUT):
- pio.OUTPUT:表示输出,初始化是输出低电平
- pio.OUTPUT1:表示输出,初始化是输出高电平
- pio.INPUT:表示输入,需要轮询输入的电平状态
- pio.INT:表示中断,电平状态发生变化时会上报消息,进入本模块的intmsg函数
valid值定义如下(默认值为1):
- valid的值跟pins.lua库文件中的set、get接口配合使用
- dir为输出时,配合set接口使用,set的第一个参数如果为true,则会输出valid值表示的电平,0表示低电平,1表示高电平
- dir为输入或中断时,配合get接口使用,如果引脚的电平和valid的值一致,get接口返回true;否则返回false
- dir为中断时,cb为中断引脚的回调函数,有中断产生时,如果配置了cb,会调用cb,如果产生中断的电平和valid的值相同,则cb(true),否则cb(false)
--[[
GPIO54,等价于PIN31 = {pin=pio.P1_22,dir=pio.OUTPUT,valid=1}
配置为输出,初始化输出低电平;valid=1,调用set(true,PIN31),则输出高电平,调用set(false,PIN31),则输出低电平。
]]
PIN31 = {pin=pio.P1_22}
--[[
GPIO55;配置为输出,初始化输出高电平;valid=0,调用set(true,PIN23),则输出低电平,调用set(false,PIN23),则输出高电平
]]
PIN32 = {pin=pio.P1_23,dir=pio.OUTPUT1,valid=0}
--[[
第25个引脚:GPIO6;配置为中断;valid=1。intcb表示中断管脚的中断处理函数,产生中断时,如果为高电平,则回调intcb(true);如果为低电平,则回调intcb(false)。调用get(PIN5)时,如果为高电平,则返回true;如果为低电平,则返回false
]]
PIN25 = {name="PIN25",pin=pio.P1_4,dir=pio.INT,vaild=1,intcb=pin25cb}
6.pins.reg函数的作用是:注册一个或者多个PIN脚的配置,并且初始化PIN脚
pins.reg(PIN22,PIN23,PIN5)
7.PIN5的中断使用方法。
PIN5是中断GPIO脚,由于在pins.lua中已经用sys.regmsg(rtos.MSG_INT,intmsg)注册了中断处理程序。PIN5发生中断时,底层会自动感知,并抛出中断消息rtos.MSG_INT,
此时会执行intmsg,而intmsg中会执行pin5定义表中的回调函数pin5cb。
如果我们在pin5cb中打印一些东西,就可以测试我们的中断脚是否起作用了。
local function pin25cb(v)
print("pin25cd",v)
end
8.普通GPIO脚的使用
--这段代码的作用是:启动1秒的循环定时器,设置PIN22引脚的输出电平,1秒反转一次
local pin31flg = true
local function pin31set()
pins.set(pin31flg,pincfg.PIN31)
pin31flg = not pin31flg
end
sys.timer_loop_start(pin31set,1000)
9.在编辑工具中建立一个名为main.lua的文件。lua脚本的执行从main.lua开始,main.lua是入口文件(注意:main.lua只能有一个)。在main.lua中把test加载进去就好了。sys.init()是对系统初始化,sys.run()是系统主程序。这两句必须有。
--重要提醒:必须在这个位置定义MODULE_TYPE、PROJECT和VERSION变量
--MODULE_TYPE:模块型号,目前仅支持Air201、Air202、Air800
--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
MODULE_TYPE = "Air202"
PROJECT = "GPIO_SINGLE"
VERSION = "1.0.0"
require"sys"
require"test"
if MODULE_TYPE=="Air201" then
require"wdt"
end
sys.init(0,0)
sys.run()
!!!attention
一个工程只有一个main.lua
- IO输出高电平是2.8V,因为IO电压域是VDDIO,VDDIO是2.8V。
- 函数的调用通过定时器的回调函数实现。
- 完整代码见下链接