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 函数:
函数名 |
说明 |
|---|---|
|
UART0 引脚配置 |
|
UART1 引脚配置 |
|
SPI0 引脚配置 |
|
SPI1 引脚配置 |
|
I2C0 引脚配置 |
|
I2C1 引脚配置 |
|
ADC 引脚配置 |
|
PWM 引脚配置 |
|
GPIOA 引脚配置 |
|
GPIOB 引脚配置 |
|
SDIO 引脚配置 |
|
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 配置工具
工具地址:https://tool.listenai.com/ls-pinmux-tool/
选择芯片型号
根据你的硬件选择对应的芯片型号
配置外设引脚
根据硬件原理图配置项目中使用的外设(如 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 配置应该在初始化阶段完成并保持不变。