🛠 Firmware libre sur Blue Pill avec libopencm3 et OpenOCD
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
- Compilateur :
arm-none-eabi-gcc; construction dans libopencm3-examples ou via un gabarit type libopencm3-template. - Flash SWD : OpenOCD (méthode documentée par le projet) ou les outils stlink :
st-flash --reset write blink.bin 0x8000000. - Alternative sans ST-Link : le bootloader ROM série (
stm32flash, BOOT0=1, USART1 PA9/PA10 à 115200).
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
- Découvrir la Blue Pill : que trouve-t-on dans la boîte ?
- Premier programme Arduino sur la Blue Pill (core officiel stm32duino)
- Alimenter et flasher la Blue Pill : BOOT0, port série, ST-Link et DFU
- Série, ADC et chasse aux contrefaçons : diagnostiquer sa Blue Pill
- Dompter l'USB natif de la Blue Pill : CDC, DFU et la résistance rebelle
- Passer au niveau supérieur : STM32CubeIDE, HAL et LL sur F103