Files

151 lines
5.1 KiB
Lua
Raw Permalink Normal View History

2026-03-31 15:46:04 +08:00
--- 模块功能GPIO 功能配置包括输入输出IO和上升下降沿中断IO
-- @module pins
-- @author openLuat
-- @license MIT
-- @copyright openLuat
-- @release 2017.09.23 11:34
require "sys"
module(..., package.seeall)
local interruptCallbacks = {}
local dirs = {}
--- 配置GPIO模式
-- @number pin GPIOID
-- GPIO 0到GPIO 31表示为pio.P0_0到pio.P0_31
-- GPIO 32到GPIO XX表示为pio.P1_0到pio.P1_(XX-32)例如GPIO33 表示为pio.P1_1
-- GPIO 64到GPIO XX表示为pio.P2_0到pio.P2_(XX-64)例如GPIO65 表示为pio.P2_1
-- @param val number、nil或者function类型
-- 配置为输出模式时为number类型表示默认电平0是低电平1是高电平
-- 配置为输入模式时为nil
-- 配置为中断模式时为function类型表示中断处理函数
-- @param pull numberpio.PULLUP上拉模式。pio.PULLDOWN下拉模式。pio.NOPULL高阻态
-- 如果没有设置此参数,默认的上下拉参考模块的硬件设计说明书
-- @return function
-- 配置为输出模式时返回的函数可以设置IO的电平
-- 配置为输入或者中断模式时返回的函数可以实时获取IO的电平
-- @usage setOutputFnc = pins.setup(pio.P1_1,0)配置GPIO 33输出模式默认输出低电平
--执行setOutputFnc(0)可输出低电平执行setOutputFnc(1)可输出高电平
-- @usage getInputFnc = pins.setup(pio.P1_1,intFnc)配置GPIO33中断模式
-- 产生中断时自动调用intFnc(msg)函数上升沿中断时msg为cpu.INT_GPIO_POSEDGE下降沿中断时msg为cpu.INT_GPIO_NEGEDGE
-- 执行getInputFnc()即可获得当前电平如果是低电平getInputFnc()返回0如果是高电平getInputFnc()返回1
-- @usage getInputFnc = pins.setup(pio.P1_1),配置GPIO33输入模式
--执行getInputFnc()即可获得当前电平如果是低电平getInputFnc()返回0如果是高电平getInputFnc()返回1
-- @usage
--有些GPIO需要打开对应的ldo电压域之后才能正常配置工作电压域和对应的GPIO关系如下
--pmd.ldoset(x,pmd.LDO_VSIM1) -- GPIO 29、30、31
--pmd.ldoset(x,pmd.LDO_VLCD) -- GPIO 0、1、2、3、4
--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
--除了上面列举出的GPIO外其余的GPIO不需要打开特定的电压域可以直接配置工作
function setup(pin, val, pull)
-- 关闭该IO
pio.pin.close(pin)
-- 中断模式配置
if type(val) == "function" then
pio.pin.setdir(pio.INT, pin)
if pull then pio.pin.setpull(pull or pio.PULLUP, pin) end
--注册引脚中断的处理函数
interruptCallbacks[pin] = val
dirs[pin] = false
return function()
return pio.pin.getval(pin)
end
end
-- 输出模式初始化默认配置
if val ~= nil then
dirs[pin] = true
pio.pin.setdir(val == 1 and pio.OUTPUT1 or pio.OUTPUT, pin)
else
-- 输入模式初始化默认配置
dirs[pin] = false
pio.pin.setdir(pio.INPUT, pin)
if pull then pio.pin.setpull(pull or pio.PULLUP, pin) end
end
-- 返回一个自动切换输入输出模式的函数
return function(val)
val = tonumber(val)
if (not val and dirs[pin]) or (val and not dirs[pin]) then
pio.pin.close(pin)
pio.pin.setdir(val and (val == 1 and pio.OUTPUT1 or pio.OUTPUT) or pio.INPUT, pin)
if not val and pull then pio.pin.setpull(pull or pio.PULLUP, pin) end
dirs[pin] = val and true or false
return val or pio.pin.getval(pin)
end
if val then
pio.pin.setval(val, pin)
return val
else
return pio.pin.getval(pin)
end
end
end
--- 关闭GPIO模式
-- @number pin GPIOID
--
-- GPIO 0到GPIO 31表示为pio.P0_0到pio.P0_31
--
-- GPIO 32到GPIO XX表示为pio.P1_0到pio.P1_(XX-32)例如GPIO33 表示为pio.P1_1
-- @usage pins.close(pio.P1_1)关闭GPIO33
function close(pin)
pio.pin.close(pin)
end
rtos.on(rtos.MSG_INT, function(msg)
if interruptCallbacks[msg.int_resnum] == nil then
log.warn('pins.rtos.on', 'warning:rtos.MSG_INT callback nil', msg.int_resnum)
return
end
interruptCallbacks[msg.int_resnum](msg.int_id)
end)
-- 795io引脚复用 宏
IOMUX_GPIO0 = 0
IOMUX_GPIO1 = 1
IOMUX_GPIO2 = 2
IOMUX_GPIO3 = 3
IOMUX_GPIO4 = 4
IOMUX_GPIO5 = 5
IOMUX_GPIO8 = 8
IOMUX_GPIO9 = 9
IOMUX_GPIO10 = 10
IOMUX_GPIO11 = 11
IOMUX_GPIO12 = 12
IOMUX_GPIO13 = 13
IOMUX_GPIO14 = 14
IOMUX_GPIO15 = 15
IOMUX_GPIO18 = 18
IOMUX_GPIO19 = 19
IOMUX_GPIO20 = 20
IOMUX_GPIO21 = 21
IOMUX_GPIO22 = 22
IOMUX_GPIO23 = 23
IOMUX_GPIO29 = 29
IOMUX_GPIO30 = 30
IOMUX_GPIO31 = 31
IOMUX_USART_1 = 57
IOMUX_USART_2 = 58
IOMUX_USART_3 = 59
IOMUX_I2C_2 = 67
IOMUX_I2C_3 = 68