Reinstalando firmware en una radiosonda: RS41 de Vaisala

Debe leer previamente estas dos entradas para poder seguir este proceso:

Así estaremos en un punto que:
  • Conoceremos el hardware de nuestra sonda, concretamente los modelos de: placa,  procesador y chip de radio.
  • Tendremos instalados en nuestro ordenador y conoceremos el funcionamiento de los programas openocd y STM32Cube Programming 
  • Dispondremos de un dispositivo  ST-Link V2 y lo tendremos  cableado correctamente con  la RS41
  • Tendremos desbloqueada la sonda RS41 que queremos reprogramar frente a borrado y  escritura 
Vamos a proceder a instalar  elfirmware RS41-NFW que utiliza Arduino IDE para su compilación, que es posible que ya haya usado en algun proyecto con ESP32, y para la carga del firmware usaremos openOCD o STM32 Cube Programing

Concretamente vamos a instalar la versión: 
  • "RS41-NFW v65, GPL-3.0 Franek Lada (nevvman, SP5FRA)" 


Siga las instrucciones del proyecto RS41-NFM, aquí solamente se comentan por encima, o se señala donde se encontraron dificaultades


Descargue librerias del proyecto

Descargue desde  https://github.com/Nevvman18/rs41-nfw los fuentes   y  descomprima el fichero ZIP. Las mas importantes son las carpetas o directorios_
  • fw/arduino-ide_variant-files/ de la cual extraeremos una definiciónd e placas 
  • rs41-nfw_sonde-firmware/ donde se encuentra el archivo .ino que finalmente compilaremos apra obtener las binarias apra cargar (.bin)

Añadir las placas STM32 

En preferencias del Arduino IDE incluir la siguiente librería https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json

En Gestor de placas cargar STM32 y cuando acabe rearrancar ArduinoIDE




Borrar cache

Compruebe si existe un fichero cache para las Arduino IDE y si existe bórrelo (para macOS lo encontramos en ~/Library/Application Support/arduino-ide )


Cambiar carpeta por defecto por la del proyecto

Localice la librería 
Library/Arduino15/packages/STMicroelectronics/hardware/stm32/x.x.x/variants/STM32L4xx

Borre 
"L412RB(I-T)xP"  con  rm -rf "L412RB(I-T)xP"

Copie la carpeta que hemos descargado de github, si la hemos dejado en el raiz para macOS se ahce  cp -r ~/L412RB\(I-T\)xP 

Modifique el fichero boards.txt de la versión (en nuestro caso 2.12.0) añadiendo
# Generic L412RBTxP
GenL4.menu.pnum.GENERIC_L412RBTXP=Generic L412RBTxP
GenL4.menu.pnum.GENERIC_L412RBTXP.upload.maximum_size=131072
GenL4.menu.pnum.GENERIC_L412RBTXP.upload.maximum_data_size=40960
GenL4.menu.pnum.GENERIC_L412RBTXP.build.board=GENERIC_L412RBTXP
GenL4.menu.pnum.GENERIC_L412RBTXP.build.product_line=STM32L412xx
GenL4.menu.pnum.GENERIC_L412RBTXP.build.variant=STM32L4xx/L412RB(I-T)xP
GenL4.menu.pnum.GENERIC_L412RBTXP.debug.svd_file={runtime.tools.STM32_SVD.path}/svd/STM32L4xx/STM32L412.svd


Selección de la placa en Arduino IDE.
  • Para versiones anteriores (p. ej., RSM412):
    • Selecciona la serie STM32F1 genérica en Herramientas (IDE), luego ve a Herramientas (IDE) -> Número de pieza de la placa: y selecciona la placa F100C8Tx genérica.
  • Para versiones más recientes (p. ej., RSM414, RSM424):
    • Selecciona la serie STM32L4 genérica en Herramientas (IDE), luego ve a Herramientas (IDE) -> Número de pieza de la placa: y selecciona la placa L412RBTxP genérica recién instalada. ¿No la ves? Asegúrate de haber seguido la guía anterior.
  • Selecciona el programador (Upload) adecuado: Herramientas (IDE) -> Programador: -> STMicroelectronics ST-LINK.
  • Selecciona la configuración de optimización del compilador como "Más pequeña" Smallest  (-Os por defecto). 
