Pinmux
什么是 Pinmux
引脚复用配置(Pinmux)用于将芯片的物理引脚配置为特定外设功能。例如,将某个引脚配置为 UART TX、SPI CLK 或 ADC 输入等。
在 ARCS SDK 中,驱动在初始化时会自动调用板型目录下定义的 pinmux 函数来完成引脚配置,用户无需在应用代码中手动配置。
板型中的 Pinmux 配置
文件位置
Pinmux 配置位于板型目录下:
boards/<板型名>/
├── pinmux.h # pinmux 函数声明
└── pinmux.c # pinmux 函数实现
函数命名规范
每个外设的 pinmux 函数按以下规则命名:
void lisa_<外设名>_pinmux(void);
常用的 pinmux 函数:
| 函数名 | 说明 |
|---|---|
lisa_uart0_pinmux() |
UART0 引脚配置 |
lisa_uart1_pinmux() |
UART1 引脚配置 |
lisa_spi0_pinmux() |
SPI0 引脚配置 |
lisa_spi1_pinmux() |
SPI1 引脚配置 |
lisa_i2c0_pinmux() |
I2C0 引脚配置 |
lisa_i2c1_pinmux() |
I2C1 引脚配置 |
lisa_adc_pinmux() |
ADC 引脚配置 |
lisa_pwm_pinmux() |
PWM 引脚配置 |
lisa_gpioa_pinmux() |
GPIOA 引脚配置 |
lisa_gpiob_pinmux() |
GPIOB 引脚配置 |
lisa_sdio_pinmux() |
SDIO 引脚配置 |
lisa_dvp_pinmux() |
DVP 摄像头接口引脚配置 |
自动调用机制
驱动在设备初始化时会自动调用对应的 pinmux 函数。例如:
- UART0 驱动初始化时调用
lisa_uart0_pinmux() - ADC 驱动初始化时调用
lisa_adc_pinmux() - SPI0 驱动初始化时调用
lisa_spi0_pinmux()
重要:应用层代码无需手动调用这些函数!
查看板型的 Pinmux 配置
示例:arcs_evb 板型
查看 boards/arcs_evb/pinmux.c 可以了解该板型的引脚配置:
void lisa_uart0_pinmux()
{
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, CP_LOG_RX_PIN, 2);
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, CP_LOG_TX_PIN, 2);
}
void lisa_adc_pinmux()
{
AON_IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, 6, 3);
}
void lisa_spi1_pinmux()
{
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, 5, 6); // SCK
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, 3, 6); // MISO
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, 1, 6); // MOSI
}
查看 boards/arcs_evb/pinmux.h 可以看到引脚别名定义:
#define CP_LOG_RX_PIN 2
#define CP_LOG_TX_PIN 3
#define AP_LOG_TX_PIN 21
// ...
自定义板型时如何配置 Pinmux
使用 Pinmux 配置工具
重要提示:pinmux.h 和 pinmux.c 由 Pinmux 配置工具自动生成,不建议手动编辑。
配置步骤
-
访问 Pinmux 配置工具
-
选择芯片型号
- 根据你的硬件选择对应的芯片型号
-
配置外设引脚
- 根据硬件原理图配置项目中使用的外设(如 UART0、SPI0、I2C0、ADC 等)
- 为每个外设选择对应的引脚映射
-
生成代码
- 工具会自动生成
pinmux.h和pinmux.c文件 - 生成的文件包含所有已配置外设的 pinmux 函数实现
- 工具会自动生成
-
集成到板型目录
- 将生成的
pinmux.h和pinmux.c保存到boards/<你的板型>/目录下 - 重新编译项目
- 将生成的
修改已有配置
如果需要修改引脚配置:
- 在 Pinmux 配置工具中重新配置
- 重新生成
pinmux.h和pinmux.c - 替换板型目录下的对应文件
- 虽然不建议,但可以手动调整pinmux代码,参考官方提供的IO MAP表
配置参数说明
IOMuxManager_PinConfigure
用于配置普通电源域的引脚:
void IOMuxManager_PinConfigure(pad_group, pin_number, function);
参数:
pad_group: 引脚组,可选值:CSK_IOMUX_PAD_A- PAD_A 组CSK_IOMUX_PAD_B- PAD_B 组
pin_number: 引脚编号(0-31)function: 功能码(0-31,具体值参考芯片手册)
AON_IOMuxManager_PinConfigure
用于配置 Always-On 电源域的引脚(通常用于 ADC、部分 GPIO):
void AON_IOMuxManager_PinConfigure(pad_group, pin_number, function);
参数与 IOMuxManager_PinConfigure 相同。
如何判断使用哪个?
- 查看芯片手册中引脚所属的电源域
- 参考 SDK 内置板型(arcs_evb、arcs_mini)的配置
- 通常 ADC 引脚使用
AON_IOMuxManager,其他外设使用IOMuxManager
常见问题
Q: 应用代码中需要调用 pinmux 函数吗?
不需要。 驱动初始化时会自动调用,应用层只需要使用设备 API 即可。
Q: 修改了 pinmux 配置后需要重新编译吗?
是的。 Pinmux 配置是板型的一部分,修改后需要重新编译整个项目。
Q: 如何确认我的 pinmux 配置是否正确?
- 仔细对照硬件原理图和芯片手册
- 参考 SDK 内置板型的配置示例
- 编译运行后测试对应外设功能是否正常
Q: 如果不使用某个外设,需要提供 pinmux 函数吗?
不需要。 如果不使用某个外设(如 SPI0),只需在 Kconfig 中不使能对应的驱动即可:
# CONFIG_LISA_SPI is not set
这样驱动不会被编译,也不会调用对应的 pinmux 函数,不会产生链接错误。
Q: 可以在运行时动态改变引脚功能吗?
技术上可以再次调用 IOMuxManager_PinConfigure 来改变引脚功能,但不建议这样做,因为可能导致外设状态混乱。Pinmux 配置应该在初始化阶段完成并保持不变。