GPIO即通用输入输出,是现代电子设备中常见的接口类型之一,它扮演着连接外部设备和处理器的桥梁角色,通过GPIO管脚处理器可以实现与外部设备的数据交换和控制,从而实现系统功能的扩展和完成各种任务
接下来创建个空的工程来熟悉一下CYW20829的GPIO操作,选择Empty APP
main函数里空空的
HAL层提供了GPIO初始化方法cyhal_gpio_init
参数说明:
pin:要配置的GPIO
direction:输入输出方向,可选参数如下
drive_mode:gpio驱动模式,可选参数如下
init_val:初始状态
gpio的控制和输入状态读取方法如下
接下来初始化开发板上的2个LED,并让2个LED交替亮起,BSP里已经有了LED的定义CYBSP_USER_LED1和CYBSP_USER_LED2,查看原理图,LED在输出低电平时亮起
初始化代码
cyhal_gpio_init(CYBSP_USER_LED1, CYHAL_GPIO_DIR_OUTPUT,CYHAL_GPIO_DRIVE_STRONG, CYBSP_LED_STATE_OFF);
cyhal_gpio_init(CYBSP_USER_LED2, CYHAL_GPIO_DIR_OUTPUT,CYHAL_GPIO_DRIVE_STRONG, CYBSP_LED_STATE_ON);
主循环中写入交替亮起代码
for (;;)
{
Cy_SysLib_Delay(500);
cyhal_gpio_toggle(CYBSP_USER_LED1);
cyhal_gpio_toggle(CYBSP_USER_LED2);
}
运行效果
除了手动写代码初始化gpio外,还可以用这个初始化
切换到Pins标签,找到USER_LED,drive mode选择Strong Drive,初始状态LED1选Low,LED2选High
注释掉原来的初始化代码,重新编译烧录运行效果和之前一样
以上是对gpio输出模式的控制,接下来使用gpio输入模式实现对按键状态的检测,这次直接使用配置工具初始化按键的gpio,查看原理图
按键低电平触发,drive mode选择上拉输入
先简单地将按键输入设置为LED输出,这样按下按键时对应的LED就会亮起
for (;;)
{
cyhal_gpio_write(CYBSP_USER_LED1,cyhal_gpio_read(CYBSP_USER_BTN1));
cyhal_gpio_write(CYBSP_USER_LED2,cyhal_gpio_read(CYBSP_USER_BTN2));
}
运行效果
接下来用轮询的方式实现对按键点击的检测,使用延时进行去抖,点击按键后对应的指示灯开始闪烁
uint8_t btn1_press_count = 0;
uint8_t btn2_press_count = 0;
uint16_t led_count = 0;
uint8_t led_sel = 0;
void app_key_check(void)
{
if(!cyhal_gpio_read(CYBSP_USER_BTN1))
{
if(btn1_press_count < 0xFF)
btn1_press_count += 1;
}
else
{
btn1_press_count = 0;
}
if(!cyhal_gpio_read(CYBSP_USER_BTN2))
{
if(btn2_press_count < 0xFF)
btn2_press_count += 1;
}
else
{
btn2_press_count = 0;
}
if(btn1_press_count == 20)
{
led_sel = 0;
}
if(btn2_press_count == 20)
{
led_sel = 1;
}
}
void app_led_loop(void)
{
if(led_count < 300)
led_count += 1;
else
{
led_count = 0;
if(led_sel == 0)
{
cyhal_gpio_toggle(CYBSP_USER_LED1);
cyhal_gpio_write(CYBSP_USER_LED2,CYBSP_LED_STATE_OFF);
}
else
{
cyhal_gpio_write(CYBSP_USER_LED1,CYBSP_LED_STATE_OFF);
cyhal_gpio_toggle(CYBSP_USER_LED2);
}
}
}
主循环
for (;;)
{
Cy_SysLib_Delay(1);
app_led_loop();
app_key_check();
}
运行效果
|