[AIROC™ 蓝牙] 【英飞凌CYW20829测评】2.GPIO控制

[复制链接]
1043|6
 楼主| yuyy1989 发表于 2024-6-19 22:37 | 显示全部楼层 |阅读模式
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在输出低电平时亮起

初始化代码
  1. cyhal_gpio_init(CYBSP_USER_LED1, CYHAL_GPIO_DIR_OUTPUT,CYHAL_GPIO_DRIVE_STRONG, CYBSP_LED_STATE_OFF);
  2. cyhal_gpio_init(CYBSP_USER_LED2, CYHAL_GPIO_DIR_OUTPUT,CYHAL_GPIO_DRIVE_STRONG, CYBSP_LED_STATE_ON);
主循环中写入交替亮起代码
  1. for (;;)
  2. {
  3.         Cy_SysLib_Delay(500);
  4.         cyhal_gpio_toggle(CYBSP_USER_LED1);
  5.         cyhal_gpio_toggle(CYBSP_USER_LED2);
  6. }
运行效果

除了手动写代码初始化gpio外,还可以用这个初始化

切换到Pins标签,找到USER_LED,drive mode选择Strong Drive,初始状态LED1选Low,LED2选High

注释掉原来的初始化代码,重新编译烧录运行效果和之前一样
以上是对gpio输出模式的控制,接下来使用gpio输入模式实现对按键状态的检测,这次直接使用配置工具初始化按键的gpio,查看原理图

按键低电平触发,drive mode选择上拉输入

先简单地将按键输入设置为LED输出,这样按下按键时对应的LED就会亮起
  1. for (;;)
  2. {
  3.         cyhal_gpio_write(CYBSP_USER_LED1,cyhal_gpio_read(CYBSP_USER_BTN1));
  4.         cyhal_gpio_write(CYBSP_USER_LED2,cyhal_gpio_read(CYBSP_USER_BTN2));
  5. }
运行效果

接下来用轮询的方式实现对按键点击的检测,使用延时进行去抖,点击按键后对应的指示灯开始闪烁
  1. uint8_t btn1_press_count = 0;
  2. uint8_t btn2_press_count = 0;
  3. uint16_t led_count = 0;
  4. uint8_t led_sel = 0;

  5. void app_key_check(void)
  6. {
  7.         if(!cyhal_gpio_read(CYBSP_USER_BTN1))
  8.         {
  9.                 if(btn1_press_count < 0xFF)
  10.                         btn1_press_count += 1;
  11.         }
  12.         else
  13.         {
  14.                 btn1_press_count = 0;
  15.         }
  16.         if(!cyhal_gpio_read(CYBSP_USER_BTN2))
  17.         {
  18.                 if(btn2_press_count < 0xFF)
  19.                         btn2_press_count += 1;
  20.         }
  21.         else
  22.         {
  23.                 btn2_press_count = 0;
  24.         }
  25.         if(btn1_press_count == 20)
  26.         {
  27.                 led_sel = 0;
  28.         }
  29.         if(btn2_press_count == 20)
  30.         {
  31.                 led_sel = 1;
  32.         }
  33. }

  34. void app_led_loop(void)
  35. {
  36.         if(led_count < 300)
  37.                 led_count += 1;
  38.         else
  39.         {
  40.                 led_count = 0;
  41.                 if(led_sel == 0)
  42.                 {
  43.                         cyhal_gpio_toggle(CYBSP_USER_LED1);
  44.                         cyhal_gpio_write(CYBSP_USER_LED2,CYBSP_LED_STATE_OFF);
  45.                 }
  46.                 else
  47.                 {
  48.                         cyhal_gpio_write(CYBSP_USER_LED1,CYBSP_LED_STATE_OFF);
  49.                         cyhal_gpio_toggle(CYBSP_USER_LED2);
  50.                 }
  51.         }
  52. }
主循环
  1. for (;;)
  2. {
  3.         Cy_SysLib_Delay(1);
  4.         app_led_loop();
  5.         app_key_check();
  6. }
运行效果



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
地瓜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

gaonaiweng 发表于 2024-6-30 16:35 | 显示全部楼层
函数 app_key_check()
这个函数用来检测按钮的按下情况,并根据按下的次数来更新按钮按下次数变量 btn1_press_count 和 btn2_press_count,当达到指定次数时,更新 led_sel 控制LED的选择。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:同飞软件研发工程师
简介:制冷系统单片机软件开发,使用PID控制温度

168

主题

826

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部