Files
BR_YKC/4G/code/lib/pins.lua
2026-03-31 15:46:04 +08:00

151 lines
5.1 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
--- 模块功能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