diff --git a/APP/peripheral.c b/APP/peripheral.c index 2007d94..fa52813 100644 --- a/APP/peripheral.c +++ b/APP/peripheral.c @@ -40,7 +40,7 @@ #define SBP_PHY_UPDATE_DELAY 2400 // What is the advertising interval when device is discoverable (units of 625us, 80=50ms) -#define DEFAULT_ADVERTISING_INTERVAL (160 * 20) //160 * 10 +#define DEFAULT_ADVERTISING_INTERVAL (160 * 15) //160 * 10 // Limited discoverable mode advertises for 30.72s, and then stops // General discoverable mode advertises indefinitely diff --git a/APP/peripheral_main.c b/APP/peripheral_main.c index 92a0bdd..6c8eaa8 100644 --- a/APP/peripheral_main.c +++ b/APP/peripheral_main.c @@ -58,7 +58,7 @@ void app_task_handler(TeAppEvtType app_evt_type) BSP_KEY_EnterLowpower(); // DelayMs(10); BSP_RequestSleep(); - logDebug("gpio relase;BSP_RequestSleep"); + logDebug("gpio relase;BSP_RequestSleep "); break; default: diff --git a/README.md b/README.md index b06f22e..44169c0 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ -不开启睡眠正常 -开启睡眠不初始化任何外设的情况下letter shell卡死,只有初始化4G后正常 +系统进入睡眠模式后,需要长按键盘按键来激活letter shell +激活后可正常使用letter shell +30秒无操作后自动进入睡眠 diff --git a/bsp/inc/bsp_uart.h b/bsp/inc/bsp_uart.h index 5685e34..7616859 100644 --- a/bsp/inc/bsp_uart.h +++ b/bsp/inc/bsp_uart.h @@ -8,6 +8,8 @@ #define UART3_RX_PIN GPIO_Pin_20 //PB20 ־ӡ #define UART3_TX_PIN GPIO_Pin_21 // PB21 +// Shellʱʱ() +#define SHELL_ACTIVITY_TIMEOUT 30000 // 30޻ϵͳ˯ void BSP_UART1_Init(void); unsigned int BSP_Uart1_Receive_Data(void *buf, unsigned int len); @@ -19,19 +21,5 @@ unsigned int BSP_Uart3_Send_Data(const void *buf, unsigned int len); void BSP_Shell_Loop(void); - - - - - - - - - - - - - - #endif diff --git a/bsp/src/bsp_key.c b/bsp/src/bsp_key.c index 78b7b6c..e4ea78f 100644 --- a/bsp/src/bsp_key.c +++ b/bsp/src/bsp_key.c @@ -19,6 +19,9 @@ tmosTaskID key_task_id = INVALID_TASK_ID; volatile uint8_t key_wakeup_flag = 0; volatile uint8_t key_timeout_flag = 0; +// 声明外部函数 +extern void BSP_UART3_HandleWakeupInterrupt(void); + static app_task_evt_handler_t p_handler = NULL; static volatile uint8_t key_timeout_cnt = 0; @@ -133,8 +136,6 @@ void BSP_KEY_EnterLowpower(void) // 开启GPIOB中断 PFIC_EnableIRQ(GPIO_B_IRQn); - - BSP_RequestSleep(); } void BSP_KEY_ExitLowpower(void) @@ -320,12 +321,15 @@ __INTERRUPT // 告诉编译器使用硬件压栈 __HIGH_CODE // 放到RAM里 void GPIOB_IRQHandler(void) { + printf("GPIOB_IRQHandler \r\n"); + if (GPIOB_ReadITFlagBit(KEY_B_PIN)) + { // 阻止睡眠 BSP_BlockSleep(); // 关按键中断 BSP_KEY_ExitLowpower(); - logDebug("KEY IRQ"); + printf("KEY IRQ"); GPIOB_ClearITFlagBit(KEY_B_PIN); @@ -341,4 +345,11 @@ void GPIOB_IRQHandler(void) // BSP_KEY_ExitLowpower(); // } // tmos_set_event(key_task_id,KEY_SCAN_EVT); + } + // else if (R16_PB_INT_IF & (1 << (20 % 16))) + // { + // printf("UART3 RX start Wake IRQ \r\n"); + // // 调用UART3唤醒处理函数 + // BSP_UART3_HandleWakeupInterrupt(); + // } } diff --git a/bsp/src/bsp_uart.c b/bsp/src/bsp_uart.c index 898f767..76d0693 100644 --- a/bsp/src/bsp_uart.c +++ b/bsp/src/bsp_uart.c @@ -3,6 +3,9 @@ #include "lwrb.h" #include "CH58x_uart.h" #include "shell_port.h" +#include "SLEEP.h" +#include "CONFIG.h" +#include "log.h" #define UART1_RX_BUFFER_LENGTH 512U #define UART1_TX_BUFFER_LENGTH 512U @@ -10,6 +13,8 @@ #define UART3_RX_BUFFER_LENGTH 1024U #define UART3_TX_BUFFER_LENGTH 1024U +void BSP_Shell_SetActive(void); + lwrb_t uart1_rx_t; lwrb_t uart1_tx_t; @@ -116,8 +121,9 @@ void BSP_UART3_Init(void) GPIOB_ModeCfg(UART3_RX_PIN, GPIO_ModeIN_PU); // RXD- GPIOB_ModeCfg(UART3_TX_PIN, GPIO_ModeOut_PP_5mA); // TXD-עIOߵƽ UART3_DefInit(); - UART3_BaudRateCfg(460800); + UART3_BaudRateCfg(115200); //460800 UART3_ByteTrigCfg(UART_1BYTE_TRIG); + // жϷʽ UART3_INTCfg(ENABLE, RB_IER_LINE_STAT | RB_IER_RECV_RDY | RB_IER_THR_EMPTY); PFIC_EnableIRQ(UART3_IRQn); @@ -126,6 +132,48 @@ void BSP_UART3_Init(void) userShellInit(); } + +static tmosTaskID shell_timeout_task_id = INVALID_TASK_ID; +#define SHELL_TIMEOUT_EVT 0x0001 + +/** + * @brief ʱϵͳ˯ + */ +static uint16_t BSP_Shell_TimeoutTask(uint8_t task_id, uint16_t events) +{ + if (events & SHELL_TIMEOUT_EVT) + { + printf("Shell_Timeout UART3 enter low power mode\r\n"); + BSP_RequestSleep(); + return (events ^ SHELL_TIMEOUT_EVT); + } + + return 0; +} + +/** + * @brief Shellʱʱ + */ +void BSP_Shell_StartTimeoutTimer(void) +{ + if (shell_timeout_task_id == INVALID_TASK_ID) + { + shell_timeout_task_id = TMOS_ProcessEventRegister(BSP_Shell_TimeoutTask); + } + tmos_stop_task(shell_timeout_task_id, SHELL_TIMEOUT_EVT); + tmos_start_task(shell_timeout_task_id, SHELL_TIMEOUT_EVT, MS1_TO_SYSTEM_TIME(SHELL_ACTIVITY_TIMEOUT)); +} + +/** + * @brief ShellΪ״ֹ̬ϵͳ˯ + */ +void BSP_Shell_SetActive(void) +{ + BSP_BlockSleep(); + BSP_Shell_StartTimeoutTimer(); +} + + /********************************************************************* * @fn UART1_IRQHandler * @@ -199,10 +247,10 @@ void UART3_IRQHandler(void) } case UART_II_RECV_RDY: case UART_II_RECV_TOUT: //ճʱ - printf("UART_II_RECV_TOUT \r\n"); + BSP_Shell_SetActive(); while(R8_UART3_RFC) { - printf("shellHandler \r\n"); + logDebug("shellHandler \r\n"); shellHandler(&shell, R8_UART3_RBR); } break; @@ -226,3 +274,4 @@ void UART3_IRQHandler(void) break; } } + diff --git a/common/letter-shell-master/src/log.c b/common/letter-shell-master/src/log.c index 3cbe489..b53ffae 100644 --- a/common/letter-shell-master/src/log.c +++ b/common/letter-shell-master/src/log.c @@ -144,6 +144,39 @@ SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), logSetLevel, logSetLevel, set log level\r\n logSetLevel [log] [level]); #endif /** SHELL_USING_COMPANION == 1 */ +/** + * @brief 开启所有日志功能 + */ +void logOpen(void) +{ + for (short i = 0; i < LOG_MAX_NUMBER; i++) + { + if (logList[i]) + { + logList[i]->active = 1; + } + } +} + +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), + logon, logOpen, set log Open); + +/** + * @brief 关闭所有日志功能 + */ +void logClose(void) +{ + for (short i = 0; i < LOG_MAX_NUMBER; i++) + { + if (logList[i]) + { + logList[i]->active = 0; + } + } +} + +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), + logoff, logClose, set log Close); /** * @brief log写buffer