代码暂存 优化完善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 #define SBP_PHY_UPDATE_DELAY 2400
// What is the advertising interval when device is discoverable (units of 625us, 80=50ms) // 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 // Limited discoverable mode advertises for 30.72s, and then stops
// General discoverable mode advertises indefinitely // General discoverable mode advertises indefinitely

View File

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

View File

@ -8,6 +8,8 @@
#define UART3_RX_PIN GPIO_Pin_20 //PB20 日志打印 #define UART3_RX_PIN GPIO_Pin_20 //PB20 日志打印
#define UART3_TX_PIN GPIO_Pin_21 // PB21 #define UART3_TX_PIN GPIO_Pin_21 // PB21
// 定义Shell活动超时时间(毫秒)
#define SHELL_ACTIVITY_TIMEOUT 30000 // 30秒无活动后允许系统睡眠
void BSP_UART1_Init(void); void BSP_UART1_Init(void);
unsigned int BSP_Uart1_Receive_Data(void *buf, unsigned int len); 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); void BSP_Shell_Loop(void);
#endif #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_wakeup_flag = 0;
volatile uint8_t key_timeout_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 app_task_evt_handler_t p_handler = NULL;
static volatile uint8_t key_timeout_cnt = 0; static volatile uint8_t key_timeout_cnt = 0;
@ -133,8 +136,6 @@ void BSP_KEY_EnterLowpower(void)
// 开启GPIOB中断 // 开启GPIOB中断
PFIC_EnableIRQ(GPIO_B_IRQn); PFIC_EnableIRQ(GPIO_B_IRQn);
BSP_RequestSleep();
} }
void BSP_KEY_ExitLowpower(void) void BSP_KEY_ExitLowpower(void)
@ -319,13 +320,16 @@ void KEY_ProcessLoop(void)
__INTERRUPT // 告诉编译器使用硬件压栈 __INTERRUPT // 告诉编译器使用硬件压栈
__HIGH_CODE // 放到RAM里 __HIGH_CODE // 放到RAM里
void GPIOB_IRQHandler(void) void GPIOB_IRQHandler(void)
{
printf("GPIOB_IRQHandler \r\n");
if (GPIOB_ReadITFlagBit(KEY_B_PIN))
{ {
// 阻止睡眠 // 阻止睡眠
BSP_BlockSleep(); BSP_BlockSleep();
// 关按键中断 // 关按键中断
BSP_KEY_ExitLowpower(); BSP_KEY_ExitLowpower();
logDebug("KEY IRQ"); printf("KEY IRQ");
GPIOB_ClearITFlagBit(KEY_B_PIN); GPIOB_ClearITFlagBit(KEY_B_PIN);
@ -342,3 +346,10 @@ void GPIOB_IRQHandler(void)
// } // }
// tmos_set_event(key_task_id,KEY_SCAN_EVT); // 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 "lwrb.h"
#include "CH58x_uart.h" #include "CH58x_uart.h"
#include "shell_port.h" #include "shell_port.h"
#include "SLEEP.h"
#include "CONFIG.h"
#include "log.h"
#define UART1_RX_BUFFER_LENGTH 512U #define UART1_RX_BUFFER_LENGTH 512U
#define UART1_TX_BUFFER_LENGTH 512U #define UART1_TX_BUFFER_LENGTH 512U
@ -10,6 +13,8 @@
#define UART3_RX_BUFFER_LENGTH 1024U #define UART3_RX_BUFFER_LENGTH 1024U
#define UART3_TX_BUFFER_LENGTH 1024U #define UART3_TX_BUFFER_LENGTH 1024U
void BSP_Shell_SetActive(void);
lwrb_t uart1_rx_t; lwrb_t uart1_rx_t;
lwrb_t uart1_tx_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_RX_PIN, GPIO_ModeIN_PU); // RXD-配置上拉输入
GPIOB_ModeCfg(UART3_TX_PIN, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出注意先让IO口输出高电平 GPIOB_ModeCfg(UART3_TX_PIN, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出注意先让IO口输出高电平
UART3_DefInit(); UART3_DefInit();
UART3_BaudRateCfg(460800); UART3_BaudRateCfg(115200); //460800
UART3_ByteTrigCfg(UART_1BYTE_TRIG); UART3_ByteTrigCfg(UART_1BYTE_TRIG);
// 中断方式接收数据 // 中断方式接收数据
UART3_INTCfg(ENABLE, RB_IER_LINE_STAT | RB_IER_RECV_RDY | RB_IER_THR_EMPTY); UART3_INTCfg(ENABLE, RB_IER_LINE_STAT | RB_IER_RECV_RDY | RB_IER_THR_EMPTY);
PFIC_EnableIRQ(UART3_IRQn); PFIC_EnableIRQ(UART3_IRQn);
@ -126,6 +132,48 @@ void BSP_UART3_Init(void)
userShellInit(); 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 * @fn UART1_IRQHandler
* *
@ -199,10 +247,10 @@ void UART3_IRQHandler(void)
} }
case UART_II_RECV_RDY: case UART_II_RECV_RDY:
case UART_II_RECV_TOUT: //接收超时 case UART_II_RECV_TOUT: //接收超时
printf("UART_II_RECV_TOUT \r\n"); BSP_Shell_SetActive();
while(R8_UART3_RFC) while(R8_UART3_RFC)
{ {
printf("shellHandler \r\n"); logDebug("shellHandler \r\n");
shellHandler(&shell, R8_UART3_RBR); shellHandler(&shell, R8_UART3_RBR);
} }
break; break;
@ -226,3 +274,4 @@ void UART3_IRQHandler(void)
break; 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]); logSetLevel, logSetLevel, set log level\r\n logSetLevel [log] [level]);
#endif /** SHELL_USING_COMPANION == 1 */ #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 * @brief log写buffer