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();
- }
运行效果
|