Skip to main content

ESC Firmware Explained

Four names come up constantly when buying or setting up a 4-in-1 ESC — BLHeli_S, Bluejay, BLHeli_32 and AM32 — and none of them says what it is. This page explains what the firmware does, why you cannot simply pick whichever one you like, and which to choose when you do have a choice.

What ESC firmware is for

A brushless motor has no brushes. Nothing inside it switches the current from one set of coils to the next as the rotor turns — something outside has to work out where the rotor is and energise the right coils, thousands of times per second.

That is the ESC, and the firmware is the program doing the working-out. It also:

  • decodes the throttle command coming from the flight controller
  • ramps the motor up from standstill, which is the hardest part
  • protects the motor and itself from overcurrent and overheating
  • on modern firmware, reports data back — RPM, current, temperature

Two ESCs with identical hardware and different firmware behave differently. That is why the name on the box matters.

The dividing line: 8-bit and 32-bit

8-bit ESCs run BLHeli_S or Bluejay; 32-bit ESCs run BLHeli_32 or AM32; firmware does not cross between them

Every ESC has a small processor on it, and it is either an 8-bit Silicon Labs EFM8 — the "Busy Bee" family — or a 32-bit ARM chip such as an STM32, AT32 or GD32.

Firmware written for one cannot run on the other. Not with an update, not with a different file. An ESC belongs to its family permanently, and the only way to change families is to buy a different ESC.

8-bit ESCs32-bit ESCs
ProcessorSilicon Labs EFM8ARM — STM32, AT32, GD32
Stock firmwareBLHeli_SBLHeli_32
Open-source optionBluejayAM32

Within a family you can move freely. A BLHeli_S ESC can be flashed to Bluejay and back whenever you like, using the same configurator, because it is the same hardware.

The four firmwares

BLHeli_S — the 8-bit stock

Written in assembly for 8-bit Silicon Labs processors, open source under GPLv3, and for years the default on almost every small 4-in-1. Its design goal was smooth throttle response, and it does that well.

Its limitation is age: no bidirectional DShot, so no RPM telemetry, and a fixed PWM frequency.

Bluejay — the 8-bit open-source successor

Bluejay is built on BLHeli_S revision 16.7 and runs on the same Busy Bee hardware. It is open source, and it adds the things BLHeli_S lacks:

  • Bidirectional DShot, with RPM telemetry and extended DShot telemetry
  • Selectable PWM frequency — 24, 48 or 96 kHz
  • Configurable startup power and RPM protection
  • Configurable startup tones

It supports DShot 300 and 600.

Because it runs on identical hardware and uses the same configurator, moving a BLHeli_S ESC to Bluejay costs nothing but a few minutes. That is why Bluejay is now what most 8-bit 4-in-1 boards ship with, including ours.

BLHeli_32 — the 32-bit stock

The third firmware in the BLHeli line, written for 32-bit processors, with more capability than the 8-bit versions had room for.

Two facts matter when choosing it today. It is closed source — its own author states this plainly — so nobody outside the project can inspect, fix or continue it. And the most recent BLHeliSuite32 release dates from November 2023, with only documentation and housekeeping commits to the repository since.

AM32 — the 32-bit open-source option

AM32 is open source under GPLv3 and runs on 32-bit ARM ESCs — STM32F051, STM32G071, STSPIN32F0, GD32E230, AT32F415 and AT32F421 among them. It is what our 55 A and 70 A boards run.

Features:

  • DShot 300 and 600, plus servo PWM
  • Bidirectional DShot
  • KISS-standard ESC telemetry
  • Variable PWM frequency
  • Sinusoidal startup, intended to get larger motors moving smoothly
  • Updatable over flight controller passthrough, single-wire serial, or an Arduino

It exposes settings the 8-bit firmwares do not, including motor KV, which lets the firmware match its timing to the motor rather than assume.

One practical difference: AM32 needs a bootloader already on the ESC. Boards sold with AM32 have one. Putting AM32 on a blank 32-bit ESC requires a hardware programmer first — an ST-LINK or equivalent — which is a job for someone who wants to do it, not a routine step.

Side by side

