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实现多任务处理的基础能力。这种组合非常适合用于嵌入式实时控制应用,比如工业自动化、机器人控制等。
|