目录
K210芯片上IO口
板子上的引脚
如何理解【引脚]映射[内部功能]?
fpioa_manage 类
1、register(pin, func, force=True)
2、unregister(pin) 介绍
3、get_pin_by_function(pin)
4、 get_gpio_used()
FPIOA类介绍
1、set_function(pin, func)函数
2、get_Pin_num(func)
默认对应关系
映射的主要程序
附 片内外设表
兄弟们,向入门K210,看我这个文章一定让你受益匪浅,和传统的开发模式又有很大的不同,甚至和OpenMv也不也一样,当然规则是一样的,就是GPIO的使用方法不一样。我的板子是MAIX DOCK开发板。大家注意引脚
这仅仅是芯片上的接口,并不是引出来的焊接在板子上的IO的名字。相对于K210芯片上共有32+8个GPIO。就是我们软件可以直接控制,这40个引脚输入输出。如果想外接设备,那就得用到板子上的引脚,和K210芯片引脚不是一一对应的,需要用软件挂载上去,才能使用板子上的某个引脚。举个例子,有两列人,一列是男人,一列是女人,男人代表板子上的引脚,女人代表K210芯片上的引脚,我们可以通过软件控制女人去随便选择一个男人,这样这个男人才有用,做出相对应的功能。这个也叫引脚映射内部功能。
General Purpose Input Output (通用输入/输出)简称为 GPIO,或总线扩展器。
K210上有高速 GPIO(GPIOHS) 和通用 GPIO
在 K210 上, GPIO 有以下特征:
32个高速 GPIO:
高速 GPIO 为 GPIOHS,共 32 个。具有如下特点:
8个通用 GPIO:
通用 GPIO 共 8 个,具有如下特点:
可以看原理图,这是板子上的引脚,需要挂载芯片上的引脚,才能发挥特定的功能。数数是20+20+18+18 = 78 个引脚。这个板子把所有的引脚的都引出来了,包括LCD屏的8080口,所以有些引脚并不能用,例如LCD_D0~LCD_D7,DVP_D0~DVP_D7。上面写着IO0~IO47,这些都是好使的,但是也有几个特殊的,IO36~IO47,这几个都是控制LCD和DVP的,也别用。
K210 芯片上的 外部引脚 和 内部功能 是彼此独立的,引脚是指从芯片上引出的许多金属触点,也就是我们俗称的功能引脚,它可以是 GPIO / PWM / ADC / I2C 等内部功能引脚,传统的认知是引脚对应的内部功能是不可改变的,但可以复用的,而 K210 是可以通过映射来改变引脚功能的,看如下示意图理解具体的映射功能。
接着还可以将 SPI 的 SCLK/MOSI/MISO/CS 映射(MAP)到 IO6/IO7/IO8/IO9 引脚,也就可以在此引脚上进行 SPI 的读写操作
调用 register 函数将 pin 引脚与具体的硬件功能(GPIO/I2C/UART/I2S/SPI)绑定起来,在不使用的时候调用 unregister 释放引脚所绑定的硬件功能(或称 function ),这不同于传统单片机的理解, K210 可以将一定范围内的引脚映射到具体的硬件功能。
from fpioa_manager import fm
fm.register(11, fm.fpioa.GPIO0, force=True)
fm.register(12, fm.fpioa.GPIOHS0, force=True)
fm.register(13, fm.fpioa.UART2_TX)
fm.register(14, fm.fpioa.UART2_RX)
# other code
fm.unregister(11)
fm.unregister(12)
fm.unregister(13)
fm.unregister(14)
此类可以完成引脚重映射
pin
: 功能映射引脚function
: 芯片功能force
: 强制分配,如果为True
,则可以多次对同一个引脚注册;False
则不允许同一引脚多次注册。默认为True
是为了方便IDE
多次运行程序使用设置引脚(pin)对应的外设功能(func),默认启用强制绑定参数(force=True),它将强制更换指定的引脚功能,如果发现存在上一个绑定的引脚,则会发出一个警告,但不影响代码继续执行。如果设置 force=False ,则会在 register 发现硬件功能已经被使用了,此时就会弹出异常,方便深度开发的时候不清楚 GPIO/HS 的分配情况,常见于运行某个代码的按键在访问某些功能的时候不能使用了的场合。
使用方法
from fpioa_manager import fm
fm.register(16, fm.fpioa.GPIO2)
fm.register(13, fm.fpioa.GPIO2)
fm.register(12, fm.fpioa.GPIO2, force=False)
释放引脚(pin)上的硬件功能(GPIO/I2C/SPI/I2S/UART)。
获取引脚(pin)上绑定的硬件功能。
获取所有 gpio 的使用情况,它只查询 GPIOHS / GPIO 的引脚分配情况, None 表示该硬件功能未被使用。
利用此类里面的函数,也可以设置GPIO的重映射
1、
set_function(pin, func)函数参数:
pin
: 引脚编号,取值 [0, 47], 具体的引脚连接请看电路图, 也可以使用 board_info.
然后按 TAB
按键补全来获得板子的常用引脚,比如 board_info.LED_G
func
: 外设功能,传一个整型值,可以通过 fm.fpioa.help()
或者查本页末尾的 附录: 外设表 表得到比如 需要将连接 绿色 LED
的引脚映射到 高速 GPIO0
上:
fpioa = FPIOA()
fpioa.set_function(board_info.LED_G, fm.fpioa.GPIOHS0)
参数:
func
: 外设功能,传一个整型值,可以通过 fm.fpioa.help()
或者查本页末尾的 附录: 外设表 表得到fpioa = FPIOA()
fpioa.set_function(board_info.LED_G, fm.fpioa.GPIOHS0)
pin = fpioa.get_Pin_num(fm.fpioa.GPIOHS0)
if pin == board_info.LED_G:
print("set function ok")
芯片内部引脚和外部引脚也是默认连接的,也可以重新映射。默认对应的关系是:当不做任何设置时,控制GPIOHS0位高电平,则在IO16口会出现高电平。
('fm.fpioa.GPIOHS0', IO16)
('fm.fpioa.GPIOHS1', IO17)
('fm.fpioa.GPIOHS2', IO18)
('fm.fpioa.GPIOHS3', IO19)
('fm.fpioa.GPIOHS4', IO37)
('fm.fpioa.GPIOHS5', IO38)
('fm.fpioa.GPIOHS6', IO22)
('fm.fpioa.GPIOHS7', IO23)
('fm.fpioa.GPIOHS8', IO24)
('fm.fpioa.GPIOHS9', IO25)
('fm.fpioa.GPIOHS10', None)
('fm.fpioa.GPIOHS11', IO27)
('fm.fpioa.GPIOHS12', IO28)
('fm.fpioa.GPIOHS13', IO29)
('fm.fpioa.GPIOHS14', IO30)
('fm.fpioa.GPIOHS15', IO31)
('fm.fpioa.GPIOHS16', IO32)
('fm.fpioa.GPIOHS17', IO33)
('fm.fpioa.GPIOHS18', IO34)
('fm.fpioa.GPIOHS19', IO35)
('fm.fpioa.GPIOHS20', None)
('fm.fpioa.GPIOHS21', None)
('fm.fpioa.GPIOHS22', None)
('fm.fpioa.GPIOHS23', None)
('fm.fpioa.GPIOHS24', IO40)
('fm.fpioa.GPIOHS25', IO41)
('fm.fpioa.GPIOHS26', IO42)
('fm.fpioa.GPIOHS27', IO43)
('fm.fpioa.GPIOHS28', IO44)
('fm.fpioa.GPIOHS29', IO26)
('fm.fpioa.GPIOHS30', IO46)
('fm.fpioa.GPIOHS31', IO47)
('fm.fpioa.GPIO0', IO8)
('fm.fpioa.GPIO1', IO9)
('fm.fpioa.GPIO2', None)
('fm.fpioa.GPIO3', None)
('fm.fpioa.GPIO4', IO12)
('fm.fpioa.GPIO5', IO13)
('fm.fpioa.GPIO6', IO14)
('fm.fpioa.GPIO7', IO15)
映射一共有两种方法
1、就是利用
映射到通用GPIO
from Maix import GPIO # 调用GPIO模块 ,可以直接设置通用GPIO和高速GPIO
from board import board_info # 调用板载模块,可以直接控制板子引脚
from fpioa_manager import fm # FPIOA模块,可以控制内部引脚映射到外部引脚
fm.register(board_info.LED_R,fm.fpioa.GPIO0)
fm.register(board_info.LED_R,fm.fpioa.GPIO1)
fm.register(board_info.LED_R,fm.fpioa.GPIO2)
fm.register(board_info.LED_R,fm.fpioa.GPIO3)
fm.register(board_info.LED_R,fm.fpioa.GPIO4)
fm.register(board_info.LED_R,fm.fpioa.GPIO5)
fm.register(board_info.LED_R,fm.fpioa.GPIO6)
fm.register(board_info.LED_R,fm.fpioa.GPIO7)
led_r=GPIO(GPIO.GPIO7,GPIO.OUT) # 直接控制led_r的状态,即可以控制引脚
led_r=GPIO(GPIO.GPIO7,GPIO.IN) # 设置成输入模式
led_r.value(0) # 输出低电平。
led_r.value(1) # 输出高电平。
2、利用FPIOA类配置重映射
from Maix import FPIOA
from Maix import GPIO # 调用GPIO模块 ,可以直接设置通用GPIO和高速GPIO
# 可以映射到片上外设 GPIOHS0~GPIOHS31
fpioa = FPIOA()
# 均可以
fpioa.set_function(board_info.LED_B, fm.fpioa.GPIOHS31)
# 或者
fpioa.set_function(14, fm.fpioa.GPIOHS31)# 我的LED_B在引脚14上
led_b=GPIO(GPIO.GPIOHS31,GPIO.OUT)
其余控制,和通用GPIO一致
把set_function(pin, func) 里面的func替换成任意一个外设名称均可以重映射
外设功能(func) | 简要描述 |
---|---|
JTAG_TCLK | JTAG Test Clock |
JTAG_TDI | JTAG Test Data In |
JTAG_TMS | JTAG Test Mode Select |
JTAG_TDO | JTAG Test Data Out |
SPI0_D0 | SPI0 Data 0 |
SPI0_D1 | SPI0 Data 1 |
SPI0_D2 | SPI0 Data 2 |
SPI0_D3 | SPI0 Data 3 |
SPI0_D4 | SPI0 Data 4 |
SPI0_D5 | SPI0 Data 5 |
SPI0_D6 | SPI0 Data 6 |
SPI0_D7 | SPI0 Data 7 |
SPI0_SS0 | SPI0 Chip Select 0 |
SPI0_SS1 | SPI0 Chip Select 1 |
SPI0_SS2 | SPI0 Chip Select 2 |
SPI0_SS3 | SPI0 Chip Select 3 |
SPI0_ARB | SPI0 Arbitration |
SPI0_SCLK | SPI0 Serial Clock |
UARTHS_RX | UART High speed Receiver |
UARTHS_TX | UART High speed Transmitter |
RESV6 | Reserved function |
RESV7 | Reserved function |
CLK_SPI1 | Clock SPI1 |
CLK_I2C1 | Clock I2C1 |
GPIOHS0 | GPIO High speed 0 |
GPIOHS1 | GPIO High speed 1 |
GPIOHS2 | GPIO High speed 2 |
GPIOHS3 | GPIO High speed 3 |
GPIOHS4 | GPIO High speed 4 |
GPIOHS5 | GPIO High speed 5 |
GPIOHS6 | GPIO High speed 6 |
GPIOHS7 | GPIO High speed 7 |
GPIOHS8 | GPIO High speed 8 |
GPIOHS9 | GPIO High speed 9 |
GPIOHS10 | GPIO High speed 10 |
GPIOHS11 | GPIO High speed 11 |
GPIOHS12 | GPIO High speed 12 |
GPIOHS13 | GPIO High speed 13 |
GPIOHS14 | GPIO High speed 14 |
GPIOHS15 | GPIO High speed 15 |
GPIOHS16 | GPIO High speed 16 |
GPIOHS17 | GPIO High speed 17 |
GPIOHS18 | GPIO High speed 18 |
GPIOHS19 | GPIO High speed 19 |
GPIOHS20 | GPIO High speed 20 |
GPIOHS21 | GPIO High speed 21 |
GPIOHS22 | GPIO High speed 22 |
GPIOHS23 | GPIO High speed 23 |
GPIOHS24 | GPIO High speed 24 |
GPIOHS25 | GPIO High speed 25 |
GPIOHS26 | GPIO High speed 26 |
GPIOHS27 | GPIO High speed 27 |
GPIOHS28 | GPIO High speed 28 |
GPIOHS29 | GPIO High speed 29 |
GPIOHS30 | GPIO High speed 30 |
GPIOHS31 | GPIO High speed 31 |
GPIO0 | GPIO pin 0 |
GPIO1 | GPIO pin 1 |
GPIO2 | GPIO pin 2 |
GPIO3 | GPIO pin 3 |
GPIO4 | GPIO pin 4 |
GPIO5 | GPIO pin 5 |
GPIO6 | GPIO pin 6 |
GPIO7 | GPIO pin 7 |
UART1_RX | UART1 Receiver |
UART1_TX | UART1 Transmitter |
UART2_RX | UART2 Receiver |
UART2_TX | UART2 Transmitter |
UART3_RX | UART3 Receiver |
UART3_TX | UART3 Transmitter |
SPI1_D0 | SPI1 Data 0 |
SPI1_D1 | SPI1 Data 1 |
SPI1_D2 | SPI1 Data 2 |
SPI1_D3 | SPI1 Data 3 |
SPI1_D4 | SPI1 Data 4 |
SPI1_D5 | SPI1 Data 5 |
SPI1_D6 | SPI1 Data 6 |
SPI1_D7 | SPI1 Data 7 |
SPI1_SS0 | SPI1 Chip Select 0 |
SPI1_SS1 | SPI1 Chip Select 1 |
SPI1_SS2 | SPI1 Chip Select 2 |
SPI1_SS3 | SPI1 Chip Select 3 |
SPI1_ARB | SPI1 Arbitration |
SPI1_SCLK | SPI1 Serial Clock |
SPI_SLAVE_D0 | SPI Slave Data 0 |
SPI_SLAVE_SS | SPI Slave Select |
SPI_SLAVE_SCLK | SPI Slave Serial Clock |
I2S0_MCLK | I2S0 Master Clock |
I2S0_SCLK | I2S0 Serial Clock(BCLK) |
I2S0_WS | I2S0 Word Select(LRCLK) |
I2S0_IN_D0 | I2S0 Serial Data Input 0 |
I2S0_IN_D1 | I2S0 Serial Data Input 1 |
I2S0_IN_D2 | I2S0 Serial Data Input 2 |
I2S0_IN_D3 | I2S0 Serial Data Input 3 |
I2S0_OUT_D0 | I2S0 Serial Data Output 0 |
I2S0_OUT_D1 | I2S0 Serial Data Output 1 |
I2S0_OUT_D2 | I2S0 Serial Data Output 2 |
I2S0_OUT_D3 | I2S0 Serial Data Output 3 |
I2S1_MCLK | I2S1 Master Clock |
I2S1_SCLK | I2S1 Serial Clock(BCLK) |
I2S1_WS | I2S1 Word Select(LRCLK) |
I2S1_IN_D0 | I2S1 Serial Data Input 0 |
I2S1_IN_D1 | I2S1 Serial Data Input 1 |
I2S1_IN_D2 | I2S1 Serial Data Input 2 |
I2S1_IN_D3 | I2S1 Serial Data Input 3 |
I2S1_OUT_D0 | I2S1 Serial Data Output 0 |
I2S1_OUT_D1 | I2S1 Serial Data Output 1 |
I2S1_OUT_D2 | I2S1 Serial Data Output 2 |
I2S1_OUT_D3 | I2S1 Serial Data Output 3 |
I2S2_MCLK | I2S2 Master Clock |
I2S2_SCLK | I2S2 Serial Clock(BCLK) |
I2S2_WS | I2S2 Word Select(LRCLK) |
I2S2_IN_D0 | I2S2 Serial Data Input 0 |
I2S2_IN_D1 | I2S2 Serial Data Input 1 |
I2S2_IN_D2 | I2S2 Serial Data Input 2 |
I2S2_IN_D3 | I2S2 Serial Data Input 3 |
I2S2_OUT_D0 | I2S2 Serial Data Output 0 |
I2S2_OUT_D1 | I2S2 Serial Data Output 1 |
I2S2_OUT_D2 | I2S2 Serial Data Output 2 |
I2S2_OUT_D3 | I2S2 Serial Data Output 3 |
RESV0 | Reserved function |
RESV1 | Reserved function |
RESV2 | Reserved function |
RESV3 | Reserved function |
RESV4 | Reserved function |
RESV5 | Reserved function |
I2C0_SCLK | I2C0 Serial Clock |
I2C0_SDA | I2C0 Serial Data |
I2C1_SCLK | I2C1 Serial Clock |
I2C1_SDA | I2C1 Serial Data |
I2C2_SCLK | I2C2 Serial Clock |
I2C2_SDA | I2C2 Serial Data |
CMOS_XCLK | DVP System Clock |
CMOS_RST | DVP System Reset |
CMOS_PWDN | DVP Power Down Mode |
CMOS_VSYNC | DVP Vertical Sync |
CMOS_HREF | DVP Horizontal Reference output |
CMOS_PCLK | Pixel Clock |
CMOS_D0 | Data Bit 0 |
CMOS_D1 | Data Bit 1 |
CMOS_D2 | Data Bit 2 |
CMOS_D3 | Data Bit 3 |
CMOS_D4 | Data Bit 4 |
CMOS_D5 | Data Bit 5 |
CMOS_D6 | Data Bit 6 |
CMOS_D7 | Data Bit 7 |
SCCB_SCLK | SCCB Serial Clock |
SCCB_SDA | SCCB Serial Data |
UART1_CTS | UART1 Clear To Send |
UART1_DSR | UART1 Data Set Ready |
UART1_DCD | UART1 Data Carrier Detect |
UART1_RI | UART1 Ring Indicator |
UART1_SIR_IN | UART1 Serial Infrared Input |
UART1_DTR | UART1 Data Terminal Ready |
UART1_RTS | UART1 Request To Send |
UART1_OUT2 | UART1 User-designated Output 2 |
UART1_OUT1 | UART1 User-designated Output 1 |
UART1_SIR_OUT | UART1 Serial Infrared Output |
UART1_BAUD | UART1 Transmit Clock Output |
UART1_RE | UART1 Receiver Output Enable |
UART1_DE | UART1 Driver Output Enable |
UART1_RS485_EN | UART1 RS485 Enable |
UART2_CTS | UART2 Clear To Send |
UART2_DSR | UART2 Data Set Ready |
UART2_DCD | UART2 Data Carrier Detect |
UART2_RI | UART2 Ring Indicator |
UART2_SIR_IN | UART2 Serial Infrared Input |
UART2_DTR | UART2 Data Terminal Ready |
UART2_RTS | UART2 Request To Send |
UART2_OUT2 | UART2 User-designated Output 2 |
UART2_OUT1 | UART2 User-designated Output 1 |
UART2_SIR_OUT | UART2 Serial Infrared Output |
UART2_BAUD | UART2 Transmit Clock Output |
UART2_RE | UART2 Receiver Output Enable |
UART2_DE | UART2 Driver Output Enable |
UART2_RS485_EN | UART2 RS485 Enable |
UART3_CTS | UART3 Clear To Send |
UART3_DSR | UART3 Data Set Ready |
UART3_DCD | UART3 Data Carrier Detect |
UART3_RI | UART3 Ring Indicator |
UART3_SIR_IN | UART3 Serial Infrared Input |
UART3_DTR | UART3 Data Terminal Ready |
UART3_RTS | UART3 Request To Send |
UART3_OUT2 | UART3 User-designated Output 2 |
UART3_OUT1 | UART3 User-designated Output 1 |
UART3_SIR_OUT | UART3 Serial Infrared Output |
UART3_BAUD | UART3 Transmit Clock Output |
UART3_RE | UART3 Receiver Output Enable |
UART3_DE | UART3 Driver Output Enable |
UART3_RS485_EN | UART3 RS485 Enable |
TIMER0_TOGGLE1 | TIMER0 Toggle Output 1 |
TIMER0_TOGGLE2 | TIMER0 Toggle Output 2 |
TIMER0_TOGGLE3 | TIMER0 Toggle Output 3 |
TIMER0_TOGGLE4 | TIMER0 Toggle Output 4 |
TIMER1_TOGGLE1 | TIMER1 Toggle Output 1 |
TIMER1_TOGGLE2 | TIMER1 Toggle Output 2 |
TIMER1_TOGGLE3 | TIMER1 Toggle Output 3 |
TIMER1_TOGGLE4 | TIMER1 Toggle Output 4 |
TIMER2_TOGGLE1 | TIMER2 Toggle Output 1 |
TIMER2_TOGGLE2 | TIMER2 Toggle Output 2 |
TIMER2_TOGGLE3 | TIMER2 Toggle Output 3 |
TIMER2_TOGGLE4 | TIMER2 Toggle Output 4 |
CLK_SPI2 | Clock SPI2 |
CLK_I2C2 | Clock I2C2 |