日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蓝牙BLE芯片PHY6222之GPIO按键操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

藍牙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

總結

以上是生活随笔為你收集整理的蓝牙BLE芯片PHY6222之GPIO按键操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。