bsp_key触发有点问题,HAL_SLEEP对应改了
This commit is contained in:
parent
0bbc09d01e
commit
fe13f8273f
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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__
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
33
HAL/SLEEP.c
33
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
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue