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)
| Pin en ST-Link | Pin en el Chip / Placa | Función |
| SWDIO | SWDIO (o PA13) | Datos |
| SWCLK | SWCLK (o PA14) | Reloj |
| GND | GND | Tierra |
| 3.3V | 3.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) |
![]() |
| Pantalla de STM32CubeProgramer |
![]() |
| Log con error en la lectura de datos |
- 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.
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 |
- 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
- 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
-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:
Entrar en build:
cd buildParchear 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' {} +Compilar:
makeGenerar BIN:
/usr/local/bin/arm-none-eabi-objcopy -O binary src/RS41ng.elf RS41ng_EA5JTT.bin
- 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"
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.

































