bsp_key触发有点问题,HAL_SLEEP对应改了

This commit is contained in:
stark1898y 2024-12-15 16:24:06 +08:00
parent 0bbc09d01e
commit fe13f8273f
7 changed files with 421 additions and 25 deletions

View File

@ -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

View File

@ -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;

View File

@ -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();
}

View File

@ -1,17 +1,40 @@
#ifndef __BSP_KEY_H__
#define __BSP_KEY_H__
#include "CONFIG.h"
#include "CH59x_common.h"
#include <stdint.h>
#include <stdbool.h>
#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__

View File

@ -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);
// 开启GPIO的睡眠唤醒,如果需要的话
// PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);
PWR_PeriphWakeUpCfg(ENABLE, RB_GPIO_WAKE_MODE | RB_SLP_GPIO_WAKE, Long_Delay);
// 开启GPIOB中断
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);
// 开启GPIO的睡眠唤醒,如果需要的话
// PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);
PWR_PeriphWakeUpCfg(ENABLE, RB_GPIO_WAKE_MODE | RB_SLP_GPIO_WAKE, Long_Delay);
// 开启GPIOB中断
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);
}

View File

@ -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

View File

@ -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
*/