打印
[AIROC™ 蓝牙]

【英飞凌CYW20829测评】2.GPIO控制

[复制链接]
453|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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();
}
运行效果



使用特权

评论回复
沙发
地瓜patch| | 2024-6-27 23:10 | 只看该作者
万能的toggle函数

使用特权

评论回复
板凳
caoyunhj2301| | 2024-6-30 14:00 | 只看该作者
这段代码实现了通过两个按钮控制两个LED的闪烁效果。按钮按下次数达到20时,选择控制LED1或LED2,并通过LED计数器控制LED的闪烁频率。

使用特权

评论回复
地板
gaonaiweng| | 2024-6-30 16:35 | 只看该作者
HAL层提供了GPIO初始化方法cyhal_gpio_init

使用特权

评论回复
5
gaonaiweng| | 2024-6-30 16:35 | 只看该作者
函数 app_key_check()
这个函数用来检测按钮的按下情况,并根据按下的次数来更新按钮按下次数变量 btn1_press_count 和 btn2_press_count,当达到指定次数时,更新 led_sel 控制LED的选择。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

143

主题

675

帖子

6

粉丝