BLHeli_SBluejayBLHeli_32AM32
Hardware8-bit EFM88-bit EFM832-bit ARM32-bit ARM
Sourceopen (GPLv3)openclosedopen (GPLv3)
Bidirectional DShotnoyesyesyes
DShot rates300 / 600300 / 600300 / 600300 / 600
PWM frequencyfixed24 / 48 / 96 kHzvariablevariable
Motor KV settingnonoyesyes
Sinusoidal startupnonoyes
ConfiguratorESC ConfiguratorESC ConfiguratorBLHeliSuite32AM32 Configurator or ESC Configurator
DShot 150 and 1200 are not on that list

Bluejay and AM32 both implement DShot 300 and 600. Flight controller firmware offers DShot150 and DShot1200 as well, and setting one of those on an ESC that does not implement it gives you motors that do nothing.

DShot300 is the right default for a multirotor. Faster rates are shorter bit periods, which are less tolerant of long or badly routed signal wires, and buy nothing you will notice.

The one feature worth choosing for

Bidirectional DShot, and it is worth understanding why.

Ordinary DShot sends throttle commands one way. Bidirectional DShot turns the same single wire into a two-way link, so the ESC can report the RPM each motor is actually turning.

That matters because of vibration. A spinning propeller shakes the airframe at a frequency proportional to its RPM, and the flight controller's gyros feel it. If that vibration reaches the control loops it is amplified into motor commands, which makes more vibration — the feedback loop behind hot motors, drifting attitude estimates and, at worst, a crash.

The fix is a notch filter that removes that one frequency. But the frequency moves with the throttle. Without RPM data the filter has to be wide enough to cover every RPM the motor might reach, and a wide filter also removes the real control signal, which costs responsiveness.

With RPM data, the filter tracks the motors and can be narrow. That is the entire argument, and it is why bidirectional DShot is the feature that separates a current ESC from an old one.

Setting it up: ArduPilot FAQ — enabling bidirectional DShot.

Why PWM frequency is quoted at all

The ESC does not feed the motor a smooth voltage. It switches full battery voltage on and off very fast and varies the proportion of on-time — that switching rate is the PWM frequency.

Switching makes noise, electrical and acoustic. Raise the frequency and that noise moves further away from the band a flight controller's gyros are sensitive to, so the filters have less to remove and the attitude estimate is cleaner. That shows up as steadier flight, most visibly in GPS-assisted modes where a noisy estimate does the most damage.

The cost is heat: each switching event loses a little energy, so more events per second means a warmer ESC.

48 kHz is the usual compromise, which is why it is the number quoted for Bluejay boards.

Which should I choose?

Mostly the hardware has already chosen, and the honest answer for each case is short:

On an 8-bit ESC — prefer Bluejay over BLHeli_S. Same board, more features, free.

On a 32-bit ESC — prefer AM32 over BLHeli_32. Open source, actively released, and it has the settings that larger motors benefit from.

Choosing between 8-bit and 32-bit is really choosing an ESC, not a firmware:

BuildSensible choice
3 to 5 inch, up to about 6S8-bit on Bluejay. Entirely adequate, usually lighter and cheaper
7 inch and up, heavy-lift, high-KV or large motors32-bit on AM32. Higher current ratings live here, and sinusoidal startup and the motor KV setting earn their keep
Anything where you want RPM filteringeither — both give you bidirectional DShot

What you should not do is pick an ESC on firmware name alone. Current rating, the quality of the MOSFETs and capacitors, and whether it fits your frame matter more. The firmware is the part you can change later; the board is not.

Easily confused points

Firmware does not cross the 8-bit/32-bit line. No update makes a BLHeli_S ESC run AM32.

BLHeli_S and Bluejay are the same hardware. Switching between them is a flash, not a purchase.

BLHeli_32 is closed source. BLHeli and BLHeli_S are open; the 32-bit one never was.

"32-bit" does not automatically mean better. It means more processing headroom. A good 8-bit board beats a poor 32-bit one.

Bluejay and AM32 do DShot 300 and 600 only. Setting DShot150 or 1200 in your flight controller gives you silent motors.

Bidirectional DShot needs both ends. The ESC firmware has to support it and the flight controller has to be told which outputs to listen on.

AM32 needs a bootloader. Fine on a board sold with AM32; a hardware-programmer job on a blank ESC.


Written and maintained by the Robofusion engineering team.