Modificar el fichero .ino

//===== Device revision definitions
/* CHANGE-ME! SELECT YOUR BOARD REVISION BY UNCOMMENTING THE RIGHT DEFINITION BELOW (model can be found written on the PCB at the bottom part, see compilation manual for more info)*/
 
#define RSM4x4 // New PCB versions, RSM4x4 AND RSM4x5 (based on MCU STM32L412RBT6 LQFP64)
// #define RSM4x2  // Old PCB versions, RSM4x2 and RSM4x1 (based on MCU STM32F100C8T6B LQFP48)

Compilar como "Exportar binario compilado" desde IDE 
Nos dará un error del tipo , que nos dice que tras compilar no puede cargarlo, no hay problema
getopt: illegal option -- a
Terminating...
Failed uploading: uploading error: exit status 1

Copiar el binario que se encuentra en la subcarpeta build del directorio donde hemos estado compilando con  openocd

openocd -f interface/stlink.cfg -c "transport select hla_swd" -c "set CPUTAPID 0x2ba01477" -f target/stm32l4x.cfg -c "init; halt; program RS41-NFW-Arduino.ino.bin 0x08000000 verify reset exit"

O mucho mas facil desde

STC32cubic Programmer

En STC32cubic programmer la secuencia de carga del firmware es la siguiente

13:42:27 : Opening and parsing file: rs41-nfw_sonde-firmware.ino.bin 13:42:27 : Memory Programming ... 13:42:27 : File : rs41-nfw_sonde-firmware.ino.bin 13:42:27 : Size : 70.11 KB 13:42:27 : Address : 0x08000000 13:42:27 : Erasing memory corresponding to segment 0: 13:42:27 : Erasing internal memory sectors [0 35] 13:42:28 : Download in Progress: 13:42:30 : File download complete 13:42:30 : Time elapsed during download operation: 00:00:02.447 13:42:30 : Verifying... 13:42:30 : Read progress: 13:42:30 : Time elapsed during verifying operation: 00:00:00.463 13:42:30 : Download verified successfully 13:42:30 : RUNNING Program ... 13:42:30 : Address: : 0x08000000 13:42:30 : Application is running, Please Hold on... 13:42:30 : Start operation achieved successfully

PRUEBAS

En la primera parte del fichero  .ino vienen las definiciones generales y las especi
íficas de los difersos modos:
  • PIP
  • CW
  • APRS
  • RTTY
  • FOX
  • HORUS V2 
  • HORUS V3
En todos ellos puede ponerlos activos (true) o inactivos (false)


SECUENCIA DE ARRANQUE

LED DOBLE DE LA PLACA

Secuencia de arranque correcta
  • rojo
  • rojo y verde (naranja)
  • rojo y verde (naranja) intermitente 2 por segundo
  • rafaga de 5 verdes => Fin arranque
  • rojo y verde (naranja) intermitente 2 seguidos
  • verde intermitente
  • verde fijo => OK
Secuencia de arranque erronea por baterias bajas
  • rojo
  • naranja

Significado DEL LED DE LA PLACA
Durante el arranque:
- Rojo parpadea 3 veces: condiciones incorrectas para la calibración de humedad cero;
se sale de la calibración.
- Rojo parpadea 5 veces: calibración de humedad cero cancelada debido a un error en el brazo del sensor.
- Rojo fijo: inicialización del hardware.
- Naranja fijo: inicialización del brazo del sensor y del circuito de calefacción,
y también inicialización parcial del GPS.
- Naranja intermitente breve: calibración en curso, ya sea reacondicionamiento,
corrección de temperatura o comprobación de humedad cero.
- Verde parpadea. 5 veces: configuración del firmware completada, ingreso al programa principal

