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表示:
对应的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_GPIO="176"
LED_PATH="/sys/class/gpio/gpio${LED_GPIO}"
init_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"
}
set_led() {
local state=$1
echo $state > ${LED_PATH}/value
echo "LED set to: $state"
}
blink_led() {
local count=${1:-5}
local delay=${2:-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_control.sh off
./led_control.sh blink
./led_control.sh blink 10 0.2
./led_control.sh status
|