fix:添加清空显示区域函数,使用任务事件组init_ok同步初始化 完善屏幕显示
This commit is contained in:
@@ -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 */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user