diff --git a/APP/peripheral_main.c b/APP/peripheral_main.c index 7e85650..f6d0212 100644 --- a/APP/peripheral_main.c +++ b/APP/peripheral_main.c @@ -38,26 +38,27 @@ __attribute__((aligned(4))) uint32_t MEM_BUF[BLE_MEMHEAP_SIZE / 4]; -// void app_task_handler(TeAppEvtType app_evt_type) -// { -// switch(app_evt_type) -// { -// case kKeyShort:{ -// PRINT("button short press\r\n"); -// break; -// } -// case kKeyLong: -// PRINT("button long press\r\n"); +void app_task_handler(TeAppEvtType app_evt_type) +{ + switch(app_evt_type) + { + case kKeyShort:{ + PRINT("button short press\r\n"); + break; + } + case kKeyLong: + PRINT("button long press\r\n"); -// break; -// case kKeyRelease: -// PRINT("gpio relase\r\n"); + break; + case kKeyRelease: + BSP_KEY_EnterLowpower(); + PRINT("gpio relase\r\n"); -// break; -// default: -// break; -// } -// } + break; + default: + break; + } +} /********************************************************************* * @fn Main_Circulation @@ -154,7 +155,7 @@ void Main_Circulation() */ void BLE_AdvertiseEventCB(uint32_t timeUs) { - logDebug("BLE_AdvertiseEventCB"); + // logDebug("BLE_AdvertiseEventCB"); } /********************************************************************* @@ -215,7 +216,8 @@ int main(void) // DelayMs(100); // } - BSP_KEY_Init(); + // BSP_KEY_Init(); + BSP_KEY_Init(app_task_handler); Main_Circulation(); } diff --git a/BSP/inc/bsp_key.h b/BSP/inc/bsp_key.h index f60e049..dc40eda 100644 --- a/BSP/inc/bsp_key.h +++ b/BSP/inc/bsp_key.h @@ -23,11 +23,12 @@ typedef enum kKeyRelease, } TeAppEvtType; +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(void); +void BSP_KEY_Init(app_task_evt_handler_t handler); void KEY_ProcessLoop(void); diff --git a/BSP/src/bsp_key.c b/BSP/src/bsp_key.c index d70ba05..59fb0a8 100644 --- a/BSP/src/bsp_key.c +++ b/BSP/src/bsp_key.c @@ -1,7 +1,5 @@ #include "bsp_key.h" -#include "multi_button.h" - #include "bsp_uart.h" #include "log.h" @@ -15,17 +13,15 @@ #undef LOG_TAG #define LOG_TAG "key" -enum Button_IDs { - btn1_id, -}; - -struct Button btn1; - 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) { switch (pMsg->event) @@ -36,7 +32,9 @@ static void KEY_Task_ProcessTmosMsg(tmos_event_hdr_t *pMsg) } } -#if 0 +#define KEY_TIMOUT_MS 5000 + +#if 1 static uint16_t KEY_Task_ProcessEvent(uint8_t task_id, uint16_t events) { if (events & SYS_EVENT_MSG) @@ -74,7 +72,7 @@ static uint16_t KEY_Task_ProcessEvent(uint8_t task_id, uint16_t events) { key_vaild_times++; } - key_timeout_cnt = 10; + key_timeout_cnt = KEY_TIMOUT_MS / 100; } else { // button release @@ -94,7 +92,7 @@ static uint16_t KEY_Task_ProcessEvent(uint8_t task_id, uint16_t events) if (key_timeout_cnt) { key_timeout_cnt--; - tmos_start_task(key_task_id, KEY_SCAN_EVT, 64); // 40ms + tmos_start_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(100)); // 40ms } else { @@ -112,8 +110,8 @@ static uint16_t KEY_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 由按键中断唤醒后开启按键扫描 void BSP_KEY_EnterLowpower(void) { - key_wakeup_flag = 0; - tmos_stop_task(key_task_id, KEY_SCAN_EVT); + // 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 @@ -147,26 +145,9 @@ void BSP_KEY_ExitLowpower(void) // tmos_start_reload_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(30)); } -__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); - // 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"); - } -} + +#if 0 uint8_t read_button_GPIO(uint8_t button_id) { // you can share the GPIO read function with multiple Buttons @@ -264,27 +245,18 @@ static uint16_t KEY_Task_ProcessEvent(uint8_t task_id, uint16_t events) // Discard unknown events return 0; } +#endif - - - -void BSP_KEY_Init(void) +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); - button_init(&btn1, read_button_GPIO, 0, btn1_id); - - // button_attach(&btn1, PRESS_DOWN, BTN1_PRESS_DOWN_Handler); - button_attach(&btn1, PRESS_UP, BTN1_PRESS_UP_Handler); - button_attach(&btn1, SINGLE_CLICK, BTN1_SINGLE_Click_Handler); - button_attach(&btn1, DOUBLE_CLICK, BTN1_DOUBLE_Click_Handler); - button_attach(&btn1, LONG_PRESS_START, BTN1_LONG_PRESS_START_Handler); - - button_start(&btn1); - // 下降沿触发 GPIOB_ITModeCfg(KEY_B_PIN, GPIO_ITMode_FallEdge); @@ -295,15 +267,47 @@ void BSP_KEY_Init(void) // 开启GPIOB中断 PFIC_EnableIRQ(GPIO_B_IRQn); - key_task_id = TMOS_ProcessEventRegister(KEY_Task_ProcessEvent); + tmos_start_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(20)); + // tmos_start_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(5)); //开始一个定时事件,不断的执行,除非运行tmos_stop_task关掉, //tmosTimer具体是 1600 = 1s - // tmos_start_reload_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(20)); // 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; + GPIOB_ClearITFlagBit(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); + // // 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) @@ -315,10 +319,10 @@ void GPIOB_IRQHandler(void) logDebug("KEY IRQ"); - GPIOB_ClearITFlagBit(KEY_B_PIN); + // GPIOB_ClearITFlagBit(KEY_B_PIN); key_wakeup_flag = 1; - key_timeout_flag = 0; + // key_timeout_flag = 0; // BSP_BlockSleep(); diff --git a/HAL/SLEEP.c b/HAL/SLEEP.c index 663ac37..0b5b727 100644 --- a/HAL/SLEEP.c +++ b/HAL/SLEEP.c @@ -105,7 +105,7 @@ uint32_t CH59x_LowPower(uint32_t time) // LOW POWER-sleepģʽ if (!RTCTigFlag) { - // BSP_KEY_EnterLowpower(); + BSP_KEY_EnterLowpower(); LowPower_Sleep(RB_PWR_RAM2K | RB_PWR_RAM24K | RB_PWR_EXTEND | RB_XT_PRE_EN); HSECFG_Current(HSE_RCur_100); // Ϊ(͹ĺHSEƫõ)