From fe13f8273f8e5275f8d4ca1e892cb8264ad320bf Mon Sep 17 00:00:00 2001 From: stark1898y <1658608470@qq.com> Date: Sun, 15 Dec 2024 16:24:06 +0800 Subject: [PATCH] =?UTF-8?q?bsp=5Fkey=E8=A7=A6=E5=8F=91=E6=9C=89=E7=82=B9?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=8CHAL=5FSLEEP=E5=AF=B9=E5=BA=94?= =?UTF-8?q?=E6=94=B9=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .settings/org.eclipse.core.resources.prefs | 1 + APP/peripheral.c | 15 +- APP/peripheral_main.c | 35 ++- BSP/inc/bsp_key.h | 27 +- BSP/src/bsp_key.c | 329 ++++++++++++++++++++- HAL/SLEEP.c | 33 +++ HAL/include/SLEEP.h | 6 +- 7 files changed, 421 insertions(+), 25 deletions(-) diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index 6827126..a253c4c 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -1,6 +1,7 @@ eclipse.preferences.version=1 encoding//APP/peripheral_main.c=UTF-8 encoding//BSP/inc/bsp_valve.h=UTF-8 +encoding//BSP/src/bsp_key.c=UTF-8 encoding//BSP/src/bsp_valve.c=UTF-8 encoding//common/letter-shell/extensions/log/log.h=UTF-8 encoding//common/letter-shell/shell.c=UTF-8 diff --git a/APP/peripheral.c b/APP/peripheral.c index 72717a8..b5d0f30 100644 --- a/APP/peripheral.c +++ b/APP/peripheral.c @@ -94,17 +94,18 @@ */ static uint8_t Peripheral_TaskID = INVALID_TASK_ID; // Task ID for internal task/event processing +// TODO:响应体,名称加上MAC地址 // GAP - SCAN RSP data (max size = 31 bytes) static uint8_t scanRspData[] = { // complete name 0x12, // length of this data GAP_ADTYPE_LOCAL_NAME_COMPLETE, - 'S', - 'i', - 'm', - 'p', - 'l', - 'e', + 'B', + 'L', + 'E', + 'T', + 'Y', + 'Q', ' ', 'P', 'e', @@ -215,7 +216,7 @@ static uint8_t advertData[] = { #endif // GAP GATT Attributes -static uint8_t attDeviceName[GAP_DEVICE_NAME_LEN] = "Simple Peripheral"; +static uint8_t attDeviceName[GAP_DEVICE_NAME_LEN] = "BLE_TYQ"; // Connection item list static peripheralConnItem_t peripheralConnList; diff --git a/APP/peripheral_main.c b/APP/peripheral_main.c index 440e574..dfe5ece 100644 --- a/APP/peripheral_main.c +++ b/APP/peripheral_main.c @@ -32,15 +32,32 @@ #undef LOG_ENABLE #define LOG_ENABLE 1 -/********************************************************************* - * GLOBAL TYPEDEFS - */ + __attribute__((aligned(4))) uint32_t MEM_BUF[BLE_MEMHEAP_SIZE / 4]; -#if (defined(BLE_MAC)) && (BLE_MAC == TRUE) -const uint8_t MacAddr[6] = {0x84, 0xC2, 0xE4, 0x03, 0x02, 0x02}; -#endif +void app_task_handler(TeAppEvtType app_evt_type) +{ + switch(app_evt_type) + { + case kKeyShort:{ + logDebug("button short press\r\n"); + break; + } + case kKeyLong: + logDebug("button long press\r\n"); + break; + case kKeyRelease: + // BSP_KEY_EnterLowpower(); + DelayMs(10); + BSP_RequestSleep(); + logDebug("gpio relase;BSP_RequestSleep\r\n"); + + break; + default: + break; + } +} /********************************************************************* * @fn Main_Circulation * @@ -163,10 +180,6 @@ int main(void) EMV_CHARGE_OFF_DEINIT; EMV_OFF_DEINIT; - BSP_KEY_Init(); - - - BSP_ADC_Init(); CH59x_BLEInit(); @@ -185,6 +198,8 @@ int main(void) DelayMs(100); GXHTC3C_Init(); + BSP_KEY_Init(app_task_handler); + Main_Circulation(); } diff --git a/BSP/inc/bsp_key.h b/BSP/inc/bsp_key.h index c739711..4aa94cc 100644 --- a/BSP/inc/bsp_key.h +++ b/BSP/inc/bsp_key.h @@ -1,17 +1,40 @@ #ifndef __BSP_KEY_H__ #define __BSP_KEY_H__ +#include "CONFIG.h" -#include "CH59x_common.h" +#include +#include +#define KEY_TIMOUT_MS 1000 +#define KEY_LONG_PRESS_MS 5000 +#define KEY_SACN_MS 40 +#define KEY_SCAN_EVT (0x0001 << 0) +#define KEY_WAKEUP_EVT (0x0001 << 1) +#define KEY_RELEASE_EVT (0x0001 << 2) +#define KEY_IDLE_TIMEOUT_EVT (0x0001 << 2) +// KEY_B_PIN at PB7,low->active +#define KEY_B_PIN GPIO_Pin_7 +#define IS_KEY_Vaild() ((GPIOB_ReadPortPin(KEY_B_PIN) ? 0 : 1)) +typedef enum +{ + kKeyShort = 0, + kKeyLong, + kKeyRelease, +} TeAppEvtType; -void BSP_KEY_Init(void); +typedef void (*app_task_evt_handler_t)(TeAppEvtType app_task_evt_type); +void BSP_KEY_EnterLowpower(void); +void BSP_KEY_ExitLowpower(void); +void BSP_KEY_Init(app_task_evt_handler_t handler); + +void KEY_ProcessLoop(void); #endif // !__BSP_KEY_H__ diff --git a/BSP/src/bsp_key.c b/BSP/src/bsp_key.c index 1d62190..8369b02 100644 --- a/BSP/src/bsp_key.c +++ b/BSP/src/bsp_key.c @@ -1,14 +1,333 @@ #include "bsp_key.h" +#include "bsp_uart.h" +#include "log.h" +#include "SLEEP.h" +// https://www.cnblogs.com/iot-fan/p/14304943.html +#undef LOG_ENABLE +#define LOG_ENABLE 1 +#undef LOG_TAG +#define LOG_TAG "key" -void BSP_KEY_Init(void) +tmosTaskID key_task_id = INVALID_TASK_ID; + +volatile uint8_t key_wakeup_flag = 0; +volatile uint8_t key_timeout_flag = 0; + +static app_task_evt_handler_t p_handler = NULL; + +static volatile uint8_t key_timeout_cnt = 0; + +static void KEY_Task_ProcessTmosMsg(tmos_event_hdr_t *pMsg) { - // KEY - GPIOB_SetBits(GPIO_Pin_15); - // 鐢卞閮ㄤ笂鎷夌數闃讳簡 - GPIOB_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_Floating); + switch (pMsg->event) + { + default: + logDebug("pMsg->event %04x", pMsg->event); + break; + } +} + +#if 1 +static uint16_t KEY_Task_ProcessEvent(uint8_t task_id, uint16_t events) +{ + if (events & SYS_EVENT_MSG) + { + uint8_t *pMsg; + if ((pMsg = tmos_msg_receive(key_task_id)) != NULL) + { + KEY_Task_ProcessTmosMsg((tmos_event_hdr_t *)pMsg); + // Release the TMOS message + tmos_msg_deallocate(pMsg); + } + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + + if (events & KEY_SCAN_EVT) + { + static volatile uint8_t key_vaild_times = 0; + static volatile bool key_vaild_for_long_press = false; + if (IS_KEY_Vaild()) + { + if (key_vaild_times > (KEY_LONG_PRESS_MS / KEY_SACN_MS)) + { //> 20ms*100=2000ms + if (false == key_vaild_for_long_press) + { + if (NULL != p_handler) + { + p_handler(kKeyLong); + } + // PRINT("WE should power switch here\r\n"); + key_vaild_for_long_press = true; + } + } + else + { + key_vaild_times++; + } + key_timeout_cnt = 10; + } + else + { // button release + + if (key_vaild_times) + { + if ((key_vaild_times) < (KEY_LONG_PRESS_MS / KEY_SACN_MS)) + { + p_handler(kKeyShort); + } + key_vaild_times = 0; + // PRINT("KEY VAILED\r\n"); + } + + key_vaild_for_long_press = false; + } + if (key_timeout_cnt) + { + key_timeout_cnt--; + logDebug("key_timeout_cnt %d", key_timeout_cnt); + tmos_start_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(KEY_SACN_MS)); // 40ms + } + else + { + p_handler(kKeyRelease); + } + return (events ^ KEY_SCAN_EVT); + } + + // Discard unknown events + return 0; +} + +#endif + +// 鐢辨寜閿腑鏂敜閱掑悗寮鍚寜閿壂鎻 +void BSP_KEY_EnterLowpower(void) +{ + // key_wakeup_flag = 0; + // tmos_stop_task(key_task_id, KEY_SCAN_EVT); + + // R16_PB_INT_MODE |= KEY_B_PIN; // edge mode + // GPIOB_ResetBits(KEY_B_PIN); // edge fall + // R16_PB_INT_IF = KEY_B_PIN; + // R16_PB_INT_EN |= KEY_B_PIN; + + // 鐢卞閮ㄤ笂鎷夌數闃讳簡 + // 璁剧疆涓烘诞绌鸿緭鍏ユā寮 + // GPIOB_SetBits(KEY_B_PIN); + // GPIOB_ModeCfg(KEY_B_PIN, GPIO_ModeIN_PU); + + // TODO:鎸夐敭鐢靛钩瑙﹀彂璁剧疆 + // 涓嬮檷娌胯Е鍙 + GPIOB_ITModeCfg(KEY_B_PIN, GPIO_ITMode_FallEdge); + + // 寮鍚疓PIO鐨勭潯鐪犲敜閱,濡傛灉闇瑕佺殑璇 + // PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay); + PWR_PeriphWakeUpCfg(ENABLE, RB_GPIO_WAKE_MODE | RB_SLP_GPIO_WAKE, Long_Delay); + + // 寮鍚疓PIOB涓柇 + PFIC_EnableIRQ(GPIO_B_IRQn); + + BSP_RequestSleep(); +} + +void BSP_KEY_ExitLowpower(void) +{ + BSP_BlockSleep(); + + // 鍏抽棴GPIOB涓柇 + PFIC_DisableIRQ(GPIO_B_IRQn); + PWR_PeriphWakeUpCfg(DISABLE, RB_GPIO_WAKE_MODE | RB_SLP_GPIO_WAKE, Long_Delay); +} + +#if 0 +uint8_t read_button_GPIO(uint8_t button_id) +{ + // you can share the GPIO read function with multiple Buttons + switch(button_id) + { + case btn1_id: + return (uint8_t)GPIOB_ReadPortPin(KEY_B_PIN); + default: + // logAssert(0, while (1)); + return 0; + } +} + +void BTN1_PRESS_DOWN_Handler(void* btn) +{ + logDebug("BTN1_PRESS_DOWN_Handler"); + // BSP_KEY_EnterLowpower(); +} + +void BTN1_PRESS_UP_Handler(void* btn) +{ + logDebug("BTN1_PRESS_UP_Handler"); + tmos_stop_task(key_task_id, KEY_IDLE_TIMEOUT_EVT); + tmos_start_task(key_task_id, KEY_IDLE_TIMEOUT_EVT, MS1_TO_SYSTEM_TIME(1000 * 5)); + logDebug("tmos_start_task KEY_IDLE_TIMEOUT_EVT"); + // BSP_KEY_EnterLowpower(); +} + +void BTN1_SINGLE_Click_Handler(void* btn) +{ + logDebug("BTN1_SINGLE_Click_Handler"); + // BSP_KEY_EnterLowpower(); +} + +void BTN1_DOUBLE_Click_Handler(void* btn) +{ + logDebug("BTN1_DOUBLE_Click_Handler"); + // BSP_KEY_EnterLowpower(); +} + +void BTN1_LONG_PRESS_START_Handler(void* btn) +{ + logDebug("BTN1_LONG_PRESS_START_Handler"); + // BSP_KEY_EnterLowpower(); +} + +static uint16_t KEY_Task_ProcessEvent(uint8_t task_id, uint16_t events) +{ + if (events & SYS_EVENT_MSG) + { + uint8_t *pMsg; + if ((pMsg = tmos_msg_receive(key_task_id)) != NULL) + { + KEY_Task_ProcessTmosMsg((tmos_event_hdr_t *)pMsg); + // Release the TMOS message + tmos_msg_deallocate(pMsg); + } + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + // if (events & KEY_WAKEUP_EVT) + // { + // logDebug("KEY_WAKEUP_EVT"); + + // BSP_KEY_ExitLowpower(); + // return (events ^ KEY_WAKEUP_EVT); + // } + if (events & KEY_SCAN_EVT) + { + // 鎸夐敭娌℃姮璧锋潵灏辩户缁壂鎻 + if (0 == key_timeout_flag) + { + tmos_start_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(5)); + } + else + { + logDebug("KEY_SCAN_EVT timeout"); + BSP_KEY_EnterLowpower(); + } + // logDebug("KEY_SCAN_EVT"); + button_ticks(); + + return (events ^ KEY_SCAN_EVT); + } + if (events & KEY_IDLE_TIMEOUT_EVT) + { + tmos_stop_task(key_task_id, KEY_SCAN_EVT); + BSP_KEY_EnterLowpower(); + logDebug("KEY_IDLE_TIMEOUT_EVT"); + key_timeout_flag = 1; + return (events ^ KEY_IDLE_TIMEOUT_EVT); + } + + + // Discard unknown events + return 0; +} +#endif + +void BSP_KEY_Init(app_task_evt_handler_t handler) +{ + p_handler = handler; + key_task_id = TMOS_ProcessEventRegister(KEY_Task_ProcessEvent); + + // 鐢卞閮ㄤ笂鎷夌數闃讳簡 + // 璁剧疆涓烘诞绌鸿緭鍏ユā寮 + // GPIOB_SetBits(KEY_B_PIN); + GPIOB_ModeCfg(KEY_B_PIN, GPIO_ModeIN_PU); + + // 涓嬮檷娌胯Е鍙 + GPIOB_ITModeCfg(KEY_B_PIN, GPIO_ITMode_FallEdge); + + // 寮鍚疓PIO鐨勭潯鐪犲敜閱,濡傛灉闇瑕佺殑璇 + // PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay); + PWR_PeriphWakeUpCfg(ENABLE, RB_GPIO_WAKE_MODE | RB_SLP_GPIO_WAKE, Long_Delay); + + // 寮鍚疓PIOB涓柇 + PFIC_EnableIRQ(GPIO_B_IRQn); + + tmos_start_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(KEY_SACN_MS)); + + // tmos_start_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(5)); + + //寮濮嬩竴涓畾鏃朵簨浠,涓嶆柇鐨勬墽琛,闄ら潪杩愯tmos_stop_task鍏虫帀, + //tmosTimer鍏蜂綋鏄 1600 = 1s + // BSP_KEY_EnterLowpower(); +} + +__HIGH_CODE +__attribute__((noinline)) +void KEY_ProcessLoop(void) +{ + // { + // if (R16_PB_INT_IF & KEY_B_PIN) + // { + // R16_PB_INT_IF = KEY_B_PIN; + // tmos_set_event(key_task_id, KEY_SCAN_EVT); + // logDebug("KEY_ProcessLoop"); + // } + // } + if (key_wakeup_flag) + { + key_wakeup_flag = 0; + tmos_set_event(key_task_id, KEY_SCAN_EVT); + logDebug("KEY_ProcessLoop"); + } + + + // if (key_wakeup_flag) + // { + // key_wakeup_flag = 0; + // tmos_set_event(key_task_id, KEY_SCAN_EVT); + // // tmos_start_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(20)); + // // tmos_start_task(key_task_id, KEY_IDLE_TIMEOUT_EVT, MS1_TO_SYSTEM_TIME(1000 * 10)); + // logDebug("key_wakeup_flag"); + // } +} + + +__INTERRUPT // 鍛婅瘔缂栬瘧鍣ㄤ娇鐢ㄧ‖浠跺帇鏍 +__HIGH_CODE // 鏀惧埌RAM閲 +void GPIOB_IRQHandler(void) +{ + // 闃绘鐫$湢 + BSP_BlockSleep(); + // 鍏虫寜閿腑鏂 + BSP_KEY_ExitLowpower(); + + logDebug("KEY IRQ"); + + GPIOB_ClearITFlagBit(KEY_B_PIN); + + key_wakeup_flag = 1; + // key_timeout_flag = 0; + + // BSP_BlockSleep(); + + // if (R16_PB_INT_IF & KEY_B_PIN) + // { + // R16_PB_INT_IF = KEY_B_PIN; + // // tmos_set_event(key_task_id, KEY_SCAN_EVT); + // BSP_KEY_ExitLowpower(); + // } + // tmos_set_event(key_task_id,KEY_SCAN_EVT); } diff --git a/HAL/SLEEP.c b/HAL/SLEEP.c index f33267e..97be725 100644 --- a/HAL/SLEEP.c +++ b/HAL/SLEEP.c @@ -14,6 +14,31 @@ /* 头文件包含 */ #include "HAL.h" +#include "bsp_key.h" + +#include "log.h" +#include "bsp_uart.h" + + +#undef LOG_ENABLE +#define LOG_ENABLE 1 + +#undef LOG_TAG +#define LOG_TAG "sleep" + +static volatile bool block_sleep_flag = false; + +void BSP_RequestSleep(void) +{ + block_sleep_flag = false; +} + +void BSP_BlockSleep(void) +{ + block_sleep_flag = true; +} + + /******************************************************************************* * @fn CH59x_LowPower * @@ -25,6 +50,11 @@ */ uint32_t CH59x_LowPower(uint32_t time) { + if( true == block_sleep_flag) + { + // logDebug("block_sleep"); + return 0; + } #if (defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE) volatile uint32_t i; uint32_t time_sleep, time_curr; @@ -76,10 +106,13 @@ uint32_t CH59x_LowPower(uint32_t time) // LOW POWER-sleep模式 if (!RTCTigFlag) { + BSP_KEY_EnterLowpower(); + LowPower_Sleep(RB_PWR_RAM2K | RB_PWR_RAM24K | RB_PWR_EXTEND | RB_XT_PRE_EN); HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流) i = RTC_GetCycle32k(); while (i == RTC_GetCycle32k()); + return 0; } #endif diff --git a/HAL/include/SLEEP.h b/HAL/include/SLEEP.h index ffacb5e..1e798dc 100644 --- a/HAL/include/SLEEP.h +++ b/HAL/include/SLEEP.h @@ -6,7 +6,7 @@ * Description : ********************************************************************************* * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. - * Attention: This software (modified or not) and binary are used for + * Attention: This software (modified or not) and binary are used for * microcontroller manufactured by Nanjing Qinheng Microelectronics. *******************************************************************************/ @@ -22,6 +22,10 @@ extern "C" { * GLOBAL VARIABLES */ +void BSP_RequestSleep(void); +void BSP_BlockSleep(void); + + /********************************************************************* * FUNCTIONS */