/* USER CODE BEGIN Header */ /** ****************************************************************************** * File Name : freertos.c * Description : Code for freertos applications ****************************************************************************** * @attention * * Copyright (c) 2026 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "FreeRTOS.h" #include "task.h" #include "main.h" #include "cmsis_os.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "bsp_beep.h" #include "bsp_motor.h" #include "bsp_uart.h" #include "elog.h" #include "protocol.h" #include "usart.h" #include "bsp_hall.h" // 添加对 bsp_hall.h 的包含 #include "bsp_track_ir.h" // 添加对 bsp_track_ir.h 的包含 #include "bsp_sr04.h" // 添加超声波头文件 #include "bsp_rc522.h" // 添加 RFID 头文件 /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN Variables */ /* USER CODE END Variables */ /* Definitions for initTask */ osThreadId_t initTaskHandle; const osThreadAttr_t initTask_attributes = { .name = "initTask", .stack_size = 256 * 4, .priority = (osPriority_t) osPriorityNormal, }; /* Definitions for CarCtrlTask */ osThreadId_t CarCtrlTaskHandle; const osThreadAttr_t CarCtrlTask_attributes = { .name = "CarCtrlTask", .stack_size = 1024 * 4, .priority = (osPriority_t) osPriorityNormal, }; /* Definitions for timerTask */ osThreadId_t timerTaskHandle; const osThreadAttr_t timerTask_attributes = { .name = "timerTask", .stack_size = 1024 * 4, .priority = (osPriority_t) osPriorityBelowNormal, }; /* Definitions for sr04Task */ osThreadId_t sr04TaskHandle; const osThreadAttr_t sr04Task_attributes = { .name = "sr04Task", .stack_size = 512 * 4, .priority = (osPriority_t) osPriorityLow, }; /* Definitions for rc522Task */ osThreadId_t rc522TaskHandle; const osThreadAttr_t rc522Task_attributes = { .name = "rc522Task", .stack_size = 512 * 4, .priority = (osPriority_t) osPriorityBelowNormal, }; /* Definitions for CmdQueue */ osMessageQueueId_t CmdQueueHandle; const osMessageQueueAttr_t CmdQueue_attributes = { .name = "CmdQueue" }; /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN FunctionPrototypes */ #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, HAL_MAX_DELAY); return ch; } /* USER CODE END FunctionPrototypes */ void StartDefaultTask(void *argument); void CarCtrl_Task(void *argument); void speed_get(void *argument); void sr04_task(void *argument); void rc522_task(void *argument); void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ /** * @brief FreeRTOS initialization * @param None * @retval None */ void MX_FREERTOS_Init(void) { /* USER CODE BEGIN Init */ easylogger_init(); BEEP_Init(); BSP_UART1_Init(); elog_raw("FreeRTOS Initialized\r\n"); motor_init(); // 初始化电机相关外设 hall_init(); // 初始化霍尔传感器 track_ir_init(); // 初始化轨迹红外传感器 sr04_init(); // 初始化超声波 rc522_init(); // 初始化 RFID 模块 /* USER CODE END Init */ /* USER CODE BEGIN RTOS_MUTEX */ /* add mutexes, ... */ /* USER CODE END RTOS_MUTEX */ /* USER CODE BEGIN RTOS_SEMAPHORES */ /* add semaphores, ... */ /* USER CODE END RTOS_SEMAPHORES */ /* USER CODE BEGIN RTOS_TIMERS */ /* start timers, add new ones, ... */ /* USER CODE END RTOS_TIMERS */ /* Create the queue(s) */ /* creation of CmdQueue */ CmdQueueHandle = osMessageQueueNew (16, 16, &CmdQueue_attributes); /* USER CODE BEGIN RTOS_QUEUES */ /* add queues, ... */ /* USER CODE END RTOS_QUEUES */ /* Create the thread(s) */ /* creation of initTask */ initTaskHandle = osThreadNew(StartDefaultTask, NULL, &initTask_attributes); /* creation of CarCtrlTask */ CarCtrlTaskHandle = osThreadNew(CarCtrl_Task, NULL, &CarCtrlTask_attributes); /* creation of timerTask */ timerTaskHandle = osThreadNew(speed_get, NULL, &timerTask_attributes); /* creation of sr04Task */ sr04TaskHandle = osThreadNew(sr04_task, NULL, &sr04Task_attributes); /* creation of rc522Task */ rc522TaskHandle = osThreadNew(rc522_task, NULL, &rc522Task_attributes); /* USER CODE BEGIN RTOS_THREADS */ /* add threads, ... */ /* USER CODE END RTOS_THREADS */ /* USER CODE BEGIN RTOS_EVENTS */ /* add events, ... */ /* USER CODE END RTOS_EVENTS */ } /* USER CODE BEGIN Header_StartDefaultTask */ /** * @brief Function implementing the initTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartDefaultTask */ void StartDefaultTask(void *argument) { /* USER CODE BEGIN StartDefaultTask */ /* Infinite loop */ uint32_t last_log_tick = 0; for (;;) { track_ir_state_t state = track_ir_basic_judge(); uint32_t now_tick = HAL_GetTick(); /* 降低串口打印频率,避免阻塞式输出影响电机节拍 */ if ((now_tick - last_log_tick) >= 500U) { printf("循迹状态: %s\r\n", track_ir_state_to_string(state)); printf("当前距离: %.2f cm\r\n", sr04_get_distance()); last_log_tick = now_tick; } osDelay(100); } /* USER CODE END StartDefaultTask */ } /* USER CODE BEGIN Header_CarCtrl_Task */ /** * @brief Function implementing the CarCtrlTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_CarCtrl_Task */ __weak void CarCtrl_Task(void *argument) { /* USER CODE BEGIN CarCtrl_Task */ /* Infinite loop */ for (;;) { osDelay(1); // osMessageQueueGet 已经是阻塞的,不需要额外的 osDelay } /* USER CODE END CarCtrl_Task */ } /* USER CODE BEGIN Header_speed_get */ /** * @brief Function implementing the timerTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_speed_get */ __weak void speed_get(void *argument) { /* USER CODE BEGIN speed_get */ /* Infinite loop */ for(;;) { osDelay(1); } /* USER CODE END speed_get */ } /* USER CODE BEGIN Header_sr04_task */ /** * @brief Function implementing the sr04Task thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_sr04_task */ void sr04_task(void *argument) { /* USER CODE BEGIN sr04_task */ /* Infinite loop */ for(;;) { /* 超声波单独运行,避免阻塞控制任务 */ sr04_measure(); osDelay(100); } /* USER CODE END sr04_task */ } /* USER CODE BEGIN Header_rc522_task */ /** * @brief Function implementing the rc522Task thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_rc522_task */ void rc522_task(void *argument) { /* USER CODE BEGIN rc522_task */ rc522_card_info_t card; char uid_str[3 * RC522_UID_MAX_LEN] = {0}; station_id_t station = STATION_NONE; /* Infinite loop */ for(;;) { rc522_status_t st = rc522_poll(&card); if (st == RC522_OK) { if (rc522_uid_to_string(&card, uid_str, sizeof(uid_str))) { printf("RFID UID: %s, SAK:0x%02X, ATQA:0x%04X\r\n", uid_str, card.sak, card.atqa); } // 站点匹配逻辑 station = rc522_match_station(card.uid, card.uid_len); if (station == STATION_1) { printf("到达站点1!\r\n"); // 可在此处添加到站动作,如停车、蜂鸣等 } else if (station == STATION_2) { printf("到达站点2!\r\n"); // 可在此处添加到站动作,如停车、蜂鸣等 } } osDelay(100); } /* USER CODE END rc522_task */ } /* Private application code --------------------------------------------------*/ /* USER CODE BEGIN Application */ /* USER CODE END Application */