Durante el funcionamiento:
- Rojo fijo: error importante, como error en el brazo del sensor,
error de calibración inicial del sensor, error de conexión RPM411 (si está configurado).
- Naranja fijo: advertencia, como falta de señal GPS o voltaje
de la batería por debajo de 'vBatWarnValue'.
- Naranja intermitente: modo de rendimiento GPS mejorado habilitado y la sonda sigue buscando satélites.
- Verde intermitente: modo de rendimiento GPS mejorado habilitado y
la sonda ha encontrado varios satélites y pronto volverá al modo listo para volar.

La información del LED para el caso del GPS depende de la opción de gpsOprationmode del .ino
  • 0 - Totalmente desactivado (uso estacionario, como en una estación meteorológica;
  • las coordenadas estacionarias se pueden especificar en gpsLat-gpsLong)
  • 1 - Por defecto, siempre activado;
  • 2 - Ahorro de energía estándar en posición estable (solo RSM4x2;
  • función antigua que reduce el consumo cuando la señal GPS es fuerte;
  • vuelve automáticamente al máximo rendimiento cuando es necesario).
  • 3 - Gestión inteligente de GPS: algoritmo disponible solo para placas
  • RSM4x4. Este algoritmo, junto con las funciones Super-S, PSMCT, ITFM,
  • constelaciones y mensajes GNS del GPS M10 u-blox, permite una mejora
  • considerable en el consumo de energía y la resistencia a interferencias.
- Verde fijo: todos los sistemas funcionan correctamente y sin errores; la sonda está lista para ser lanzada. LED DEL GPS (bajo el chip)

Verde intermitente (Funciona del GPS)


MODOS

comun a todos
// TX power, 0 = -1dBm (~0.8mW), 1 = 2dBm (~1.6mW),
2 = 5dBm (~3 mW), 3 = 8dBm (~6 mW), 4 = 11dBm (~12 mW),
5 = 14dBm (25 mW), 6 = 17dBm (50 mW), 7 = 20dBm (100 mW)

PIP

Emitir un pitido de forma intermitente

// Pip:
bool pipEnable = false; // Enable pip tx mode (carrier)
constexpr float pipFrequencyMhz = 432.7; // Pip tx frequency
constexpr uint16_t pipLengthMs = 100; // Pip signal length in ms
constexpr uint16_t pipRepeat = 3; // Pip signal repeat count in 1 transmit window
constexpr int8_t pipRadioPower = 7;

CW

Transmite en Morse

morseUnitTime = 40 es una velocidad muy alta

Valor (ms)Velocidad (WPM)Sensación
4030Muy rápido (Nivel experto)
6020Rápido pero legible
8015Velocidad ideal para pruebas
10012Lento y muy claro
// Morse: // bool morseEnable = true; // Enable morse tx mode bool morseEnable = false; // disable morse tx mode constexpr float morseFrequencyMhz = 434.6; // Morse tx frequency constexpr uint16_t morseUnitTime = 40; // Morse unit time constexpr int8_t morseRadioPower = 7;



Advertencia importante

Las modificaciones, configuraciones y procedimientos descritos en este sitio pueden implicar riesgos técnicos, legales o de seguridad. El autor no se responsabiliza del mal funcionamiento de los equipos, daños permanentes, pérdida de garantía ni de posibles infracciones legales derivadas del uso de esta información.
El lector asume plena responsabilidad por cualquier acción que decida realizar basándose en el contenido de este blog.

© 2026 EA5JTT. Queda prohibida la reproducción total o parcial sin autorización expresa del autor.

ST-Link STM8/STM32 v2

ST-Link STM8/STM32 v2 (Disponible en Aliexpress) que es un programador y depurador (debugger) para microcontroladores de la familia STMicroelectronics.  Es el puente entre el puerto USB delPC y los pines de programación del chip.

No se fie de la imagen y siga el cableado de su modelo en concreto


CONEXIÓN

Conexiones principales (SWD)

