fix:添加清空显示区域函数,使用任务事件组init_ok同步初始化 完善屏幕显示

This commit is contained in:
2026-02-16 02:06:53 +08:00
parent 6b3c37263a
commit 00af5d343f
10 changed files with 228 additions and 122 deletions

View File

@@ -19,14 +19,14 @@
/* Includes ------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "cmsis_os.h"
#include "gbk_text.h"
#include "main.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "elog.h"
#include "gbk_text.h"
#include "motor_driver.h"
#include "screen.h"
#include "tim.h"
@@ -36,7 +36,6 @@
#include <string.h>
#include <sys/_intsup.h>
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
@@ -79,37 +78,49 @@ static uint8_t time_state = 0; /* TIME_KEY 时间状态 */
/* Definitions for defaultTask */
osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
.name = "defaultTask",
.stack_size = 128 * 4,
.priority = (osPriority_t)osPriorityNormal,
.name = "defaultTask",
.stack_size = 128 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
/* Definitions for KeyTask */
osThreadId_t KeyTaskHandle;
const osThreadAttr_t KeyTask_attributes = {
.name = "KeyTask",
.stack_size = 512 * 4,
.priority = (osPriority_t)osPriorityRealtime,
.name = "KeyTask",
.stack_size = 512 * 4,
.priority = (osPriority_t) osPriorityRealtime,
};
/* Definitions for Sensor_Task */
osThreadId_t Sensor_TaskHandle;
const osThreadAttr_t Sensor_Task_attributes = {
.name = "Sensor_Task",
.stack_size = 512 * 4,
.priority = (osPriority_t)osPriorityHigh7,
.name = "Sensor_Task",
.stack_size = 512 * 4,
.priority = (osPriority_t) osPriorityHigh7,
};
/* Definitions for Motor_Task */
osThreadId_t Motor_TaskHandle;
const osThreadAttr_t Motor_Task_attributes = {
.name = "Motor_Task",
.stack_size = 512 * 4,
.priority = (osPriority_t)osPriorityNormal1,
.name = "Motor_Task",
.stack_size = 512 * 4,
.priority = (osPriority_t) osPriorityNormal1,
};
/* Definitions for Screen_Tsak */
osThreadId_t Screen_TsakHandle;
const osThreadAttr_t Screen_Tsak_attributes = {
.name = "Screen_Tsak",
.stack_size = 1024 * 4,
.priority = (osPriority_t)osPriorityNormal,
.name = "Screen_Tsak",
.stack_size = 1024 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
/* Definitions for MP3_Play_Task */
osThreadId_t MP3_Play_TaskHandle;
const osThreadAttr_t MP3_Play_Task_attributes = {
.name = "MP3_Play_Task",
.stack_size = 512 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
/* Definitions for init_ok */
osEventFlagsId_t init_okHandle;
const osEventFlagsAttr_t init_ok_attributes = {
.name = "init_ok"
};
/* Private function prototypes -----------------------------------------------*/
@@ -122,14 +133,15 @@ void Key(void *argument);
void Sensor(void *argument);
void Motor(void *argument);
void Screen(void *argument);
void MP3(void *argument);
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
/**
* @brief FreeRTOS initialization
* @param None
* @retval None
*/
* @brief FreeRTOS initialization
* @param None
* @retval None
*/
void MX_FREERTOS_Init(void) {
/* USER CODE BEGIN Init */
easylogger_init(); /* 初始化 EasyLogger */
@@ -155,8 +167,7 @@ void MX_FREERTOS_Init(void) {
/* Create the thread(s) */
/* creation of defaultTask */
defaultTaskHandle =
osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
/* creation of KeyTask */
KeyTaskHandle = osThreadNew(Key, NULL, &KeyTask_attributes);
@@ -170,13 +181,21 @@ void MX_FREERTOS_Init(void) {
/* creation of Screen_Tsak */
Screen_TsakHandle = osThreadNew(Screen, NULL, &Screen_Tsak_attributes);
/* creation of MP3_Play_Task */
MP3_Play_TaskHandle = osThreadNew(MP3, NULL, &MP3_Play_Task_attributes);
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
/* USER CODE END RTOS_THREADS */
/* Create the event(s) */
/* creation of init_ok */
init_okHandle = osEventFlagsNew(&init_ok_attributes);
/* USER CODE BEGIN RTOS_EVENTS */
/* add events, ... */
/* USER CODE END RTOS_EVENTS */
}
/* USER CODE BEGIN Header_StartDefaultTask */
@@ -186,53 +205,37 @@ void MX_FREERTOS_Init(void) {
* @retval None
*/
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument) {
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
Screen_Init();
Screen_Init();
Screen_DrawText16_GBK(1, 30, text_device_loading,text_device_loading_LEN, TEXT_COLOR);
// 初始化命令
uint8_t init_cmd1[] = {0x7E, 0xFF, 0x06, 0x06, 0x00,
0x00, 0x1E, 0xFE, 0xD7, 0xEF}; // 开启声音
uint8_t init_cmd2[] = {0x7E, 0xFF, 0x06, 0x09, 0x00,
0x00, 0x02, 0xFE, 0xF0, 0xEF}; // 指定播放设备为TF卡
Screen_DrawText16_GBK(1, 30, text_device_loading, text_device_loading_LEN,
TEXT_COLOR);
// 定义测试指令数据
uint8_t test_cmd[] = {0x7E, 0xFF, 0x06, 0x12, 0x00,
0x00, 0x01, 0xFE, 0xE8, 0xEF};
// 等待bit0+bit1+bit2都被设置所有模块初始化完成
uint32_t flags = osEventFlagsWait(
init_okHandle, // 目标事件标志组
(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4), // 要等待的bit位多个用|拼接)
osFlagsWaitAll, // 等待所有bit都被设置
osWaitForever // 永久等待(直到满足条件)
);
if(flags == ((1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4))) {
Screen_ClearContent();
// 所有初始化完成,开始执行按摩逻辑
Screen_DrawText16V_GBK(1, 30, text_stop_massage, text_stop_massage_LEN, 15);
}
// 先让模块稳定
osDelay(2000);
// 初始化:先发送开启声音指令,再发送指定播放设备指令
HAL_UART_Transmit(&huart3, init_cmd1, sizeof(init_cmd1), 1000);
elog_d("MP3",
"发送的消息是:%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X",
init_cmd1[0], init_cmd1[1], init_cmd1[2], init_cmd1[3], init_cmd1[4],
init_cmd1[5], init_cmd1[6], init_cmd1[7], init_cmd1[8], init_cmd1[9]);
osDelay(1500); // 重要:等待模块响应
HAL_UART_Transmit(&huart3, init_cmd2, sizeof(init_cmd2), 1000);
elog_d("MP3",
"发送的消息是:%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X",
init_cmd2[0], init_cmd2[1], init_cmd2[2], init_cmd2[3], init_cmd2[4],
init_cmd2[5], init_cmd2[6], init_cmd2[7], init_cmd2[8], init_cmd2[9]);
osDelay(1500); // 重要:等待初始化完成
elog_d("Init","完成所有的初始化");
/* Infinite loop */
for (;;) {
// 直接整包发送测试指令
HAL_UART_Transmit(&huart3, test_cmd, sizeof(test_cmd), 1000);
// 把发送的数据打印出来
elog_d("mp3_cmd",
"发送测试指令: %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X",
test_cmd[0], test_cmd[1], test_cmd[2], test_cmd[3], test_cmd[4],
test_cmd[5], test_cmd[6], test_cmd[7], test_cmd[8], test_cmd[9]);
// 可选:等待发送完成
// while(__HAL_UART_GET_FLAG(&huart3, UART_FLAG_TC) == RESET);
HAL_GPIO_TogglePin(RUN_LED_GPIO_Port, RUN_LED_Pin);
osDelay(10000); // 延时1秒
}
/* USER CODE END StartDefaultTask */
@@ -245,8 +248,10 @@ void StartDefaultTask(void *argument) {
* @retval None
*/
/* USER CODE END Header_Key */
void Key(void *argument) {
void Key(void *argument)
{
/* USER CODE BEGIN Key */
elog_d("Init", "Key task started");
/* 防抖轮询实现四个低电平有效按键检测 */
GPIO_TypeDef *key_ports[4] = {M__KEY_GPIO_Port, M__KEYC7_GPIO_Port,
HOT_KEY_GPIO_Port, TIME_KEY_GPIO_Port};
@@ -258,6 +263,8 @@ void Key(void *argument) {
uint8_t pressed[4] = {0};
const uint8_t THRESH = 3; /* 3 * 10ms = 30ms 防抖 */
osEventFlagsSet(init_okHandle, 1<<0); // 设置初始化完成标志
for (;;) {
for (int i = 0; i < 4; i++) {
GPIO_PinState level = HAL_GPIO_ReadPin(key_ports[i], key_pins[i]);
@@ -289,9 +296,13 @@ void Key(void *argument) {
* @retval None
*/
/* USER CODE END Header_Sensor */
void Sensor(void *argument) {
void Sensor(void *argument)
{
/* USER CODE BEGIN Sensor */
elog_d("Init", "Sensor task started");
/* 按键处理任务 - 按键状态切换控制 */
osEventFlagsSet(init_okHandle, 1<<1);
/* Infinite loop */
for (;;) {
@@ -349,12 +360,18 @@ void Sensor(void *argument) {
* @retval None
*/
/* USER CODE END Header_Motor */
void Motor(void *argument) {
void Motor(void *argument)
{
/* USER CODE BEGIN Motor */
elog_d("Init", "Motor task started");
/* 电机驱动初始化 */
Motor_Init();
osEventFlagsSet(init_okHandle, 1<<2);
/* Infinite loop */
for (;;) {
/* 电机任务主要功能:
@@ -367,6 +384,7 @@ void Motor(void *argument) {
uint8_t current_gear = Motor_GetGear();
elog_i("Motor", "当前档位: %u (0=停止,1=低,2=中,3=高)", current_gear);
HAL_GPIO_TogglePin(RUN_LED_GPIO_Port, RUN_LED_Pin);
osDelay(1000);
}
/* USER CODE END Motor */
@@ -379,18 +397,69 @@ void Motor(void *argument) {
* @retval None
*/
/* USER CODE END Header_Screen */
void Screen(void *argument) {
void Screen(void *argument)
{
/* USER CODE BEGIN Screen */
elog_d("Init", "Screen task started");
osEventFlagsSet(init_okHandle, 1<<3);
// HAL_UART_Transmit(&huart1, (uint8_t *)buf, strlen(buf), HAL_MAX_DELAY);
/* Infinite loop */
for (;;) {
}
/* USER CODE END Screen */
}
/* USER CODE BEGIN Header_MP3 */
/**
* @brief Function implementing the MP3_Play_Task thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_MP3 */
void MP3(void *argument)
{
/* USER CODE BEGIN MP3 */
elog_d("Init", "MP3 task started");
uint8_t init_cmd1[] = {0x7E, 0xFF, 0x06, 0x06, 0x00, 0x00, 0x1E, 0xFE, 0xD7, 0xEF}; // 开启声音
uint8_t init_cmd2[] = {0x7E, 0xFF, 0x06, 0x09, 0x00, 0x00, 0x02, 0xFE, 0xF0, 0xEF}; // TF卡
uint8_t play_cmd[] = {0x7E, 0xFF, 0x06, 0x12, 0x00, 0x00, 0x01, 0xFE, 0xE8, 0xEF}; // 播放文件1
// 等待模块上电稳定
osDelay(2000);
// 发送初始化命令1等待模块 ACK
HAL_UART_Transmit(&huart3, init_cmd1, sizeof(init_cmd1), 100);
// 发送初始化命令2
HAL_UART_Transmit(&huart3, init_cmd2, sizeof(init_cmd2), 100);
elog_i("MP3", "模块初始化完成");
osEventFlagsSet(init_okHandle, 1<<4);
/* Infinite loop */
for(;;)
{
// 发送播放命令
HAL_UART_Transmit(&huart3, play_cmd, sizeof(play_cmd), 100);
osDelay(10000);
}
/* USER CODE END MP3 */
}
/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */
/* USER CODE END Application */