FPIOA 使用教程#
概述#
在嵌入式系统中,SoC(System on Chip)通常集成了多种外设模块,如 UART、SPI、I2C、PWM 和 GPIO 等。然而,由于物理引脚数量有限,这些模块往往需要共享引脚。为了解决这一冲突,就需要使用 IOMUX(引脚复用)机制。在 K230 芯片中,这一机制被称为 FPIOA(Field Programmable IO Array)。
FPIOA 允许我们为任意引脚分配所需的功能。例如,你可以将引脚 10 设置为 UART0 的发送脚,也可以设置为 GPIO 用于通用输入输出。
FPIOA 有什么作用?
提升灵活性:开发者可根据实际应用需求自由分配引脚功能。
减少限制:一套硬件可适配多种引脚配置,便于模块化设计。
FPIOA 使用示例#
K230 芯片内置多个外设资源,包括 5 路 UART、5 路 I2C、6 路 PWM 及最多 64 个 GPIO 输出等。这些外设通过 FPIOA 实现引脚复用,因此不同厂家的 K230 开发板可能存在不同的引脚分配方案。这些厂家一般都会提供相应的开发板接口资料,供软件开发时参考使用。
我们以 立创·庐山派K230CanMV开发板 开发板为例进行说明。该开发板提供了一张接口定义图,如下所示:
查看当前所有引脚功能状态#
使用 fpioa.help()
可查看所有管脚的当前配置情况:
from machine import FPIOA
fpioa = FPIOA()
fpioa.help()
输出如下:
| 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 |
| ... | ... | ... |
设置引脚的目标功能#
假设我们希望将 IO11 和 IO12 设置为 I2C 接口(I2C2),用于连接外部 I2C 设备。根据引脚功能表,它们默认是 GPIO,需要重新配置。
fpioa.set_function(11, FPIOA.IIC2_SCL, pu=1) # 启用上拉
fpioa.set_function(12, FPIOA.IIC2_SDA, pu=1)
设置后,我们可以通过 help()
查看状态是否生效:
fpioa.help(11)
fpioa.help(12)
输出如下:
|pin num |11 |
|current config |IIC2_SCL,ie:1,oe:1,pd:0,pu:0,msc:0-3.3,ds:7,st:1,sl:0,di:1 |
|can be function |GPIO11/CTRL_O1_3D/UART2_TXD/IIC2_SCL/RESV |
此时,即可通过 machine.I2C(2)
使用该接口。
设置引脚的电气属性#
除了功能设置外,FPIOA 还支持设置电气参数:
fpioa.set_function(2, FPIOA.GPIO2, ie=1, oe=1, pu=0, pd=0, st=1, ds=7)
fpioa.help(2)
关于电气参数的更多详细配置,可以参考 K230 IOMUX 配置工具
获取功能与引脚的对应关系#
查询功能对应的引脚号:
fpioa.get_pin_num(FPIOA.UART0_TXD) # → 38
查询引脚当前配置的功能号:
fpioa.get_pin_func(0) # → 0
常见问题 FAQ#
Q1:我不知道某个功能可以映射到哪些引脚,怎么办?#
你可以使用 help()
查询该功能支持的所有引脚:
fpioa.help(FPIOA.IIC0_SDA, func=True)
输出:
function IIC0_SDA can be set to PIN33, PIN49, PIN61
current set PIN49 as IIC0_SDA
更多引脚功能对应表请参考官方文档: K230 芯片引脚定义列表
Q2:我设置了引脚功能,但通信仍然不正常,是什么原因?#
请确认以下几点:
所选引脚是否支持该功能
引脚是否已被其他模块占用
是否正确设置输入/输出使能(
ie
/oe
)是否需要启用上拉/下拉电阻(特别是 I2C)