EASY EAI灵眸科技
直播中

jf_05916765

1年用户 79经验值
擅长:嵌入式技术 光电显示 控制/MCU
私信 关注
[经验]

【EASY EAI Nano-TB(RV1126B)开发板试用】+3、GPIO操作

GPIO是嵌入式系统开发中最基础且重要的功能模块。在EASY EAI Nano-TB开发板上,GPIO提供了与外部世界交互的直接通道。

1. RV1126B特性

RV1126B GPIO架构特点

RV1126B处理器提供了丰富的GPIO资源,具有以下显著特性:

  • 多组GPIO :分为多个Bank(GPIO0~GPIO5)
  • 高驱动能力 :最大驱动电流可达8mA
  • 中断支持 :支持边沿和电平触发中断
  • 复用功能 :每个GPIO可配置为多种外设功能
  • 施密特触发 :输入信号噪声抑制

2. EASY EAI Nano-TB GPIO引脚定义

2.1 用户可用GPIO引脚

EASY EAI Nano-TB开发板通过40Pin扩展接口引出多个GPIO,其中专门为用户预留的GPIO引脚如下:

引脚编号 GPIO名称 系统节点 物理引脚 备注
7 GPIO5_C0 gpio176 Pin7 用户LED控制
11 GPIO5_C1 gpio177 Pin11 通用GPIO
12 GPIO5_C2 gpio178 Pin12 通用GPIO

2.2 GPIO引脚命名规则

RV1126B的GPIO命名采用层次化结构:

  • GPIO组 :GPIO0~GPIO5,共6组
  • 组内端口 :每组包含A、B、C、D四个端口
  • 引脚编号 :每个端口8个引脚(0~7)

例如:GPIO5_C0表示:

  • GPIO5组
  • C端口
  • 第0个引脚

对应的Linux系统节点计算公式为:

gpio_number = (group_index * 32) + (port_index * 8) + pin_index

因此GPIO5_C0 = (5 × 32) + (2 × 8) + 0 = 176

3. GPIO控制方法详解

3.1 基本操作步骤

导出GPIO

# 将GPIO176导出到用户空间
echo 176 > /sys/class/gpio/export

配置方向

# 设置为输出模式
echo out > /sys/class/gpio/gpio176/direction

# 设置为输入模式  
echo in > /sys/class/gpio/gpio176/direction

读写GPIO值

# 输出高电平
echo 1 > /sys/class/gpio/gpio176/value

# 输出低电平
echo 0 > /sys/class/gpio/gpio176/value

# 读取输入值
cat /sys/class/gpio/gpio176/value

取消导出

echo 176 > /sys/class/gpio/unexport

3.2完整的LED控制脚本

#!/bin/bash
# led_control.sh - 完整的GPIO LED控制脚本

LED_GPIO="176"
LED_PATH="/sys/class/gpio/gpio${LED_GPIO}"

# 初始化GPIO
init_gpio() {
    # 检查GPIO是否已导出
    if [ ! -d "$LED_PATH" ]; then
        echo "Exporting GPIO${LED_GPIO}"
        echo $LED_GPIO > /sys/class/gpio/export
        sleep 1  # 等待系统创建文件
    fi
    
    # 设置为输出模式
    echo "out" > ${LED_PATH}/direction
    echo "GPIO${LED_GPIO} initialized as output"
}

# 控制LED状态
set_led() {
    local state=$1
    echo $state > ${LED_PATH}/value
    echo "LED set to: $state"
}

# LED闪烁功能
blink_led() {
    local count=${1:-5}    # 默认闪烁5次
    local delay=${2:-0.5}  # 默认间隔0.5秒
    
    echo "Blinking LED $count times with ${delay}s interval"
    
    for ((i=1; i<=count; i++)); do
        set_led 1
        sleep $delay
        set_led 0
        sleep $delay
    done
}

# 清理函数
cleanup() {
    echo "Cleaning up GPIO${LED_GPIO}"
    set_led 0
    echo $LED_GPIO > /sys/class/gpio/unexport
}

# 信号处理
trap cleanup EXIT

# 主程序
case "$1" in
    "on")
        init_gpio
        set_led 1
        ;;
    "off")
        init_gpio
        set_led 0
        ;;
    "blink")
        init_gpio
        blink_led $2 $3
        ;;
    "status")
        if [ -d "$LED_PATH" ]; then
            current_value=$(cat ${LED_PATH}/value)
            direction=$(cat ${LED_PATH}/direction)
            echo "GPIO${LED_GPIO}: direction=$direction, value=$current_value"
        else
            echo "GPIO${LED_GPIO} not exported"
        fi
        ;;
    *)
        echo "Usage: $0 {on|off|blink [count] [interval]|status}"
        exit 1
        ;;
esac

使用方法:

chmod +x led_control.sh
./led_control.sh on        # 点亮LED
./led_control.sh off       # 熄灭LED  
./led_control.sh blink     # 闪烁5次
./led_control.sh blink 10 0.2  # 闪烁10次,间隔0.2秒
./led_control.sh status    # 查看状态

更多回帖

发帖
×
20
完善资料,
赚取积分