2. GPIO控制与按键输入
任务目标
在ADI SHARC处理器上,通过GPIO端口控制LED的亮灭,并读取按键输入状态,实现按键按下时切换LED状态的功能。本案例以ADSP-SC589评估板为硬件参考,使用CCES开发环境完成工程创建与代码实现。
硬件连接与原理
- LED连接至GPIO端口:LED0接GPIO_B_14,LED1接GPIO_B_15(高电平点亮)
- 按键连接至GPIO端口:按键SW0接GPIO_A_05,按下为低电平(内部上拉)
- 通过读取按键GPIO电平状态,检测下降沿触发LED状态翻转
完整代码实现
/* GPIO_LED_Key.c - SHARC GPIO控制LED与按键输入示例 */
#include <sys/platform.h>
#include <services/adi_gpio.h>
#include <drivers/adi_gpio_def.h>
/* 引脚定义 */
#define LED0_PIN ADI_GPIO_PB_14 /* GPIO_B_14 */
#define LED1_PIN ADI_GPIO_PB_15 /* GPIO_B_15 */
#define KEY_PIN ADI_GPIO_PA_05 /* GPIO_A_05 */
/* 按键消抖延时计数 */
#define DEBOUNCE_COUNT 1000
int main(void)
{
uint32_t key_state = 0;
uint32_t last_key = 1; /* 上一次按键状态,初始为高电平 */
uint32_t debounce_cnt = 0;
uint32_t led_status = 0; /* LED状态变量 */
/* 初始化GPIO驱动 */
adi_gpio_Init();
/* 配置LED引脚为输出 */
adi_gpio_OutputEnable(LED0_PIN, true);
adi_gpio_OutputEnable(LED1_PIN, true);
adi_gpio_SetDirection(LED0_PIN, ADI_GPIO_DIRECTION_OUTPUT);
adi_gpio_SetDirection(LED1_PIN, ADI_GPIO_DIRECTION_OUTPUT);
/* 配置按键引脚为输入,使能内部上拉 */
adi_gpio_InputEnable(KEY_PIN, true);
adi_gpio_SetDirection(KEY_PIN, ADI_GPIO_DIRECTION_INPUT);
adi_gpio_PullUpEnable(KEY_PIN, true);
/* 初始状态:LED全灭 */
adi_gpio_SetValue(LED0_PIN, false);
adi_gpio_SetValue(LED1_PIN, false);
while (1)
{
/* 读取当前按键状态(按下为0) */
adi_gpio_GetValue(KEY_PIN, &key_state);
/* 检测下降沿:上次为高,当前为低 */
if (last_key == 1 && key_state == 0)
{
debounce_cnt = DEBOUNCE_COUNT;
}
/* 消抖处理:连续低电平保持一段时间后确认按下 */
if (debounce_cnt > 0)
{
if (key_state == 0)
{
debounce_cnt--;
if (debounce_cnt == 0)
{
/* 确认按键按下,翻转LED状态 */
led_status = !led_status;
adi_gpio_SetValue(LED0_PIN, led_status);
adi_gpio_SetValue(LED1_PIN, !led_status);
}
}
else
{
debounce_cnt = 0; /* 按键提前释放,取消本次触发 */
}
}
last_key = key_state;
}
return 0;
}
工程配置说明
- 在CCES中新建SHARC工程,芯片型号选择ADSP-SC589
- 在项目属性中链接GPIO驱动库:
libio与libgpio - 将上述代码保存为
gpio_led_key.c并添加到工程源文件 - 编译工程生成
.dxe调试文件
运行与验证方法
- 使用CCES的Debug配置连接仿真器(ICE-1000或ICE-2000),加载生成的
.dxe文件 - 点击Run运行程序,观察评估板上LED0与LED1的初始状态(应全灭)
- 按下按键SW0并保持约1秒后释放,观察LED状态变化:LED0点亮、LED1熄灭
- 再次按下并释放按键,LED状态应再次翻转:LED0熄灭、LED1点亮
- 快速连续按动按键,确认每次按下仅翻转一次状态,无抖动误触发
通过判定标准
程序运行后,每次按下按键SW0并释放,LED0与LED1的亮灭状态发生一次且仅一次翻转,状态变化与代码逻辑一致(LED0与LED1始终互补),且无按键抖动导致的多次翻转现象,即可判定案例通过。