🛠 FreeRTOS sur le Nucleo STM32H743ZI : le projet officiel CubeH7, tâches et file d'attente

STM32H7 Nucleo-144 (modèle phare : NUCLEO-H743ZI) · intermediaire · Schéma : IMG-stm32h7-nucleo-intermediaire-3-stm32h743zi-freertos-tasks.svg — trois tâches FreeRTOS (capteur, affichage, log) échangeant via une file d'attente au-dessus de la Nucleo-144 STM32H743ZI, chronogramme d'ordonnancement préemptif à droite, flat vector style, étiquettes en français, fond blanc.

Qué vas a construir

STM32CubeH7 incluye una aplicación FreeRTOS lista para usar para esta placa exacta en Projects/NUCLEO-H743ZI/Applications/FreeRTOS — la ruta más rápida hacia una base de RTOS funcional en el H743ZI. La abriremos y luego añadiremos un par productor/consumidor: una tarea de sensor que muestrea uno de los 3 ADCs de 16 bits y una tarea de registro que vacía una cola hacia el puerto COM virtual ST-LINK.

Por qué FreeRTOS en esta placa

Paso 1 — Abrir el proyecto oficial

  1. git clone --recursive https://github.com/STMicroelectronics/STM32CubeH7.git
  2. Abre Projects/NUCLEO-H743ZI/Applications/FreeRTOS en STM32CubeIDE (o regenera tu propia variante desde CubeMX con FreeRTOS habilitado en el árbol de middleware).
  3. Compila y programa a través del ST-LINK/V2-1 integrado en la placa.

Paso 2 — Tareas productor/consumidor

/* Add to the generated project (CubeMX FreeRTOS skeleton). */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"

static QueueHandle_t q_samples;

void SensorTask(void *arg)
{
  uint32_t raw;
  for (;;) {
    HAL_ADC_Start(&hadc1);                       /* 16-bit ADC, up to 3.6 MSPS */
    HAL_ADC_PollForConversion(&hadc1, 10);
    raw = HAL_ADC_GetValue(&hadc1);
    xQueueSend(q_samples, &raw, pdMS_TO_TICKS(10));
    vTaskDelay(pdMS_TO_TICKS(100));
  }
}

void LogTask(void *arg)
{
  uint32_t raw;
  for (;;) {
    if (xQueueReceive(q_samples, &raw, portMAX_DELAY) == pdTRUE) {
      printf("ADC1=%lu\r\n", raw);  /* retarget printf to UART3 / ST-LINK VCP */
    }
  }
}

void start_tasks(void)   /* called after HAL init and clock config */
{
  q_samples = xQueueCreate(16, sizeof(uint32_t));
  xTaskCreate(SensorTask, "sensor", 128, NULL, 3, NULL);
  xTaskCreate(LogTask,    "log",    128, NULL, 2, NULL);
  vTaskStartScheduler;
  for (;;) {}
}

Paso 3 — Prioridades que tienen sentido

Asigna la prioridad más alta a la tarea del sensor y deja que la tarea de registro se ejecute con prioridad baja: el productor ADC nunca espera a la consola lenta, y la cola (profundidad 16) absorbe los bloqueos de la consola. En un M7 de 480 MHz con 192 KB de RAM TCM, los cambios de contexto son mínimos — pero mantén las pilas en las secciones de RAM predeterminadas antes de microoptimizar su ubicación (consulta el tutorial avanzado de memoria).

Resultado esperado

La coreografía de LED de la demo oficial se ejecuta; tras tu edición, la terminal en el VCP ST-LINK (115200) imprime una línea ADC1=... cada 100 ms mientras las tareas de LED mantienen su temporización — eso es la planificación preventiva demostrándose a sí misma.

Errores comunes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales