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.hpinmux.c 由 Pinmux 配置工具自动生成,不建议手动编辑。

配置步骤

  1. 访问 Pinmux 配置工具

    • 工具地址:https://tool.listenai.com/ls-pinmux-tool/

  2. 选择芯片型号

    • 根据你的硬件选择对应的芯片型号

  3. 配置外设引脚

    • 根据硬件原理图配置项目中使用的外设(如 UART0、SPI0、I2C0、ADC 等)

    • 为每个外设选择对应的引脚映射

  4. 生成代码

    • 工具会自动生成 pinmux.hpinmux.c 文件

    • 生成的文件包含所有已配置外设的 pinmux 函数实现

  5. 集成到板型目录

    • 将生成的 pinmux.hpinmux.c 保存到 boards/<你的板型>/ 目录下

    • 重新编译项目

修改已有配置

如果需要修改引脚配置:

  1. 在 Pinmux 配置工具中重新配置

  2. 重新生成 pinmux.hpinmux.c

  3. 替换板型目录下的对应文件

  4. 虽然不建议,但可以手动调整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 配置是否正确?

  1. 仔细对照硬件原理图和芯片手册

  2. 参考 SDK 内置板型的配置示例

  3. 编译运行后测试对应外设功能是否正常

Q: 如果不使用某个外设,需要提供 pinmux 函数吗?

不需要。 如果不使用某个外设(如 SPI0),只需在 Kconfig 中不使能对应的驱动即可:

# CONFIG_LISA_SPI is not set

这样驱动不会被编译,也不会调用对应的 pinmux 函数,不会产生链接错误。

Q: 可以在运行时动态改变引脚功能吗?

技术上可以再次调用 IOMuxManager_PinConfigure 来改变引脚功能,但不建议这样做,因为可能导致外设状态混乱。Pinmux 配置应该在初始化阶段完成并保持不变。