pwm-timer-led.c
El PWM hardware de un temporizador STM32 hace respirar un LED sin consumir CPU: el canal compara con el contador y genera la señal en autonomía. El ciclo de trabajo se expresa en porcentaje del periodo configurado en CubeMX.
Hardware
Una Nucleo F4 (STM32F401RE/F411RE, Cortex-M4) programada via ST-LINK (USB), pines de 3,3 V. 1 LED + resistencia de 330 Ω (3,3 V) en el pin de salida del canal PWM.
Cableado
LED + 330 Ω entre el pin del canal (elegido en el .ioc, p. ej. PA0 para TIM2_CH1) y GND. Comprueba que el pin soporta ese temporizador.
Funcionamiento
HAL_TIM_PWM_Start lanza el canal; __HAL_TIM_SET_COMPARE fija el siguiente valor de comparación. El temporizador cuenta en hardware; el bucle solo actualiza la consigna cada 10 ms.
Ejecución
Crea un proyecto STM32CubeIDE (elige Nucleo-F401RE o F411RE), pega el codigo en main.c, configura los perifericos en el .ioc y pulsa Run. El terminal serie del ST-LINK muestra los printf a 115200.
Variantes
Cambia la frecuencia con la configuración CubeMX (ARR/PSC), o controla 4 canales para 4 LED con un solo temporizador.
pwm-timer-led.c
// PWM sur TIMx/CHx genere par CubeMX : respiration de LED.
#include "main.h"
extern TIM_HandleTypeDef htim2; // PWM 20 kHz, periode = ARR
#define PWM_CANAL TIM_CHANNEL_1
uint32_t t0 = 0;
int16_t niveau = 0;
int8_t pas = 1;
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init(); // broche en mode PWM dans CubeMX + LED externe
HAL_TIM_PWM_Start(&htim2, PWM_CANAL);
uint32_t periode = __HAL_TIM_GET_AUTORELOAD(&htim2);
for (;;) {
if (HAL_GetTick() - t0 >= 10) {
t0 = HAL_GetTick();
niveau += pas;
if (niveau >= 100) pas = -1;
if (niveau <= 0) pas = 1;
// Rapport cyclique 0..100 % de la periode du timer.
__HAL_TIM_SET_COMPARE(&htim2, PWM_CANAL,
periode * niveau / 100);
}
}
}