加载中…
正文 字体大小:

Luat实例教程:gpio

(2018-03-25 10:04:04)
分类: GPRS模块

本示例实现的功能是: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。
  • 函数的调用通过定时器的回调函数实现。
  • 完整代码见下链接

0

阅读 评论 收藏 转载 喜欢 打印举报
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有