🛠 Firmware libre sur Blue Pill avec libopencm3 et OpenOCD

STM32F103 "Blue Pill" (STM32F103C8T6) · avance · Compiler le miniblink adapté à la LED PC13 avec la bibliothèque open-source écrite d'après les datasheets, et flasher via OpenOCD/stlink.

Pourquoi libopencm3 ?

libopencm3 est une bibliothèque GCC open-source pour Cortex-M « écrite complètement depuis zéro à partir des datasheets du fabricant » — sans code ST, sous licence LGPL3. La famille STM32 F1xx est supportée, et le projet documente le flash via OpenOCD. C'est l'option idéale pour comprendre ce que fait vraiment le HAL, avec une API légère (rcc, gpio, usart, spi, i2c, adc, can…) et des exemples canoniques : le dépôt libopencm3-examples contient des cibles stm32-maple (miniblink, USB CDC-ACM, démos SPI/I2C) qui correspondent aux cartes classe Blue Pill.

Le miniblink, version PC13

Adapté de l'exemple stm32-maple/miniblink, en tenant compte de la LED en mode sink (HIGH = éteinte) et de la faible capacité de drive de PC13 :

#include <libopencm3/stm32/rcc.h>
#include <libopencm3/stm32/gpio.h>

static void gpio_setup(void)
{
    /* Active l'horloge du périphérique GPIOC (RCC_APB2ENR |= IOPCEN). */
    rcc_periph_clock_enable(RCC_GPIOC);

    /* PC13 en sortie push-pull 2 MHz (broche à faible drive). */
    gpio_set_mode(GPIOC, GPIO_MODE_OUTPUT_2_MHZ,
                  GPIO_CNF_OUTPUT_PUSHPULL, GPIO13);
}

int main(void)
{
    int i;
    gpio_setup;
    while (1) {
        gpio_set(GPIOC, GPIO13);      /* HIGH -> LED ÉTEINTE (sink) */
        for (i = 0; i < 800000; i++)
            __asm__("nop");
        gpio_clear(GPIOC, GPIO13);    /* LOW -> LED ALLUMÉE */
        for (i = 0; i < 800000; i++)
            __asm__("nop");
    }
}

Deux leçons matérielles encapsulées dans ce fichier : il faut activer l'horloge APB2 du port GPIOC avant tout accès (sinon écritures sans effet), et PC13 doit rester une broche de commande lente — d'où le mode 2 MHz.

Chaîne de compilation et flash

La définition de carte PlatformIO pour genericSTM32F103C8 liste d'ailleurs les frameworks arduino, cmsis, libopencm3, stm32cube et les protocoles d'upload jlink, cmsis-dap, stlink, blackmagic, serial, dfu — la preuve que cette carte se prête à toutes les niveaux d'abstraction.

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels