🛠 FreeRTOS sur le Nucleo STM32H743ZI : le projet officiel CubeH7, tâches et file d'attente
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
- Proyecto oficial de ST, no un port: reside en el mismo paquete (v1.13.0) que el HAL contra el que compilas.
- La familia de middleware CubeH7 cubre FreeRTOS, LwIP, FatFS y USB — tu esqueleto RTOS crecerá hacia la demo de servidor web LwIP más adelante.
- El catálogo de temporizadores es enorme para bucles de control: 2 temporizadores de propósito general de 32 bits + 12 de 16 bits, 2 temporizadores de control de motor PWM incluyendo HRTIM, 5 temporizadores de bajo consumo y un temporizador de alta resolución de 2.1 ns.
Paso 1 — Abrir el proyecto oficial
git clone --recursive https://github.com/STMicroelectronics/STM32CubeH7.git- Abre
Projects/NUCLEO-H743ZI/Applications/FreeRTOSen STM32CubeIDE (o regenera tu propia variante desde CubeMX con FreeRTOS habilitado en el árbol de middleware). - 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
- Llamadas bloqueantes dentro de una sección crítica:
printfen el VCP puede bloquearse durante milisegundos — ejecútalo siempre con la prioridad de tarea más baja. - Usar
HAL_Delaydentro de las tareas: espera ocupadamente al tick; usavTaskDelayen su lugar. - Esperar que el proyecto compile tras un clon no recursivo: los submódulos son obligatorios.
Otros tutoriales para esta placa
- Premiers pas sur le Nucleo-144 STM32H743ZI : core STM32duino, ST-LINK et premier Blink
- GPIO, ADC 16 bits et DAC sur le Nucleo STM32H743ZI : bouton, LED et potentiomètre
- MicroPython sur le Nucleo STM32H743ZI : le REPL 480 MHz via le port série ST-LINK
- Zephyr RTOS sur le Nucleo STM32H743ZI : west build, flash et le piège des 96 MHz
- STM32Cube HAL à 480 MHz sur le STM32H743ZI : VOS0, latence flash et HSE bypass
- Serveur web sur l'Ethernet du STM32H743ZI : démo LwIP officielle, RMII et errata