蓝牙BLE芯片PHY6222之GPIO按键操作

news/2025/1/13 2:41:38/

蓝牙BLE芯片PHY6222之GPIO按键操作

  • 按键唤醒
    • IO初始化
    • 按键中断唤醒回调
    • 短按&长按触发的事件

按键唤醒

IO初始化

void key_init(void)
{uint8 i;key_state.key[0].pin = GPIO_P14;key_state.key[0].idle_level = HAL_HIGH_IDLE;hal_gpio_pin_init(P14, IE);hal_gpio_pull_set(P14, GPIO_PULL_UP_S);key_state.key_callbank = key_press_evt;//按键按下触发的回调hal_gpioin_register(P14, pin_event_handler, pin_event_handler);//可配置成GPIO的引脚都可产生中断唤醒hal_pwrmgr_register(MOD_USR1, NULL, NULL);
}
static void key_press_evt(uint8_t i, key_evt_t key_evt)
{LOG("\nkey index:%d gpio:%d ", i, key_state.key[i].pin);switch(key_evt){case HAL_KEY_EVT_PRESS:LOG("key(press down)\n");break;case HAL_KEY_EVT_RELEASE:LOG("key(press release)\n");break;
#ifdef HAL_KEY_SUPPORT_LONG_PRESScase HAL_KEY_EVT_LONG_RELEASE:hal_pwrmgr_unlock(MOD_USR1);LOG("key(long press release)\n");break;
#endifdefault:LOG("unexpect\n");break;}
}

按键中断唤醒回调

static void pin_event_handler(gpio_pin_e pin,IO_Wakeup_Pol_e type)
{uint8 i;for(i = 0; i < HAL_KEY_NUM; i++){if(pin == key_state.key[i].pin)break;}if(i < HAL_KEY_NUM){switch(key_state.key[i].state){case HAL_STATE_KEY_IDLE:key_idle_handler(i,type);break;case HAL_STATE_KEY_PRESS_DEBOUNCE:key_press_debonce_handler(i,type);break;case HAL_STATE_KEY_PRESS:key_press_handler(i,type);break;case HAL_STATE_KEY_RELEASE_DEBOUNCE:key_release_debonce_handler(i,type);break;default:break;}}
}
static void key_idle_handler(uint8 i,IO_Wakeup_Pol_e type)
{if(((type == NEGEDGE) && (key_state.key[i].idle_level == HAL_HIGH_IDLE)) ||((type == POSEDGE) && (key_state.key[i].idle_level == HAL_LOW_IDLE))){hal_pwrmgr_lock(MOD_USR1);//lock住mod_usr1---禁止睡眠key_state.key[i].state = HAL_STATE_KEY_PRESS_DEBOUNCE;//改变状态key_state.temp[i].in_enable = TRUE;key_timer_start(HAL_KEY_DEBOUNCD);//20ms消抖}
}static void key_press_debonce_timer_handler(uint8 i)
{//读取IO的状态if(((hal_gpio_read(key_state.key[i].pin) == FALSE) && (key_state.key[i].idle_level == HAL_HIGH_IDLE)) ||((hal_gpio_read(key_state.key[i].pin) == TRUE) && (key_state.key[i].idle_level == HAL_LOW_IDLE))){#ifdef HAL_KEY_SUPPORT_LONG_PRESS//3s后读取状态,触发按键长按的事件osal_start_timerEx(key_state.task_id,KEY_DEMO_LONG_PRESS_EVT,HAL_KEY_LONG_PRESS_TIME);#endifhal_pwrmgr_unlock(MOD_USR1);key_state.key[i].state = HAL_STATE_KEY_PRESS;key_state.temp[i].timer_tick = getMcuPrecisionCount();if(key_state.key_callbank != NULL){key_state.key_callbank(i,HAL_KEY_EVT_PRESS);//执行初始化时key_press_evt的回调}}else{key_state.key[i].state = HAL_STATE_KEY_IDLE;key_state.temp[i].in_enable = FALSE;}
}

短按&长按触发的事件

    if( events & HAL_KEY_EVENT)                                                     //do not modify,key will use it{for (uint8 i = 0; i < HAL_KEY_NUM; ++i){if ((key_state.temp[i].in_enable == TRUE) ||(key_state.key[i].state == HAL_STATE_KEY_RELEASE_DEBOUNCE)){gpio_key_timer_handler(i);}}return (events ^ HAL_KEY_EVENT);}#ifdef HAL_KEY_SUPPORT_LONG_PRESSif( events & KEY_DEMO_LONG_PRESS_EVT){for (int i = 0; i < HAL_KEY_NUM; ++i){if(key_state.key[i].state == HAL_KEY_EVT_PRESS){LOG("key:%d gpio:%d	", i, key_state.key[i].pin);LOG("key(long press down)");//user app code long press down process这里实现长按的应用操作}}return (events ^ KEY_DEMO_LONG_PRESS_EVT);}#endif

在这里插入图片描述
注意:在PHY622的J版本(新版本)的芯片上要把P16,P17配置成GPIO的话可参考以下设置,J版本以前的芯片不支持配置成GPIO

链接:https://pan.baidu.com/s/1RdqHDBvVHyYBnK7RqHJk7w
提取码:xet2

在这里插入图片描述


http://www.ppmy.cn/news/724229.html

相关文章

蓝牙BLE芯片PHY6222之Peripheral从机自定义service服务

蓝牙BLE芯片PHY6222之Peripheral从机自定义service 环境蓝牙通信相关知识点直接看代码 环境 SDK及路径&#xff1a;SDK\PHY62XX_SDK_3.1.1_0922\example\ble_peripheral\simpleBlePeripheral 硬件&#xff1a;PHY6222开发板 APP&#xff1a;nRF connect 蓝牙通信相关知识点 …

BLE芯片PHY6222的ANCS代码解读

BLE芯片PHY6222的ANCS代码解读 ANCS是什么实现原理PHY6222软件实现框架要获取的详细信息开通知源通知源的解析数据源的解析 ANCS是什么 ANCS&#xff08;苹果通知中心, Apple Notification Center Service&#xff09;的目的是提供给蓝牙外设通过蓝牙设备上的GATT 客户端发现I…

蓝牙BLE芯片PHY6222之RTC计时

蓝牙BLE芯片PHY6222之RTC计时 个人建议使用外部32K作为RTC的时钟源&#xff0c;精度相对6222内部32K高很多&#xff0c;内部32K看官方资料是500ppm的时钟精度 RTC驱动 datetime_t ttdatetime; #define UNIX_2000 946656000 UTCTimeStruct user_get_utc(void); void user_se…

phy6222 IIC从机配置

phy6222 IIC从机配置 一、IIC从机初始化配置 void user_iic_slave_init(void) {hal_gpio_pin_init(P33, IE);hal_gpio_pin_init(P34, IE);hal_gpio_pull_set(P33, STRONG_PULL_UP);hal_gpio_pull_set(P34, STRONG_PULL_UP);uint8_t op_ret 0;I2C_Slave_Parameter iic_slave_…

蓝牙PHY6222添加OTA升级功能

主要步骤&#xff1a; 1&#xff1a;代码添加 ota_app_service 2&#xff1a;keil软件添加ota_app代码 3&#xff1a;烧录软件添加ota设置 4&#xff1a;手机ota_app升级准备&#xff1a; 奉加微电子官网下载6222的代码SDK&#xff0c;V3.0以上 下载官网的PhyPlusKit串口烧录工…

蓝牙BLE芯片PHY6222之I2C主从通信

蓝牙BLE芯片PHY6222之I2C主从通信 开发环境I2C主机I2C从机注意事项 开发环境 1.PHY6222开发板 2.SDK版本以及路径&#xff1a;SDK\release_bbb_sdk-PHY62XX_SDK_3.0.9\example\peripheral\gpio 3.硬件连接 SDA  GPIO_P33----------GPIO_33 CLK  GPIO_P34----------GPIO_34…

蓝牙BLE芯片PHY6222之OTA

蓝牙BLE芯片PHY6222之OTA 什么是OTA将OTA驱动移植到应用代码一、SLB移植用PhyPlusKit烧录支持SLB的文件支持SLB的OTA bin文件的制作使用APP进行SLB升级二、Single Bank 移植用PhyPlusKit烧录支持Single Bank的OTA文件支持Single Bank OTA 的hex16文件制作使用APP进行Single Ban…

如何修改Jupyter Notebook的默认目录和默认浏览器

一、修改默认目录 Jupyter Notebook的文件默认保存目录是C:\Users\Administrator&#xff0c;默认目录可在黑窗口中查看&#xff0c;如下图所示&#xff1a; 为了方便文档的管理&#xff0c;可将默认目录修改成自己想保存的地方。修改方法如下&#xff1a; 1、找到config文件 …