RS41-flashing
If you've just retrieved an RS41 radiosonde and wonder how to get started with flashing it with your own code then this page is for you.
stopping the transmitter
When an RS41 is launched it holds 2x AA batteries that will keep the radiosonde transmitting for about 6 hours. The simplest way to stop the RS41 from transmitting is to press the on/off button briefly. The button is located under the sticker with the serial number, but just press it until the LED turns off.
open the case
Pry open the two plastic tabs on the top and bottom to separate the two styrofoam halves that encapsulates the RS41 circuit board.
Connecting to the RS41 programming header
If you have a 2mm-pitch 2x5 IDC connector laying around you can use that, but most people will just have to solder four wires to the programming header.
____________________ ____________________| (circuit board) | 2 4 6 8 10 | | 1 3 5 7 9 | (programming connector) +------------+ pin ------------ 1 GND 2 3 4 Vcc (3.3V !!) 5 6 7 8 SWCLK 9 SWDIO 10
Using a USB ST-Link programming dongle we connect the wires.
setting up the STM32 compiler environment
apt-get install
install the ST-Link software
Don't use the Debian apt version of stlink, but instead use the one on github or grab it with pip (python installer)
git clone https://github.com/stlink-org/stlink.git
pip
clear the write-protect flag of the flash memory
start stlink debugger - batteries not required (power STM32 straight from STLink) - button press not required in one screen run: ---[openocd debugger]--- map@zhora:~/local/radiosonde-rs41$ openocd -f /usr/share/openocd/scripts/interface/stlink-v2.cfg -f /usr/share/openocd/scripts/target/stm32f1x.cfg Open On-Chip Debugger 0.10.0 Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'. Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD adapter speed: 1000 kHz adapter_nsrst_delay: 100 none separate Info : Unable to match requested speed 1000 kHz, using 950 kHz Info : Unable to match requested speed 1000 kHz, using 950 kHz Info : clock speed 950 kHz Info : STLINK v2 JTAG v29 API v2 SWIM v7 VID 0x0483 PID 0x3748 Info : using stlink api v2 Info : Target voltage: 3.306883 Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints ---[]--- then run telnet on another screen ---[telnet localhost 4444]--- map@zhora:~/local/radiosonde-rs41$ telnet localhost 4444 Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Open On-Chip Debugger > reset > halt target halted due to debug-request, current mode: Handler HardFault xPSR: 0x41000003 pc: 0x0800d5fc msp: 0x200015c0 > flash info 0 device id = 0x10016420 STM32 flash size failed, probe inaccurate - assuming 128k flash flash size = 128kbytes #0 : stm32f1x at 0x08000000, size 0x00020000, buswidth 0, chipwidth 0 # 0: 0x00000000 (0x400 1kB) protected # 1: 0x00000400 (0x400 1kB) protected # 2: 0x00000800 (0x400 1kB) protected # 3: 0x00000c00 (0x400 1kB) protected # 4: 0x00001000 (0x400 1kB) protected # 5: 0x00001400 (0x400 1kB) protected # 6: 0x00001800 (0x400 1kB) protected # 7: 0x00001c00 (0x400 1kB) protected # 8: 0x00002000 (0x400 1kB) protected # 9: 0x00002400 (0x400 1kB) protected # 10: 0x00002800 (0x400 1kB) protected # 11: 0x00002c00 (0x400 1kB) protected # 12: 0x00003000 (0x400 1kB) protected # 13: 0x00003400 (0x400 1kB) protected # 14: 0x00003800 (0x400 1kB) protected # 15: 0x00003c00 (0x400 1kB) protected # 16: 0x00004000 (0x400 1kB) protected # 17: 0x00004400 (0x400 1kB) protected # 18: 0x00004800 (0x400 1kB) protected # 19: 0x00004c00 (0x400 1kB) protected # 20: 0x00005000 (0x400 1kB) protected # 21: 0x00005400 (0x400 1kB) protected # 22: 0x00005800 (0x400 1kB) protected # 23: 0x00005c00 (0x400 1kB) protected # 24: 0x00006000 (0x400 1kB) protected # 25: 0x00006400 (0x400 1kB) protected # 26: 0x00006800 (0x400 1kB) protected # 27: 0x00006c00 (0x400 1kB) protected # 28: 0x00007000 (0x400 1kB) protected # 29: 0x00007400 (0x400 1kB) protected # 30: 0x00007800 (0x400 1kB) protected # 31: 0x00007c00 (0x400 1kB) protected # 32: 0x00008000 (0x400 1kB) protected # 33: 0x00008400 (0x400 1kB) protected # 34: 0x00008800 (0x400 1kB) protected # 35: 0x00008c00 (0x400 1kB) protected # 36: 0x00009000 (0x400 1kB) protected # 37: 0x00009400 (0x400 1kB) protected # 38: 0x00009800 (0x400 1kB) protected # 39: 0x00009c00 (0x400 1kB) protected # 40: 0x0000a000 (0x400 1kB) protected # 41: 0x0000a400 (0x400 1kB) protected # 42: 0x0000a800 (0x400 1kB) protected # 43: 0x0000ac00 (0x400 1kB) protected # 44: 0x0000b000 (0x400 1kB) protected # 45: 0x0000b400 (0x400 1kB) protected # 46: 0x0000b800 (0x400 1kB) protected # 47: 0x0000bc00 (0x400 1kB) protected # 48: 0x0000c000 (0x400 1kB) protected # 49: 0x0000c400 (0x400 1kB) protected # 50: 0x0000c800 (0x400 1kB) protected # 51: 0x0000cc00 (0x400 1kB) protected # 52: 0x0000d000 (0x400 1kB) protected # 53: 0x0000d400 (0x400 1kB) protected # 54: 0x0000d800 (0x400 1kB) protected # 55: 0x0000dc00 (0x400 1kB) protected # 56: 0x0000e000 (0x400 1kB) protected # 57: 0x0000e400 (0x400 1kB) protected # 58: 0x0000e800 (0x400 1kB) protected # 59: 0x0000ec00 (0x400 1kB) protected # 60: 0x0000f000 (0x400 1kB) not protected # 61: 0x0000f400 (0x400 1kB) not protected # 62: 0x0000f800 (0x400 1kB) not protected # 63: 0x0000fc00 (0x400 1kB) not protected # 64: 0x00010000 (0x400 1kB) not protected # 65: 0x00010400 (0x400 1kB) not protected # 66: 0x00010800 (0x400 1kB) not protected # 67: 0x00010c00 (0x400 1kB) not protected # 68: 0x00011000 (0x400 1kB) not protected # 69: 0x00011400 (0x400 1kB) not protected # 70: 0x00011800 (0x400 1kB) not protected # 71: 0x00011c00 (0x400 1kB) not protected # 72: 0x00012000 (0x400 1kB) not protected # 73: 0x00012400 (0x400 1kB) not protected # 74: 0x00012800 (0x400 1kB) not protected # 75: 0x00012c00 (0x400 1kB) not protected # 76: 0x00013000 (0x400 1kB) not protected # 77: 0x00013400 (0x400 1kB) not protected # 78: 0x00013800 (0x400 1kB) not protected # 79: 0x00013c00 (0x400 1kB) not protected # 80: 0x00014000 (0x400 1kB) not protected # 81: 0x00014400 (0x400 1kB) not protected # 82: 0x00014800 (0x400 1kB) not protected # 83: 0x00014c00 (0x400 1kB) not protected # 84: 0x00015000 (0x400 1kB) not protected # 85: 0x00015400 (0x400 1kB) not protected # 86: 0x00015800 (0x400 1kB) not protected # 87: 0x00015c00 (0x400 1kB) not protected # 88: 0x00016000 (0x400 1kB) not protected # 89: 0x00016400 (0x400 1kB) not protected # 90: 0x00016800 (0x400 1kB) not protected # 91: 0x00016c00 (0x400 1kB) not protected # 92: 0x00017000 (0x400 1kB) not protected # 93: 0x00017400 (0x400 1kB) not protected # 94: 0x00017800 (0x400 1kB) not protected # 95: 0x00017c00 (0x400 1kB) not protected # 96: 0x00018000 (0x400 1kB) not protected # 97: 0x00018400 (0x400 1kB) not protected # 98: 0x00018800 (0x400 1kB) not protected # 99: 0x00018c00 (0x400 1kB) not protected #100: 0x00019000 (0x400 1kB) not protected #101: 0x00019400 (0x400 1kB) not protected #102: 0x00019800 (0x400 1kB) not protected #103: 0x00019c00 (0x400 1kB) not protected #104: 0x0001a000 (0x400 1kB) not protected #105: 0x0001a400 (0x400 1kB) not protected #106: 0x0001a800 (0x400 1kB) not protected #107: 0x0001ac00 (0x400 1kB) not protected #108: 0x0001b000 (0x400 1kB) not protected #109: 0x0001b400 (0x400 1kB) not protected #110: 0x0001b800 (0x400 1kB) not protected #111: 0x0001bc00 (0x400 1kB) not protected #112: 0x0001c000 (0x400 1kB) not protected #113: 0x0001c400 (0x400 1kB) not protected #114: 0x0001c800 (0x400 1kB) not protected #115: 0x0001cc00 (0x400 1kB) not protected #116: 0x0001d000 (0x400 1kB) not protected #117: 0x0001d400 (0x400 1kB) not protected #118: 0x0001d800 (0x400 1kB) not protected #119: 0x0001dc00 (0x400 1kB) not protected #120: 0x0001e000 (0x400 1kB) not protected #121: 0x0001e400 (0x400 1kB) not protected #122: 0x0001e800 (0x400 1kB) not protected #123: 0x0001ec00 (0x400 1kB) not protected #124: 0x0001f000 (0x400 1kB) not protected #125: 0x0001f400 (0x400 1kB) not protected #126: 0x0001f800 (0x400 1kB) not protected #127: 0x0001fc00 (0x400 1kB) not protected STM32F100 (Low/Medium Density) - Rev: Z > > reset > halt > flash protect 0 0 last off Device Security Bit Set target halted due to breakpoint, current mode: Handler HardFault xPSR: 0x61000003 pc: 0x2000003a msp: 0x200015c0 cleared protection for sectors 0 through 127 on flash bank 0 > flash info 0 device id = 0x10016420 flash size = 64kbytes #0 : stm32f1x at 0x08000000, size 0x00010000, buswidth 0, chipwidth 0 # 0: 0x00000000 (0x400 1kB) not protected # 1: 0x00000400 (0x400 1kB) not protected # 2: 0x00000800 (0x400 1kB) not protected # 3: 0x00000c00 (0x400 1kB) not protected # 4: 0x00001000 (0x400 1kB) not protected # 5: 0x00001400 (0x400 1kB) not protected # 6: 0x00001800 (0x400 1kB) not protected # 7: 0x00001c00 (0x400 1kB) not protected # 8: 0x00002000 (0x400 1kB) not protected # 9: 0x00002400 (0x400 1kB) not protected # 10: 0x00002800 (0x400 1kB) not protected # 11: 0x00002c00 (0x400 1kB) not protected # 12: 0x00003000 (0x400 1kB) not protected # 13: 0x00003400 (0x400 1kB) not protected # 14: 0x00003800 (0x400 1kB) not protected # 15: 0x00003c00 (0x400 1kB) not protected # 16: 0x00004000 (0x400 1kB) not protected # 17: 0x00004400 (0x400 1kB) not protected # 18: 0x00004800 (0x400 1kB) not protected # 19: 0x00004c00 (0x400 1kB) not protected # 20: 0x00005000 (0x400 1kB) not protected # 21: 0x00005400 (0x400 1kB) not protected # 22: 0x00005800 (0x400 1kB) not protected # 23: 0x00005c00 (0x400 1kB) not protected # 24: 0x00006000 (0x400 1kB) not protected # 25: 0x00006400 (0x400 1kB) not protected # 26: 0x00006800 (0x400 1kB) not protected # 27: 0x00006c00 (0x400 1kB) not protected # 28: 0x00007000 (0x400 1kB) not protected # 29: 0x00007400 (0x400 1kB) not protected # 30: 0x00007800 (0x400 1kB) not protected # 31: 0x00007c00 (0x400 1kB) not protected # 32: 0x00008000 (0x400 1kB) not protected # 33: 0x00008400 (0x400 1kB) not protected # 34: 0x00008800 (0x400 1kB) not protected # 35: 0x00008c00 (0x400 1kB) not protected # 36: 0x00009000 (0x400 1kB) not protected # 37: 0x00009400 (0x400 1kB) not protected # 38: 0x00009800 (0x400 1kB) not protected # 39: 0x00009c00 (0x400 1kB) not protected # 40: 0x0000a000 (0x400 1kB) not protected # 41: 0x0000a400 (0x400 1kB) not protected # 42: 0x0000a800 (0x400 1kB) not protected # 43: 0x0000ac00 (0x400 1kB) not protected # 44: 0x0000b000 (0x400 1kB) not protected # 45: 0x0000b400 (0x400 1kB) not protected # 46: 0x0000b800 (0x400 1kB) not protected # 47: 0x0000bc00 (0x400 1kB) not protected # 48: 0x0000c000 (0x400 1kB) not protected # 49: 0x0000c400 (0x400 1kB) not protected # 50: 0x0000c800 (0x400 1kB) not protected # 51: 0x0000cc00 (0x400 1kB) not protected # 52: 0x0000d000 (0x400 1kB) not protected # 53: 0x0000d400 (0x400 1kB) not protected # 54: 0x0000d800 (0x400 1kB) not protected # 55: 0x0000dc00 (0x400 1kB) not protected # 56: 0x0000e000 (0x400 1kB) not protected # 57: 0x0000e400 (0x400 1kB) not protected # 58: 0x0000e800 (0x400 1kB) not protected # 59: 0x0000ec00 (0x400 1kB) not protected # 60: 0x0000f000 (0x400 1kB) not protected # 61: 0x0000f400 (0x400 1kB) not protected # 62: 0x0000f800 (0x400 1kB) not protected # 63: 0x0000fc00 (0x400 1kB) not protected STM32F100 (Low/Medium Density) - Rev: Z > ---[]---
flasing firmware
once the flash has been set to unprotected, it is now possible to write the .bin file in one simple way:
st-flash --format binary write RS41HUP.bin 0x8000000
btw, you may need to time it right to start this command as it may only accept incoming resets/writing data at the very beginning of powering up the device.