Venusa SDIO 作为 GPIO 示例

功能说明

本示例演示如何在 venusa_rd_evb 上将 SDIO 引脚复用为普通 GPIO,并通过现有的 "gpiob" 设备使用输入、输出和中断功能。程序持续翻转输出引脚;输入引脚发生中断时打印当前输入电平和累计中断次数,未触发中断时周期性打印等待信息。

示例只使用并配置以下两个引脚:

用途

SDIO 引脚

IOMUX pin_number

GPIOB 引脚

输出

SDIO_CLK

0

GPIOB 10

输入、双边沿中断

SDIO_CMD

1

GPIOB 11

硬件连接

使用跳线连接以下两个引脚:

SDIO_CLK(GPIOB 10,输出) ─── SDIO_CMD(GPIOB 11,输入)

运行示例前,应断开 SD 卡、显示屏或其他可能占用这些 SDIO 引脚的外设。

示例步骤

  1. 重写 lisa_gpiob_pinmux(),仅将 SDIO_CLK 和 SDIO_CMD 配置为 GPIO 功能。

  2. 获取 "gpiob" 设备。

  3. 将 GPIOB 10 配置为低电平输出。

  4. 将 GPIOB 11 配置为下拉输入,并启用双边沿中断。

  5. 每秒翻转一次 GPIOB 10 的输出电平。

  6. GPIOB 11 触发中断后,在主任务中打印当前输入电平和累计中断次数。

  7. 如果一个输出周期内没有触发中断,打印 Waiting for interrupt...

Pinmux 配置

示例只配置实际使用的两个 SDIO 引脚,不改变 SDIO_DAT0~DAT3 的复用状态:

void lisa_gpiob_pinmux(void)
{
    IOMuxManager_PinConfigure(CSK_IOMUX_PAD_SDIO, 0,
                              CSK_IOMUX_FUNC_ALTER1); /* SDIO_CLK -> GPIOB 10 */
    IOMuxManager_PinConfigure(CSK_IOMUX_PAD_SDIO, 1,
                              CSK_IOMUX_FUNC_ALTER1); /* SDIO_CMD -> GPIOB 11 */
}

实际项目也应只配置业务使用到的引脚,避免改变其他 SDIO PAD 的复用状态。

完整引脚映射

Venusa 的六根 SDIO 引脚均可复用为 GPIO,对应关系如下:

SDIO 引脚

IOMUX pin_number

GPIOB 引脚

SDIO_CLK

0

GPIOB 10

SDIO_CMD

1

GPIOB 11

SDIO_DAT0

2

GPIOB 12

SDIO_DAT1

3

GPIOB 13

SDIO_DAT2

4

GPIOB 14

SDIO_DAT3

5

GPIOB 15

如业务确实需要将全部 SDIO 引脚配置为 GPIO,可参考以下配置:

IOMuxManager_PinConfigure(CSK_IOMUX_PAD_SDIO, 0, CSK_IOMUX_FUNC_ALTER1); /* SDIO_CLK  -> GPIOB 10 */
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_SDIO, 1, CSK_IOMUX_FUNC_ALTER1); /* SDIO_CMD  -> GPIOB 11 */
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_SDIO, 2, CSK_IOMUX_FUNC_ALTER1); /* SDIO_DAT0 -> GPIOB 12 */
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_SDIO, 3, CSK_IOMUX_FUNC_ALTER1); /* SDIO_DAT1 -> GPIOB 13 */
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_SDIO, 4, CSK_IOMUX_FUNC_ALTER1); /* SDIO_DAT2 -> GPIOB 14 */
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_SDIO, 5, CSK_IOMUX_FUNC_ALTER1); /* SDIO_DAT3 -> GPIOB 15 */

配置完成后,通过 "gpiob" 设备和 GPIOB 10~15 使用 lisa_gpio API。

编译

在 SDK 根目录执行:

./build.sh -C -S samples/drivers/devices/lisa_gpio/sdio_as_gpio -DBOARD=venusa_rd_evb

烧录

编译完成后,根据实际串口修改 -s 参数并执行:

./tools/burn/cskburn -C venusa -s /dev/ttyACM0 -b 3000000 0x0 build/arcs.bin

预期输出

=== VENUSA SDIO as GPIO example ===
Connect SDIO_CLK to SDIO_CMD
gpiob device ready
GPIOB 10 output: HIGH
Interrupt triggered on GPIOB 11, count=1, input=HIGH
GPIOB 10 output: LOW
Interrupt triggered on GPIOB 11, count=2, input=LOW
GPIOB 10 output: HIGH
Waiting for interrupt...

核心 API

API

说明

IOMuxManager_PinConfigure()

将 SDIO PAD 配置为 GPIO 功能

lisa_device_get()

获取 GPIOB 设备

lisa_gpio_configure()

配置 GPIO 输入、输出及上下拉属性

lisa_gpio_write_pin()

设置 GPIOB 10 输出电平

lisa_gpio_read_pin()

读取 GPIOB 11 实际输入电平

lisa_gpio_configure_irq()

配置 GPIOB 11 双边沿中断

lisa_gpio_enable_irq()

启用 GPIOB 11 中断

lisa_gpio_disable_irq()

禁用 GPIOB 11 中断

注意事项

  1. 本示例仅支持 VENUSA,测试板型为 venusa_rd_evb

  2. SDIO PAD 切换为 GPIO 后,不能同时用于 SDMMC/SDIO;示例运行期间不要启用或使用 SDMMC/SDIO 功能。

  3. main.c 仅配置 SDIO_CLK 和 SDIO_CMD,未使用的 SDIO_DAT0~DAT3 保持原有复用状态。

  4. 运行前应使用跳线连接 SDIO_CLK 和 SDIO_CMD;未连接或输入没有产生边沿时,程序会周期性打印 Waiting for interrupt...

  5. 中断回调在中断上下文执行,示例仅在回调中增加计数,输入读取和日志均在主任务中完成。

  6. 示例会持续运行,不对输入输出结果进行 PASS/FAIL 判定。