Para la mayoría de los chips STM32 (los más comunes), el ST-Link utiliza un protocolo llamado SWD (Serial Wire Debug) que solo necesita 4 cables:

Pin en ST-LinkPin en el Chip / PlacaFunción
SWDIOSWDIO (o PA13)Datos
SWCLKSWCLK (o PA14)Reloj
GNDGNDTierra
3.3V3.3V (VCC)Alimentación
Conexiones de la sonda RS41 V_boost=Vcc_bust; MCU_RST=RESET; VBAT=Vcc
Usados: GND (Común o tierra); UART_TX (TX para la sonda RX para el ordenador), UART_RX (RX para la sonda, TX para el ordenador)



ATENCION Si el dispositivo a reprogramar (p.e. RS41) ya tiene alimentación (p.e. baterias) no conecte la alimentación de 3,3V 
(+3V_MCU =  PB1)


STM32CUBEPROGRAMER

Hay que descargar STM32CubeProgramer (unos 250 MB)  desde https://www.st.com/content/st_com/en.html y necesitará previamente darse de alta

Conecramos la sonda RS41 al ST-Link v2 (GND, SWDIO y SWCLK) y este al puerto USB de neustro ordenador (En nuestro caso es un macBook)

Pantalla de STM32CubeProgramer

Log con error en la lectura de datos

En el log podemos ver que:
  • el ST-Link funciona perfectamente y ha reconocido el chip
  • El código Device ID: 0x464 confirma que tienes un STM32L151 o similar (el cerebro de la RS41)
  • El "error Data read failed" indica que la Protección de Lectura (RDP) está activa. Vaisala protege sus sondas para que no podamos copiar su código original.

DESBLOQUEAR Y BORRAR FIRMWARE ORIGINAL DE VAISALA

Hay que limpiar el firmware, para ello 
  • En la columna de la izquierda de STM32CubeProgrammer, haz clic en el icono del escudo con una marca de verificación (OB - Option Bytes).

  • Despliega la sección que dice Read Out Protection.

  • El campo RDP está en Level 1 (o BB).
  • Cámbiad a Level 0 (AA).
  • Haz clic en el botón Apply.


Cambio a AA (LEvel 0, no protection) y APPLY


Borrado realizado

Protección eliminada


Al final hubo que hacerlo con comandos openocd, una vez roto ya se puede usar STM32Cube programmer

INSTALAR NUEVO FIRMWARE

Tomaremos como ejemplo rs41rg (ATENCION HASTA AQUÍ TODO ES VÁLIDO PERO ESTE FIRMWARE NO FUNCIONA CON LAS SONDAS RS41 DE VAISALA)

Modificar / Configurar

Descargar el proyecto desde https://github.com/mikaelnousiainen/RS41ng como zip y descomprimirlo

Modificar el fichero src/config.h
  • Haga una copia de segudidad, poniendole extensión .bak 
  • Configure su indicativo de radioaficionado, la programación de transmisión (sincronización horaria), las frecuencias de transmisión y los parámetros del modo de transmisión en config.h.
    • Seleccione el tipo de radiosonda deseado al principio del archivo eliminando el comentario // de las líneas #define RS41 o #define DFM17.
    • Personalice el indicativo de llamada MYCALL => su indicativo
    • Para RS41, los ajustes que empiezan por RADIO_SI4032_ para seleccionar la potencia y los modos de transmisión.
Vamos a usar APRS por lo que cambiamos la potencia de 5 => 7

