03-Machine-5-fpioa.py K230 IO引脚复用功能演示
fpioa.py 为K230的IO引脚复用功能演示程序。
在嵌入式系统中,SoC(System on Chip)通常集成了多种外设模块,如 UART、SPI、I2C、PWM 和 GPIO 等。然而,由于物理引脚数量有限,这些模块往往需要共享引脚。为了解决这一冲突,就需要使用 IOMUX(引脚复用)机制。在 K230 芯片中,这一机制被称为 FPIOA(Field Programmable IO Array)。
FPIOA 允许我们为任意引脚分配所需的功能。例如,你可以将引脚 10 设置为 UART0 的发送脚,也可以设置为 GPIO 用于通用输入输出。
K230 芯片内置多个外设资源,包括 5 路 UART、5 路 I2C、6 路 PWM 及最多 64 个 GPIO 输出等,这些外设通过 FPIOA 实现引脚复用。
FPIOA的重要性
K230的FPIOA系统提供了极大的灵活性:
引脚复用: 同一物理引脚可以在不同时间用于不同功能
避免冲突: 可以重新安排功能引脚布局
优化PCB设计: 可以根据布线需要调整功能位置


程序运行后输出:
>>>
MPY: soft reboot
CanMV v1.4-7-g4618dc2(based on Micropython e00a144) on 2025-09-19; k230_canmv_01studio with K230| pin | cur func | can be func |
| ---- |------------|---------------------------------------------------------|
| 0 | GPIO0 | GPIO0/BOOT0/RESV/RESV/RESV |
| 1 | BOOT1 | GPIO1/BOOT1/RESV/RESV/RESV |
| 2 | JTAG_TCK | GPIO2/JTAG_TCK/PULSE_CNTR0/RESV/RESV |
| 3 | JTAG_TDI | GPIO3/JTAG_TDI/PULSE_CNTR1/UART1_TXD/RESV |
| 4 | JTAG_TDO | GPIO4/JTAG_TDO/PULSE_CNTR2/UART1_RXD/RESV |
| 5 | JTAG_TMS | GPIO5/JTAG_TMS/PULSE_CNTR3/UART2_TXD/RESV |
| 6 | JTAG_RST | GPIO6/JTAG_RST/PULSE_CNTR4/UART2_RXD/RESV |
| 7 | IIC4_SCL | GPIO7/PWM2/IIC4_SCL/RESV/RESV |
| 8 | IIC4_SDA | GPIO8/PWM3/IIC4_SDA/RESV/RESV |
| 9 | GPIO9 | GPIO9/PWM4/UART1_TXD/IIC1_SCL/RESV |
| 10 | GPIO10 | GPIO10/CTRL_IN_3D/UART1_RXD/IIC1_SDA/RESV |
| 11 | GPIO11 | GPIO11/CTRL_O1_3D/UART2_TXD/IIC2_SCL/RESV |
| 12 | GPIO12 | GPIO12/CTRL_O2_3D/UART2_RXD/IIC2_SDA/RESV |
| 13 | M_CLK1 | GPIO13/M_CLK1/RESV/RESV/RESV |
| 14 | GPIO14 | GPIO14/OSPI_CS/RESV/QSPI0_CS0/RESV |
| 15 | GPIO15 | GPIO15/OSPI_CLK/RESV/QSPI0_CLK/RESV |
| 16 | GPIO16 | GPIO16/OSPI_D0/QSPI1_CS4/QSPI0_D0/RESV |
| 17 | GPIO17 | GPIO17/OSPI_D1/QSPI1_CS3/QSPI0_D1/RESV |
| 18 | GPIO18 | GPIO18/OSPI_D2/QSPI1_CS2/QSPI0_D2/RESV |
| 19 | GPIO19 | GPIO19/OSPI_D3/QSPI1_CS1/QSPI0_D3/RESV |
| 20 | GPIO20 | GPIO20/OSPI_D4/QSPI1_CS0/PULSE_CNTR0/RESV |
| 21 | GPIO21 | GPIO21/OSPI_D5/QSPI1_CLK/PULSE_CNTR1/RESV |
| 22 | GPIO22 | GPIO22/OSPI_D6/QSPI1_D0/PULSE_CNTR2/RESV |
| 23 | GPIO23 | GPIO23/OSPI_D7/QSPI1_D1/PULSE_CNTR3/RESV |
| 24 | GPIO24 | GPIO24/OSPI_DQS/QSPI1_D2/PULSE_CNTR4/RESV |
| 25 | GPIO25 | GPIO25/PWM5/QSPI1_D3/PULSE_CNTR5/RESV |
| 26 | GPIO26 | GPIO26/MMC1_CLK/RESV/PDM_CLK/RESV |
| 27 | GPIO27 | GPIO27/MMC1_CMD/PULSE_CNTR5/PDM_IN0/RESV |
| 28 | GPIO28 | GPIO28/MMC1_D0/UART3_TXD/PDM_IN1/RESV |
| 29 | GPIO29 | GPIO29/MMC1_D1/UART3_RXD/CTRL_IN_3D/RESV |
| 30 | GPIO30 | GPIO30/MMC1_D2/UART3_RTS/CTRL_O1_3D/RESV |
| 31 | GPIO31 | GPIO31/MMC1_D3/UART3_CTS/CTRL_O2_3D/RESV |
| 32 | IIS_CLK | GPIO32/IIC0_SCL/IIS_CLK/UART3_TXD/RESV |
| 33 | IIS_WS | GPIO33/IIC0_SDA/IIS_WS/UART3_RXD/RESV |
| 34 | GPIO34 | GPIO34/IIC1_SCL/IIS_D_IN0_PDM_IN3/UART3_RTS/RESV |
| 35 | IIS_D_OUT0_PDM_IN1 | GPIO35/IIC1_SDA/IIS_D_OUT0_PDM_IN1/UART3_CTS/RESV |
| 36 | IIC3_SCL | GPIO36/IIC3_SCL/IIS_D_IN1_PDM_IN2/UART4_TXD/RESV |
| 37 | IIC3_SDA | GPIO37/IIC3_SDA/IIS_D_OUT1_PDM_IN0/UART4_RXD/RESV |
| 38 | UART0_TXD | GPIO38/UART0_TXD/RESV/QSPI1_CS0/HSYNC0 |
| 39 | UART0_RXD | GPIO39/UART0_RXD/RESV/QSPI1_CLK/VSYNC0 |
| 40 | IIC1_SCL | GPIO40/UART1_TXD/IIC1_SCL/QSPI1_D0/RESV |
| 41 | IIC1_SDA | GPIO41/UART1_RXD/IIC1_SDA/QSPI1_D1/RESV |
| 42 | GPIO42 | GPIO42/UART1_RTS/PWM0/QSPI1_D2/RESV |
| 43 | GPIO43 | GPIO43/UART1_CTS/PWM1/QSPI1_D3/RESV |
| 44 | GPIO44 | GPIO44/UART2_TXD/IIC3_SCL/RESV/SPI2AXI_CK |
| 45 | GPIO45 | GPIO45/UART2_RXD/IIC3_SDA/RESV/SPI2AXI_CS |
| 46 | GPIO46 | GPIO46/UART2_RTS/PWM2/IIC4_SCL/RESV |
| 47 | GPIO47 | GPIO47/UART2_CTS/PWM3/IIC4_SDA/RESV |
| 48 | IIC0_SCL | GPIO48/UART4_TXD/RESV/IIC0_SCL/SPI2AXI_DI |
| 49 | IIC0_SDA | GPIO49/UART4_RXD/RESV/IIC0_SDA/SPI2AXI_DO |
| 50 | UART3_TXD | GPIO50/UART3_TXD/IIC2_SCL/QSPI0_CS4/RESV |
| 51 | UART3_RXD | GPIO51/UART3_RXD/IIC2_SDA/QSPI0_CS3/RESV |
| 52 | GPIO52 | GPIO52/UART3_RTS/PWM4/IIC3_SCL/RESV |
| 53 | GPIO53 | GPIO53/UART3_CTS/PWM5/IIC3_SDA/RESV |
| 54 | MMC1_CMD | GPIO54/QSPI0_CS0/MMC1_CMD/PWM0/RESV |
| 55 | MMC1_CLK | GPIO55/QSPI0_CLK/MMC1_CLK/PWM1/RESV |
| 56 | MMC1_D0 | GPIO56/QSPI0_D0/MMC1_D0/PWM2/RESV |
| 57 | MMC1_D1 | GPIO57/QSPI0_D1/MMC1_D1/PWM3/RESV |
| 58 | MMC1_D2 | GPIO58/QSPI0_D2/MMC1_D2/PWM4/RESV |
| 59 | MMC1_D3 | GPIO59/QSPI0_D3/MMC1_D3/PWM5/RESV |
| 60 | GPIO60 | GPIO60/PWM0/IIC0_SCL/QSPI0_CS2/HSYNC1 |
| 61 | GPIO61 | GPIO61/PWM1/IIC0_SDA/QSPI0_CS1/VSYNC1 |
| 62 | GPIO62 | GPIO62/M_CLK2/UART3_DE/RESV/RESV |
| 63 | M_CLK3 | GPIO63/M_CLK3/UART3_RE/RESV/RESV |
|pin num |0 |
|current config |GPIO0,ie:1,oe:1,pd:0,pu:1,msc:0-1.8,ds:2,st:0,sl:0,di:0 |
|can be function |GPIO0/BOOT0/RESV/RESV/RESV |
function IIC0_SDA can be set to PIN33, PIN49, PIN61
current set PIN49 as IIC0_SDA
not support set slMPY: soft reboot
CanMV v1.4-7-g4618dc2(based on Micropython e00a144) on 2025-09-19; k230_canmv_01studio with K230源程序如下:
from machine import FPIOA# 实例化FPIOA
fpioa = FPIOA()
# 打印所有引脚配置
fpioa.help()
# 打印指定引脚详细配置
fpioa.help(0)
# 打印指定功能所有可用的配置引脚
fpioa.help(FPIOA.IIC0_SDA, func=True)
# 设置Pin0为GPIO0
fpioa.set_function(0, FPIOA.GPIO0)
# 设置Pin2为GPIO2, 同时配置其它项
fpioa.set_function(2, FPIOA.GPIO2, ie=1, oe=1, pu=0, pd=0, st=1, sl=0, ds=7)
# 获取指定功能当前所在的引脚
fpioa.get_pin_num(FPIOA.UART0_TXD)
# 获取指定引脚当前功能
fpioa.get_pin_func(0)
程序命令详解:设置引脚2为GPIO2,并同时配置其他电气特性:
fpioa.set_function(2, FPIOA.GPIO2, ie=1, oe=1, pu=0, pd=0, st=1, sl=0, ds=7)
除了设置功能,还配置了以下参数:
ie: 输入使能(1使能)
oe: 输出使能(1使能)
pu: 上拉(0禁用)
pd: 下拉(0禁用)
st: 施密特触发器(1使能)
sl: 斜率控制(0为慢斜率,1为快斜率,这里0)
ds: 驱动能力(0-7,7为最强)
