在TMOS系統中新增按鍵檢測功能
阿新 • • 發佈:2022-12-12
TMOS系統中自帶有按鍵檢測輪詢功能,預設100ms檢測一次,在debug時很有幫助。不過在需要低功耗休眠的前提下,檢測按鍵需要頻繁喚醒,影響功耗,故多數BLE的工程都沒有用到這個功能。程式碼貼在了最後。
啟用按鍵查詢,先要在工程配置中新增HAL_KEY,以及確保KEY.c新增進編譯。
然後新增按鍵處理函式,函式名自擬,但是形參須為(uint8_t keys),呼叫HalKeyConfig函式註冊一下。
這樣預設程式碼中配置好了PB22和PB4兩個按鍵,如上圖新增,評估板上用PB4作為按鍵,就已經可以跑起來。如果需要更多按鍵,可以如下圖新增處理,下圖中新增到了總計5個按鍵,可以新增B組引腳,也可以新增A組引腳。
在KEY.c中需要做如下修改。
在KEY.h中需要做如下修改。
列印如下,支援同時檢測多個按鍵按下。
/*KEY.c中的修改後程式碼*/ /************************************************************************************************** * @fn HAL_KeyInit * * @brief Initilize Key Service * * @param none * * @return None **************************************************************************************************/ void HAL_KeyInit(void) { /* Initialize previous key to 0 */ halKeySavedKeys = 0; /* Initialize callback function */ pHalKeyProcessFunction = NULL; KEY1_DIR; KEY1_PU; KEY2_DIR; KEY2_PU; KEY3_DIR; //JW KEY3_PU; KEY4_DIR; //JW KEY4_PU; KEY5_DIR;//JW KEY5_PU; } /************************************************************************************************** * @fn HalKeyConfig * * @brief Configure the Key serivce * * @param cback - pointer to the CallBack function * * @return None **************************************************************************************************/ void HalKeyConfig(halKeyCBack_t cback) { /* Register the callback fucntion */ pHalKeyProcessFunction = cback; tmos_start_task(halTaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE); /* Kick off polling */ } /************************************************************************************************** * @fn HalKeyRead * * @brief Read the current value of a key * * @param None * * @return keys - current keys status **************************************************************************************************/ uint8_t HalKeyRead(void) { uint8_t keys = 0; if(HAL_PUSH_BUTTON1()) { //讀按鍵1 keys |= HAL_KEY_SW_1; } if(HAL_PUSH_BUTTON2()) { //讀按鍵2 keys |= HAL_KEY_SW_2; } if(HAL_PUSH_BUTTON3()) { //讀按鍵3 keys |= HAL_KEY_SW_3; } if(HAL_PUSH_BUTTON4()) { //讀按鍵4 keys |= HAL_KEY_SW_4; } if(HAL_PUSH_BUTTON5()) //JW { //讀按鍵5 keys |= HAL_KEY_SW_5; } return keys; } /************************************************************************************************** * @fn HAL_KeyPoll * * @brief Called by hal_driver to poll the keys * * @param None * * @return None **************************************************************************************************/ void HAL_KeyPoll(void) { uint8_t keys = 0; if(HAL_PUSH_BUTTON1()) { keys |= HAL_KEY_SW_1; } if(HAL_PUSH_BUTTON2()) { keys |= HAL_KEY_SW_2; } if(HAL_PUSH_BUTTON3()) { keys |= HAL_KEY_SW_3; } if(HAL_PUSH_BUTTON4()) { keys |= HAL_KEY_SW_4; } if(HAL_PUSH_BUTTON5()) //JW { keys |= HAL_KEY_SW_5; } if(keys == halKeySavedKeys) { /* Exit - since no keys have changed */ return; } halKeySavedKeys = keys; /* Store the current keys for comparation next time */ /* Invoke Callback if new keys were depressed */ if(keys && (pHalKeyProcessFunction)) { (pHalKeyProcessFunction)(keys); } }
/*KEY.h中的修改後程式碼*/ /************************************************************************************************** * MACROS **************************************************************************************************/ #define HAL_KEY_POLLING_VALUE 100 /* Switches (keys) */ #define HAL_KEY_SW_1 0x01 // key1 #define HAL_KEY_SW_2 0x02 // key2 #define HAL_KEY_SW_3 0x04 // key3 #define HAL_KEY_SW_4 0x08 // key4 #define HAL_KEY_SW_5 0x10 // key5 //JW /* 按鍵定義 */ /* 1 - KEY */ #define KEY1_BV BV(22) #define KEY2_BV BV(4) #define KEY3_BV BV(8) //JW #define KEY4_AV (1 << 10) //JW #define KEY5_AV (1 << 15) //JW #define KEY1_PU (R32_PB_PU |= KEY1_BV) #define KEY2_PU (R32_PB_PU |= KEY2_BV) #define KEY3_PU (R32_PB_PU |= KEY3_BV) //JW #define KEY4_PU (R32_PA_PU |= KEY4_AV) //JW #define KEY5_PU (R32_PA_PU |= KEY5_AV) //JW #define KEY1_DIR (R32_PB_DIR &= ~KEY1_BV) #define KEY2_DIR (R32_PB_DIR &= ~KEY2_BV) #define KEY3_DIR (R32_PB_DIR &= ~KEY3_BV) //JW #define KEY4_DIR (R32_PA_DIR &= ~KEY4_AV) //JW #define KEY5_DIR (R32_PA_DIR &= ~KEY5_AV) //JW #define KEY1_IN (ACTIVE_LOW(R32_PB_PIN & KEY1_BV)) #define KEY2_IN (ACTIVE_LOW(R32_PB_PIN & KEY2_BV)) #define KEY3_IN (ACTIVE_LOW(R32_PB_PIN & KEY3_BV)) //JW #define KEY4_IN (ACTIVE_LOW(R32_PA_PIN & KEY4_AV)) //JW #define KEY5_IN (ACTIVE_LOW(R32_PA_PIN & KEY5_AV)) //JW #define HAL_PUSH_BUTTON1() (KEY1_IN) //新增自定義按鍵 #define HAL_PUSH_BUTTON2() (KEY2_IN) #define HAL_PUSH_BUTTON3() (KEY3_IN) //JW #define HAL_PUSH_BUTTON4() (KEY4_IN) //JW #define HAL_PUSH_BUTTON5() (KEY5_IN) //JW