Vamos a e jecutar 1 vez CW (true) en  RADIO_SI4032_TX_F REQUENCY_CW        432300000y 2 veces APRS (true) RADIO_SI4032_TX_FREQUENCY_APRS_1200 432500000

    • Para APRS al menos APRS_SSID, APRS_SYMBOL y APRS_COMMENT si transmite APRS.
      • #define APRS_CALLSIGN CALLSIGN
      • #define APRS_SSID 'D'
      • #define APRS_SYMBOL_TABLE '/'
      • #define APRS_COMMENT "RS41ng radiosonde firmware test"
      • #define APRS_WEATHER_REPORT_ENABLE true
    • PAra CW
      • #define CW_SPEED_WPM 20  // CW speed in WPM, range 5 - 40
      • #define CW_TIME_SYNC_SECONDS 0
      • #define CW_TIME_SYNC_OFFSET_SECONDS 0
    • Configure las plantillas de mensajes transmitidos en config.c, según los modos que utilice. Puede personalizar los mensajes APRS, CATS y CW con más detalle aquí.
      • Para CW solo indicativo
        • char *cw_message_templates[] = { "$cs", NULL};
      • Para APRS

Compilar

Cómo usamos macOS debemos ejecutar desde el terminal
  • brew install --cask gcc-arm-embedded
  • brew install make
  • cd /Users/Juan/Downloads/RS41ng-main
  • mkdir build 
  • cd build
  • Mirar donde esta el fichero y que nombre tiene
    • which arm-none-eabi-gcc => en nuestro caso => /usr/local/bin/arm-none-eabi-gcc
  • Ejecutar
cmake .. -DCMAKE_SYSTEM_NAME=Generic \
-DCMAKE_C_COMPILER=/usr/local/bin/arm-none-eabi-gcc \
-DCMAKE_CXX_COMPILER=/usr/local/bin/arm-none-eabi-g++ \
-DCMAKE_TRY_COMPILE_TARGET_TYPE="STATIC_LIBRARY" \
-DCMAKE_C_COMPILER_WORKS=1 \
-DCMAKE_CXX_COMPILER_WORKS=1 \
-G "Unix Makefiles"

Si vas a hacer cambios a menudo, el orden ideal para no tener problemas con las rutas de tu Mac es:

  1. Entrar en build: cd build

  2. Parchear rutas (por si acaso): find . -type f \( -name "*.make" -o -name "*.txt" \) -exec sed -i '' 's|/usr/bin/arm-none-eabi-|/usr/local/bin/arm-none-eabi-|g' {} +

  3. Compilar: make

  4. Generar BIN: /usr/local/bin/arm-none-eabi-objcopy -O binary src/RS41ng.elf RS41ng_EA5JTT.bin


Cargar el firmware

Parametros de conexión por defecto del ST32cube programmer al ST-LINK 

Cuando nos conectamos de forma correcta con el RS41 nos da indormación del procesador.
Las radiosondas mas recientes usan STM32L412  y el chip de radio Si4063 (o similar de la serie Si446x).
Las sondas RS41 de Vaisala mas antiguas usan STM32F100 y el chip de radio Si4032.


Previamente a cargar el .bin con ST32cube Programmer hay que desbloquer  la protección de memoria 

Pruebe primeramente con STMcubeprog 

  • Para RSM414RSM424RSM425)
    • En OB (Options byte)  Read Out Protection
      • cambiar RDP byte de BB a AA
    • En OB (Options byte) Write Protection modifique los siguientes valores
      • WRP1A_STRT - value 0x1address 0x08000800
      • WRP1A_END - value 0x0address 0x08000000
      • WRP1B_STRT - value 0x1address 0x08000800
      • WRP1B_END - value 0x0address 0x08000000
  • Pruebe con el boton de la esquina inferior izquierda (Erase Full chip flash memory)

Si el borrado falla pruebe con openoocd que apra macOS es
  • brew install openocd
  • Reseteo proteccion hardware
    • openocd -f interface/stlink.cfg -c "transport select hla_swd" -c "set CPUTAPID 0x2ba01477" -f target/stm32l4x.cfg -c "init; halt; stm32l4x unlock 0; shutdown"
  • Borra graba y verifica
    • openocd -f interface/stlink.cfg -c "transport select hla_swd" -c "set CPUTAPID 0x2ba01477" -f target/stm32l4x.cfg -c "init; halt; program RS41ng_EA5JTT.bin 0x08000000 verify reset exit"
  • Borrado completo antes de reintalar firmware
    • openocd -f interface/stlink.cfg -c "transport select hla_swd" -c "set CPUTAPID 0x2ba01477" -f target/stm32l4x.cfg -c "init; halt; stm32l4x mass_erase 0; exit"
