sujingliang 发表于 2025-7-19 16:02

【STM32U385RG 测评】6、freeRTOS任务及队列

目标实现freeRTOS任务及队列处理

一、STM32CuteMX配置
新建一个工程
1、勾选bsp


2、确认是否安装STMicoelectronics X-CUBE-FREEROTS
Software Packs->Select Compoments
查看STMicoelectronics X-CUBE-FREEROTS,如果没有安装,进行安装。
并选择core、heap


3、SYS选择TIM6
避免和rtos冲突


4、勾选RTOS2


5、CMSIS RTOS2增加任务和队列






生成工程,打开工程,freeRTOS源码已经添加到工程中了


二、软件部分
1、系统已经生成了初始化代码
myQueue01Handle = osMessage2QueueNew (16, sizeof(uint16_t), &myQueue01_attributes);

/* USER CODE BEGIN RTOS_QUEUES */
/* add queues, ... */
/* USER CODE END RTOS_QUEUES */
/* creation of defaultTask */
defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);

/* creation of UartTask */
UartTaskHandle = osThreadNew(UartTask, NULL, &UartTask_attributes);

2、点灯Task
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN defaultTask */
/* Infinite loop */
for(;;)
{
                BSP_LED_Toggle(LED_GREEN);
    osDelay(1000);
}
/* USER CODE END defaultTask */
}3、UART任务
void UartTask(void *argument)
{
/* USER CODE BEGIN UartTask */
        uint16_t receivedMsg;
/* Infinite loop */
for(;;)
{
                printf("STM32U385RG FreeRtos test\r\n");
                if (osMessageQueueGet(myQueue01Handle, &receivedMsg, NULL, 0) == osOK) {
         printf("Received: %d\n", receivedMsg);
    }
    osDelay(1000);
}
/* USER CODE END UartTask */
}此任务中,会从队列myQueue01Handle中获取消息,如果获取成功,打印。
同时,打印“STM32U385RG FreeRtos test”

4、USER BUTTON回调函数
按下USER BUTTON,向队列myQueue01Handle中写入event值。
void BSP_PB_Callback(Button_TypeDef Button)
{
        static uint16_t event=0;
        osStatus_t status;
       
        static uint32_t last_time = 0;
    uint32_t now = HAL_GetTick();
   
    // 消抖时间阈值,通常10-50ms
    if((now - last_time) < 20) return;
   
    last_time = now;
       
        if(Button==BUTTON_USER)
        {
   
                if (myQueue01Handle == NULL) {
      printf("Error: Queue not initialized!\n");
      return;
    }

                if (osMessageQueueGetSpace(myQueue01Handle) > 0) {
                          status =osMessageQueuePut(myQueue01Handle, &event, 0, 0);
                }
                if (status == osErrorParameter) {
      printf("Error: Invalid parameter in osMessageQueuePut!\n");
    } else if (status == osOK) {
      printf("Message sent: %d\n", event);
    }
                event++;
        }

}

三、运行
1、翻转LED;2、UART输出“STM32U385RG FreeRtos test”;3、按下USER BUTTON,UART输出event数值









LOVEEVER 发表于 2025-7-29 23:24

freeRTOS任务及队列学习一下
页: [1]
查看完整版本: 【STM32U385RG 测评】6、freeRTOS任务及队列