pwm-timer-led.c
Le PWM matériel d'un timer STM32 fait respirer une LED sans consommer de CPU : le canal compare la valeur au compteur et génère le créneau en autonomie. Le rapport cyclique s'exprime en pourcentage de la période configurée dans CubeMX.
Matériel requis
Une Nucleo H7 (STM32H743ZI, Cortex-M7 @ 480 MHz) programmee via ST-LINK (USB), broches 3,3 V. 1 LED + résistance 330 Ω (3,3 V) sur la broche de sortie du canal PWM.
Câblage
LED + 330 Ω entre la broche du canal (choisie dans le .ioc, ex. PA0 pour TIM2_CH1) et GND. Vérifier que la broche supporte ce timer.
Fonctionnement
HAL_TIM_PWM_Start lance le canal ; __HAL_TIM_SET_COMPARE fixe la comparaison suivante. Le timer compte en matériel, la boucle ne fait que modifier la consigne tous les 10 ms.
Exécution
Projet STM32CubeIDE base sur la Nucleo-H743ZI : le code se glisse dans main.c, les peripheriques se declarent dans le .ioc, puis Run via l'interface ST-LINK. Le moniteur serie du ST-LINK affiche les printf a 115200.
Variantes
Changer la fréquence via la configuration CubeMX (ARR/PSC), ou piloter 4 canaux pour 4 LED avec un seul timer.
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);
}
}
}