clignotante.c

STM32F103 "Blue Pill" (STM32F103C8T6) · Archivo : clignotante.c · Lenguaje : C · Uso : Faire clignoter la LED utilisateur avec la bibliothèque HAL

El parpadeo de referencia en C puro con STM32 HAL: el LED de usuario en pin 13 cambia cada 500 ms gracias al tick SysTick de 1 ms de HAL. El esqueleto es el generado por STM32CubeIDE, listo para compilar.

Hardware

Una Blue Pill STM32F103C8T6 (Cortex-M3 @ 72 MHz, 64 KB flash) alimentada por micro-USB o 3,3 V externo; programacion SWD o bootloader serie. Ninguno: basta con el LED de usuario (LED PC13 en mode sink : LOW allume, HIGH eteint). La placa se programa por su conector USB (ST-LINK o bootloader).

Cableado

Nada que cablear: LED interno en GPIOC/GPIO_PIN_13, activo en estado LOW (logique active-low : LOW allume la LED).

Funcionamiento

HAL_Init() configura SysTick (tick de 1 ms); HAL_GetTick() actúa como reloj no bloqueante. HAL_GPIO_WritePin controla el pin push-pull. __WFI() duerme la CPU entre ticks.

Ejecución

Proyecto STM32CubeIDE (STM32F103C8) o Arduino (core STM32): programar por SWD (ST-LINK, adaptador DAPLink) o por el bootloader serie (BOOT0 a 1). Atencion: el LED PC13 es activo LOW.

Variantes

Crea el proyecto con el .ioc de ST (o uno equivalente), o usa la librería LL para un código más ligero.

clignotante.c

// Clignotement LED en STM32 HAL (projet genere par STM32CubeIDE/.ioc).
#include "main.h"

/* Broche de la LED utilisateur de la carte. */
#define LED_PORT  GPIOC
#define LED_PIN   GPIO_PIN_13
/* LED active a l'etat LOW (logique active-low : LOW allume la LED). */

uint32_t dernierBlink = 0;
uint8_t etat = 0;

int main(void) {
  HAL_Init();            // SysTick 1 ms + priorites NVIC
  SystemClock_Config();  // horloge generee depuis CubeMX

  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();

  GPIO_InitTypeDef g = {0};
  g.Pin = LED_PIN;
  g.Mode = GPIO_MODE_OUTPUT_PP;   // sortie push-pull
  g.Pull = GPIO_NOPULL;
  g.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(LED_PORT, &g);

  for (;;) {
    if (HAL_GetTick() - dernierBlink >= 500) {  // 500 ms
      dernierBlink = HAL_GetTick();
      etat ^= 1;
      HAL_GPIO_WritePin(LED_PORT, LED_PIN, etat ? GPIO_PIN_SET : GPIO_PIN_RESET);
    }
    __WFI();  // attend l'interruption SysTick : consomme moins
  }
}

← Volver a la ficha