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 STM32F407G-DISC1 (Discovery F4, Cortex-M4 @ 168 MHz) avec ST-LINK integre, 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 « STM32F407G-DISC1 » : coller le code dans main.c, configurer le .ioc, Run. La carte dispose de 4 LED (PD12-PD15) et du bouton USER sur PA0.
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);
}
}
}