I have a very basic question:
I am developing a new radio control system on Teensy 4.1 in PlatformIO. A few other people are testing and using this system to fly their models. When the software is updated, I would like to create a binary file and upgrade the teensy 4.1 firmware easily for these people.
Can anyone tell me how best to do this?
I’m ashamed I don’t know!
Thank you very much in advance!
PlatformIO already generates the binary output files for you in the build directory. If you named your environment in the
platformio.ini the standard
teensy41, after a compile, you will find
.pio/build/teensy41/firmware.hex and related (
.bin). The .hex file can be used in the standard Teensy flasher tools, e.g. here, and then the teensy can with that be programmed with the click of a button.
Thank you Max !
I guessed it must be simple enough - when you know.
I shall explore - and there may be an annoyingly loud shout of EURIKA! When I get it to work.
I guess that Teensy ‘loader’ app is therefore needed by users to upgrade the firmware? I better ask them to download it.
Eurika!!! It is working thank you!
But I see the reset button must be pressed. That means opening up the transmitter case which is five screws… Is there a way of doing this without pressing a button on the teensy manually?
Oh right I forgot about that. The teensy tools (and thus also PlatformIO) can reboot the teensy automatically into bootloader mode if the firmware exposes the standard USB serial. But for that an extra teensy program called
teensy_reboot must be used. Once the
teensy.exe GUI is open and says “press reset button”, you can just execute the
teensy_reboot program and then
teensy.exe will see the device, no reboot button pressing needed. This has already outlined in arduino ide - Use command line to upload program through hex file to Teensy-LC - Arduino Stack Exchange.
Note that these tools are for some reason not available for a precompiled download from the Teensy website, only when one would install the full Teensyduino Arduino IDE extension. However, you can grab the files (that is, actually all teensy related tools) from PlatformIO. The API request https://api.registry.platformio.org/v3/packages/platformio/tool/tool-teensy shows the available OSes and download links, e.g.
(needs e.g. 7zip to extract the
There’s also a more automated way of doing it with all these tools available. One can just put the two tools
teensy_loader_cli.exe in the same folder as the
firmware.hex and the following simple
upload.bat script (this is Windows specific of course)
echo Rebooting device
echo Flashing firmware
teensy_loader_cli.exe -w -s -mmcu=TEENSY41 -v firmware.hex
So, simply double-clicking on
upload.bat will do a reboot & flash & reboot to firmware, then ask to press a key to close the window.
The script can be trivially written for Unix-like OSes (aka, Linux & Mac) too. They will need the appropriate version of the tools for their OS too, of course.
And finally, if your users are themselves developers who already have PlatformIO, you can just compile locally once, then clear the
.pio\build\<env>\ folder while not deleting the needed
firmware.hex. Users can then do a upload without compile (taking the existing
pio run -t nobuild -t upload as explained in Upload Latest build without a Compile/Link - #4 by ivankravets. Then PlatformIO would also automatically take care of downloading the correct version of the tools since it draws those from the PlatformIO registry. This would need a whole PlatformIO installation of course, and the distribution package above there is more compact.
Fantastic! Thank you a million times.
An amazing answer! Perfect!
The nostalgic batch file approach appeals to me a lot as I was brought up on MS-DOS 2.11 and 8086 assembler I’ll do it …
… it occurs to me (during tests this evening) Windows is less than perfectly reliable especially via Parallels on usb / com ports…
But I could add an option into my Teensy 4.1 code that would trigger a reset simply by rapidly overfeeding the watchdog.
This could allow a simple firmware upgrade without removing the back of the case.
I’ll try this tomorrow morning. Thank you again!
Something not working as expected, or not every time? Maybe some delay /
sleep 1 is needed in between rebooting and flashing?
Please check an upload output, PlatformIO hints you with multiple upload protocols. Have you tried to add to
bord = ...
upload_protocol = teensy-cli
That was in reference to doing it the custom way with just
teensy.exe, not with PlatformIO
Ah… Sorry, marked your post as the “SOLUTION”
P.S: We plan to update our docs for Teensy and add information about uploading via CLI without Tensy GUI.
Indeed I have more work to do.
My watchdog reset idea certainly reset it as expected, but this disappointingly failed to get the loader to load the firmware and I don’t yet know why.
All ideas gratefully accepted! It’s so nearly there!
I did succeed this morning in reading the Teensy 4.1 MAC address and using this as a unique pipe address for RF binding (I’m using an nRF24L01 transceiver). So that’s a big step in the right direction. Now I can send identical update files to all users.
I guess getting into bootloader mode is not simply doing a reset, but something more. Can you explain in more detail what happens when you do it with
teensy_reboot -s? Have you tried adding
-v in there to see if there are any errors?
I think your suggestion is probably very helpful but I can’t understand it yet sorry! Could you explain more completely as if to a beginner like me ?!
Ivan assumed you had trouble uploading through PlatformIO, and said to make sure to set the
upload_protocol in the
platformio.ini to that value. It’s not relevant if you are right now having problems with a custom upload script.
Ok - Eurika ^2!!
It’s working now!
Under latest Mac OS, if I use teensy.app and teensy_reboot it successfully loads the firmware!
Now I must make a Mac version of a batch file to automate this for the more simple folk!
Thank you for your help!