代码暂存 优化完善letter shell功能

This commit is contained in:
常正强 2025-04-07 14:59:43 +08:00
parent d8c6878e8b
commit 623a53b7a1
7 changed files with 106 additions and 24 deletions

View File

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

View File

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

View File

@ -1,2 +1,3 @@
不开启睡眠正常
开启睡眠不初始化任何外设的情况下letter shell卡死只有初始化4G后正常
系统进入睡眠模式后需要长按键盘按键来激活letter shell
激活后可正常使用letter shell
30秒无操作后自动进入睡眠

View File

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

View File

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

View File

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

View File

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