Venusa SDIO 作为 GPIO 示例
源码位置: samples/drivers/devices/lisa_gpio/sdio_as_gpio 查看源码
功能说明
本示例演示如何在 venusa_rd_evb 上将 SDIO 引脚复用为普通 GPIO,并通过现有的 "gpiob" 设备使用输入、输出和中断功能。程序持续翻转输出引脚;输入引脚发生中断时打印当前输入电平和累计中断次数,未触发中断时周期性打印等待信息。
示例只使用并配置以下两个引脚:
用途 |
SDIO 引脚 |
IOMUX |
GPIOB 引脚 |
|---|---|---|---|
输出 |
SDIO_CLK |
0 |
GPIOB 10 |
输入、双边沿中断 |
SDIO_CMD |
1 |
GPIOB 11 |
硬件连接
使用跳线连接以下两个引脚:
SDIO_CLK(GPIOB 10,输出) ─── SDIO_CMD(GPIOB 11,输入)
运行示例前,应断开 SD 卡、显示屏或其他可能占用这些 SDIO 引脚的外设。
示例步骤
重写
lisa_gpiob_pinmux(),仅将 SDIO_CLK 和 SDIO_CMD 配置为 GPIO 功能。获取
"gpiob"设备。将 GPIOB 10 配置为低电平输出。
将 GPIOB 11 配置为下拉输入,并启用双边沿中断。
每秒翻转一次 GPIOB 10 的输出电平。
GPIOB 11 触发中断后,在主任务中打印当前输入电平和累计中断次数。
如果一个输出周期内没有触发中断,打印
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 |
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 |
说明 |
|---|---|
|
将 SDIO PAD 配置为 GPIO 功能 |
|
获取 GPIOB 设备 |
|
配置 GPIO 输入、输出及上下拉属性 |
|
设置 GPIOB 10 输出电平 |
|
读取 GPIOB 11 实际输入电平 |
|
配置 GPIOB 11 双边沿中断 |
|
启用 GPIOB 11 中断 |
|
禁用 GPIOB 11 中断 |
注意事项
本示例仅支持 VENUSA,测试板型为
venusa_rd_evb。SDIO PAD 切换为 GPIO 后,不能同时用于 SDMMC/SDIO;示例运行期间不要启用或使用 SDMMC/SDIO 功能。
main.c仅配置 SDIO_CLK 和 SDIO_CMD,未使用的 SDIO_DAT0~DAT3 保持原有复用状态。运行前应使用跳线连接 SDIO_CLK 和 SDIO_CMD;未连接或输入没有产生边沿时,程序会周期性打印
Waiting for interrupt...。中断回调在中断上下文执行,示例仅在回调中增加计数,输入读取和日志均在主任务中完成。
示例会持续运行,不对输入输出结果进行 PASS/FAIL 判定。