[STM32H7] 探索STM32H743ZI的多任务处理能力:使用FreeRTOS实现任务调度

[复制链接]
3125|12
 楼主| Wordsworth 发表于 2024-12-3 12:53 | 显示全部楼层 |阅读模式
STM32H743ZI是ST公司推出的一款高性能微控制器,基于Arm Cortex-M7内核,最高工作频率可达480MHz,具备强大的计算能力和丰富的外设支持。本文将通过一个FreeRTOS的示例,展示如何在STM32H743ZI上实现多任务处理,从而充分利用其硬件资源。
准备工作在开始之前,请确保以下条件具备:
  • STM32H743ZI开发板(如Nucleo-H743ZI2)。
  • STM32CubeIDE或其他支持STM32开发的工具链。
  • 基本的FreeRTOS知识。
示例工程目标我们将在本例中实现以下功能:
  • 创建三个任务,分别用于LED闪烁、串口通信和数据处理。
  • 配置系统滴答定时器作为FreeRTOS的时基。
  • 验证任务之间的调度和运行。

完整代码
  1. #include "FreeRTOS.h"
  2. #include "task.h"
  3. #include "stm32h7xx_hal.h"

  4. // LED任务句柄
  5. TaskHandle_t LEDTaskHandle;
  6. // 串口通信任务句柄
  7. TaskHandle_t UARTTaskHandle;
  8. // 数据处理任务句柄
  9. TaskHandle_t DataTaskHandle;

  10. // LED任务函数
  11. void LEDTask(void *pvParameters)
  12. {
  13.     while (1)
  14.     {
  15.         HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); // 假设LED连接到GPIOB Pin 0
  16.         vTaskDelay(pdMS_TO_TICKS(500));        // 500ms延迟
  17.     }
  18. }

  19. // 串口通信任务函数
  20. void UARTTask(void *pvParameters)
  21. {
  22.     char msg[] = "UART Task Running...\r\n";
  23.     while (1)
  24.     {
  25.         HAL_UART_Transmit(&huart1, (uint8_t *)msg, strlen(msg), HAL_MAX_DELAY);
  26.         vTaskDelay(pdMS_TO_TICKS(1000)); // 1秒延迟
  27.     }
  28. }

  29. // 数据处理任务函数
  30. void DataTask(void *pvParameters)
  31. {
  32.     uint32_t counter = 0;
  33.     while (1)
  34.     {
  35.         counter++; // 简单的计数任务
  36.         vTaskDelay(pdMS_TO_TICKS(200)); // 200ms延迟
  37.     }
  38. }

  39. // 主函数
  40. int main(void)
  41. {
  42.     HAL_Init();                     // 初始化HAL库
  43.     SystemClock_Config();           // 配置系统时钟
  44.     MX_GPIO_Init();                 // 初始化GPIO
  45.     MX_USART1_UART_Init();          // 初始化UART1

  46.     // 创建任务
  47.     xTaskCreate(LEDTask, "LEDTask", 128, NULL, 2, &LEDTaskHandle);
  48.     xTaskCreate(UARTTask, "UARTTask", 256, NULL, 2, &UARTTaskHandle);
  49.     xTaskCreate(DataTask, "DataTask", 128, NULL, 1, &DataTaskHandle);

  50.     // 启动调度器
  51.     vTaskStartScheduler();

  52.     // 如果代码运行到这里,说明调度器启动失败
  53.     while (1)
  54.     {
  55.     }
  56. }

  57. // 系统时钟配置函数(略,使用STM32CubeMX自动生成)
  58. // GPIO和UART初始化函数(略,同样建议使用STM32CubeMX自动生成)
实现细节
  • LED任务:负责以固定频率切换LED状态,验证任务的实时性。
  • UART任务:向串口发送固定字符串,用于验证通信任务的正常运行。
  • 数据处理任务:模拟一个简单的计数任务,展示任务调度的优先级管理。
运行结果在正确配置硬件和软件环境后,以下现象可以观测到:
  • 开发板上的LED以500ms间隔闪烁。
  • 串口终端每隔1秒打印一次任务信息。
  • 数据处理任务在后台运行,更新计数器值。
小结通过本文的示例,我们体验了STM32H743ZI结合FreeRTOS实现多任务处理的基础能力。这种组合非常适合用于嵌入式实时控制应用,比如工业自动化、机器人控制等。

公羊子丹 发表于 2024-12-3 12:54 | 显示全部楼层
原来STM32H743ZI的性能这么强!不知道跟M4内核比起来差距有多大?
周半梅 发表于 2024-12-3 12:54 | 显示全部楼层
用FreeRTOS调度任务确实方便多了,以前裸机开发真的累。
帛灿灿 发表于 2024-12-3 12:54 | 显示全部楼层
这个LED闪烁的代码很好理解,适合初学者入门!
童雨竹 发表于 2024-12-3 12:54 | 显示全部楼层
数据处理任务可以加点实际应用,比如传感器采集。
万图 发表于 2024-12-3 12:55 | 显示全部楼层
FreeRTOS的vTaskDelay函数用起来比传统延时函数高效多了!
Bblythe 发表于 2024-12-3 12:56 | 显示全部楼层
如果想用双核的STM32H7系列芯片,这种方法是不是也可以直接用?
Pulitzer 发表于 2024-12-3 12:58 | 显示全部楼层
为什么要把UART任务和LED任务分开呢?合并会不会更简单?
Uriah 发表于 2024-12-3 12:59 | 显示全部楼层
有点好奇,vTaskStartScheduler之前的初始化代码会占用多少资源?
Clyde011 发表于 2024-12-3 13:02 | 显示全部楼层
看完代码,发现STM32CubeMX生成的代码真的是个好帮手!
和下土 发表于 2024-12-30 23:51 | 显示全部楼层
在FreeRTOS中,我们可以创建多个任务,并使用不同的优先级进行调度。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

167

主题

6185

帖子

1

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