[STM32H7]

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

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

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

// LED任务句柄
TaskHandle_t LEDTaskHandle;
// 串口通信任务句柄
TaskHandle_t UARTTaskHandle;
// 数据处理任务句柄
TaskHandle_t DataTaskHandle;

// LED任务函数
void LEDTask(void *pvParameters)
{
    while (1)
    {
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); // 假设LED连接到GPIOB Pin 0
        vTaskDelay(pdMS_TO_TICKS(500));        // 500ms延迟
    }
}

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

// 数据处理任务函数
void DataTask(void *pvParameters)
{
    uint32_t counter = 0;
    while (1)
    {
        counter++; // 简单的计数任务
        vTaskDelay(pdMS_TO_TICKS(200)); // 200ms延迟
    }
}

// 主函数
int main(void)
{
    HAL_Init();                     // 初始化HAL库
    SystemClock_Config();           // 配置系统时钟
    MX_GPIO_Init();                 // 初始化GPIO
    MX_USART1_UART_Init();          // 初始化UART1

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

    // 启动调度器
    vTaskStartScheduler();

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

// 系统时钟配置函数(略,使用STM32CubeMX自动生成)
// 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中,我们可以创建多个任务,并使用不同的优先级进行调度。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

3744

帖子

1

粉丝