2、合宙 724UG 模块GPIO学习
一、需要准备
硬件设计手册 724UG开发板原理图
二、GPIO配置讲解
打开官方API手册找到对应的家接口文档,里面提供了很多api接口根据自己需求观看,我看的是4G的luat API接口
找到pins API接口函数里面有关于GPIO的配置
pins.setup函数有三个参数,根据GPIO配置输入与输出,
1、输出模式
假如我们要将GPIO 4设置为输出,只需要
定义一个变量
local setGPIO=pins.setup(4,0)–设置IO4为输出,电平为低
也可以写成local setGPIO=pins.setup(pio.P0_4,0)
可以通过setGPIO()设置IO4的高低电平
如setGPIO(1),设置GPIO4为高,setGPIO(0)为低
2、输入模式
假设设置GPIO7为输入模式,只需要
随意定义一个变量,如
local getGPIO7=pins.setup(7)–配置GPIO7,输入模式,
可以通过getGPIO7()获取IO的电平为0还是1
3、中断模式
假设设置GPIO7为中断模式,只需要
随意定义一个变量,如
local getGPIO7=pins.setup(7,interrupt_re)–配置GPIO7,输入模式,interrupt_re为中断处理函数,中断处理函数随便写
如下
function interrupt_re(msg)
if msg==cpu.INT_GPIO_POSEDGE then
--如果当前上升沿中断执行IF语句里的
else
--下降沿中断执行else里的
end
end
local getGPio=pins.setup(7,interrupt_re)
也可以通过getGPIO7()获取IO的电平为0还是1
三、代码示例
3.1输出模式演示
首先查看724UG 开发板的原理图
在使用GPIO时要用到官方给的电压管理接口API,设置IO电压
有些GPIO需要打开对应的ldo电压域才能正常工作,电压域和对应的GPIO关系如下
pmd.ldoset(x,pmd.LDO_VSIM2) – GPIO 29、30、31 --目前core版本还不支持
pmd.ldoset(x,pmd.LDO_VLCD) – GPIO 0、1、2、3、4、6 --目前core版本,x还控制不了不同等级的电压,都是1.8V
pmd.ldoset(x,pmd.LDO_VMMC) – GPIO 24、25、26、27、28
x=0时:关闭LDO
x=1时:LDO输出1.716V
x=2时:LDO输出1.828V
x=3时:LDO输出1.939V
x=4时:LDO输出2.051V
x=5时:LDO输出2.162V
x=6时:LDO输出2.271V
x=7时:LDO输出2.375V
x=8时:LDO输出2.493V
x=9时:LDO输出2.607V
x=10时:LDO输出2.719V
x=11时:LDO输出2.831V
x=12时:LDO输出2.942V
x=13时:LDO输出3.054V
x=14时:LDO输出3.165V
x=15时:LDO输出3.177V
我们来控制IO1和IO4来,控制724 开发板上的绿灯和蓝灯
让他们交替闪烁,绿灯亮1s后,蓝灯亮1s,由上可知电压设置为pmd.ldoset(1, pmd.LDO_VLCD)就行了
代码如下
--必须在这个位置定义PROJECT和VERSION变量
--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
PROJECT = "GPIO_OUT"
VERSION = "0.0.1"
require "sys"
--加载日志功能模块,并且设置日志输出等级
--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
require "log"
require "pins"
LOG_LEVEL = log.LOGLEVEL_TRACE
pmd.ldoset(1, pmd.LDO_VLCD)--电压域
local blue_flag,green_flag=0,1
local function task1()
local setGpio4= pins.setup(4, 0)--设置GPIO 4为输出,默认低电平
local setGpio1= pins.setup(1, 0)--设置GPIO 1为输出,默认低电平
while true do
blue_flag= blue_flag==0 and 1 or 0--三目运算符 if(flag==0)then flag=1 else flag=0
green_flag=green_flag==1 and 0 or 1
setGpio4(blue_flag) --设置GPIO电平
setGpio1(green_flag)
print("IO4:",blue_flag,"IO1",green_flag)--打印IO的电平
sys.wait(1000)--sys.wait(ms)任务延时函数
end
end
--启动系统框架,下面不要随便动
sys.taskInit(task1)--创建一个任务
sys.init(0, 0)
sys.run()
串口显示为如上
3.2 输入模式
就用GPIO7了,
通过设置GPIO7为输出,检查GPIO7电平变换控制两个LED,如果为高电平蓝灯亮,低电平绿灯亮
代码如下
--必须在这个位置定义PROJECT和VERSION变量
--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
PROJECT = "GPIO_OUT"
VERSION = "0.0.1"
require "sys"
--加载日志功能模块,并且设置日志输出等级
--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
require "log"
require "pins"
require "bit"
LOG_LEVEL = log.LOGLEVEL_TRACE
pmd.ldoset(1, pmd.LDO_VLCD)
local setGpio4 = pins.setup(4, 0)--设置GPIO 4为输出,默认低电平
local setGpio1 = pins.setup(1, 0)--设置GPIO 1为输出,默认低电平
local getGpio7 = pins.setup(7)--默认下拉
local function task1()
while true do
if (getGpio7() == 1) then
setGpio4(1)--设置GPIO4 为1
setGpio1(0)--设置IO1 为0
else
setGpio1(1)--设置GPIO1 为1
setGpio4(0)--设置GPIO4 为0
end
print("IO7:", getGpio7())--打印IO的电平
sys.wait(500)--延时500ms
end
end
--启动系统框架,下面不要随便动
sys.taskInit(task1)--创建一个任务
sys.init(0, 0)
sys.run()
此时GPIO7为0,绿灯亮
将GPIO7接到4V,此时蓝灯亮
串口显示如下
3.3中断模式
通过设置GPIO7为中断模式,通过中断处理函数控制两个LED,如果为上升沿中断蓝灯亮,下降沿中断绿灯亮
代码如下
--必须在这个位置定义PROJECT和VERSION变量
--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
PROJECT = "GPIO_OUT"
VERSION = "0.0.1"
require "sys"
--加载日志功能模块,并且设置日志输出等级
--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
require "log"
require "pins"
require "bit"
LOG_LEVEL = log.LOGLEVEL_TRACE
pmd.ldoset(1, pmd.LDO_VLCD)
local setGpio4 = pins.setup(4, 0)--设置GPIO 4为输出,默认低电平
local setGpio1 = pins.setup(1, 1)--设置GPIO 1为输出,默认低电平
function Interrupt_re(msg)
if (msg == cpu.INT_GPIO_POSEDGE) then
setGpio4(1)--设置GPIO4 为1
setGpio1(0)--设置IO1 为0
print("BLUE", "ON", "GREEN", "OFF")
else
setGpio1(1)--设置GPIO1 为1
setGpio4(0)--设置GPIO4 为0
print("BLUE", "OFF", "GREEN", "ON")
end
end
local function task1()
local getGpio7 = pins.setup(7, Interrupt_re)--设置GPIO7为中断模式
end
--启动系统框架,下面不要随便动
sys.taskInit(task1)--创建一个任务
sys.init(0, 0)
sys.run()
效果串口测试