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

[复制链接]
 楼主| sujingliang 发表于 2025-7-19 16:02 | 显示全部楼层 |阅读模式
目标实现freeRTOS任务及队列处理

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

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

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

4、勾选RTOS2
25.png

5、CMSIS RTOS2增加任务和队列

26.png

27.png
28.png

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

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

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

  7.   /* creation of UartTask */
  8.   UartTaskHandle = osThreadNew(UartTask, NULL, &UartTask_attributes);
复制代码


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

4、USER BUTTON回调函数
按下USER BUTTON,向队列myQueue01Handle中写入event值。
  1. void BSP_PB_Callback(Button_TypeDef Button)
  2. {
  3.         static uint16_t event=0;
  4.         osStatus_t status;
  5.        
  6.         static uint32_t last_time = 0;
  7.     uint32_t now = HAL_GetTick();
  8.    
  9.     // 消抖时间阈值,通常10-50ms
  10.     if((now - last_time) < 20) return;
  11.    
  12.     last_time = now;
  13.        
  14.         if(Button==BUTTON_USER)
  15.         {  
  16.    
  17.                 if (myQueue01Handle == NULL) {
  18.         printf("Error: Queue not initialized!\n");
  19.         return;
  20.     }

  21.                 if (osMessageQueueGetSpace(myQueue01Handle) > 0) {
  22.                           status =osMessageQueuePut(myQueue01Handle, &event, 0, 0);
  23.                 }
  24.                 if (status == osErrorParameter) {
  25.         printf("Error: Invalid parameter in osMessageQueuePut!\n");
  26.     } else if (status == osOK) {
  27.         printf("Message sent: %d\n", event);
  28.     }
  29.                 event++;
  30.         }

  31. }
复制代码


三、运行
1、翻转LED;2、UART输出“STM32U385RG FreeRtos test”;3、按下USER BUTTON,UART输出event数值
Video_250719151741-ezgif.com-resize.gif








LOVEEVER 发表于 2025-7-29 23:24 | 显示全部楼层
freeRTOS任务及队列学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

146

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部