Log de STM32CubeProgrammer
21:03:29 : UR connection mode is defined with the HWrst reset mode
21:03:29 : ST-LINK SN  : 303030303030303030303031
21:03:29 : ST-LINK FW  : V2J37S7
21:03:29 : Board       : --
21:03:29 : Voltage     : 2.87V
21:03:29 : SWD freq    : 4000 KHz
21:03:29 : Connect mode: Under Reset
21:03:29 : Reset mode  : Hardware reset
21:03:29 : Device ID   : 0x464
21:03:29 : Revision ID : Rev A
21:03:29 : Debug in Low Power mode enabled.
21:03:29 : UPLOADING OPTION BYTES DATA ...
21:03:29 :   Bank          : 0x00
21:03:29 :   Address       : 0x40022020 
21:03:29 :   Size          : 20 Bytes
21:03:29 : UPLOADING ...
21:03:29 :   Size          : 1024 Bytes
21:03:29 :   Address       : 0x8000000
21:03:29 : Read progress:
21:03:29 : Data read successfully
21:03:29 : Time elapsed during the read operation is: 00:00:00.019
21:03:38 : Opening and parsing file: RS41ng_EA5JTT.bin
21:03:38 : Memory Programming ...
21:03:38 :   File          : RS41ng_EA5JTT.bin
21:03:38 :   Size          : 49.43 KB 
21:03:38 :   Address       : 0x08000000
21:03:38 : Erasing memory corresponding to segment 0:
21:03:38 : Erasing internal memory sectors [0 24]
21:03:38 : Download in Progress:
21:03:40 : File download complete
21:03:40 : Time elapsed during download operation: 00:00:01.849
21:03:40 : Verifying...
21:03:40 : Read progress:
21:03:40 : Time elapsed during verifying operation: 00:00:00.309
21:03:40 : Download verified successfully
21:03:54 : Opening and parsing file: RS41ng_EA5JTT.bin
21:03:54 : Memory Programming ...
21:03:54 :   File          : RS41ng_EA5JTT.bin
21:03:54 :   Size          : 49.43 KB 
21:03:54 :   Address       : 0x08000000
21:03:55 : Erasing memory corresponding to segment 0:
21:03:55 : Erasing internal memory sectors [0 24]
21:03:55 : Download in Progress:
21:03:56 : File download complete
21:03:56 : Time elapsed during download operation: 00:00:01.849
21:03:56 : Verifying...
21:03:56 : Read progress:
21:03:57 : Time elapsed during verifying operation: 00:00:00.307
21:03:57 : Download verified successfully
21:03:57 : RUNNING Program ... 
21:03:57 :   Address:      : 0x08000000
21:03:57 : Application is running, Please Hold on...
21:03:57 : Start operation achieved successfully


COMPROBAR

#define RADIO_SI4032_TX_FREQUENCY_CW        432300000
#define RADIO_SI4032_TX_FREQUENCY_APRS_1200 432500000

con SDR comprobar las frecuencias de emisión de CW (432,3) y APRS (432,5), que vimos que no funciona



Advertencia importante

Las modificaciones, configuraciones y procedimientos descritos en este sitio pueden implicar riesgos técnicos, legales o de seguridad. El autor no se responsabiliza del mal funcionamiento de los equipos, daños permanentes, pérdida de garantía ni de posibles infracciones legales derivadas del uso de esta información.
El lector asume plena responsabilidad por cualquier acción que decida realizar basándose en el contenido de este blog.

© 2026 EA5JTT. Queda prohibida la reproducción total o parcial sin autorización expresa del autor.

Reinstalando firmware en una radiosonda: RS41 de Vaisala

Debe leer previamente estas dos entradas para poder seguir este proceso: 3R de radiosondas: RS41 de Vaisala ST-Link STM8/STM32 v2 Así estare...