How to flash genuine HM-10 firmware on CC2541 (make genuine HM-10 from CC41)

Thanks for that first time I used a voltage converter and it did not work connected direct to the uno and it worked. It now show HMSoft Great tutorial glad I found the topic

Hi, great tutorial. thanks.
how can I flash cc2541 with cc debugger ? it only accept hex file.

I have a reverse question: how to flash hex file (HM-10_CC2541_Experimental.hex) with CCLoader? Bytes in the beginning don't seem to match at all.

Upd: used for converting intel hex format to binary, binaries look similar now (though the latter is smaller). Haven't tried to flash it yet.

Upd2: flashed HM-10, works fine. Tried to flash HID firmware, it won't pair for some reason

Upd3: it works fine now

Hi, I make the update to HM-10 firmware using the main tutorial, now I connect using Android, that now show the name "HMSoft", but for some reason that I don't know, is very hard to make "AT" command work, before a lot of trying sometimes this work, but just respond with OK for all command i try to send. For sample, if I send "AT+NAMETest" they return "OK" but don't change de name and nothing change. If I try another commands, the same result, just return "OK".

Someone have the same problem? What can I do to fix it?

I will try re-flashing to see if this work well.

UPD: I try again re-flashing and nothing, the same situation my Android connect but I can't send or receive commands and any "AT" command work. Now I don't receive any OK.

Hexor: Normally you must bought the "CC debugger" from TI for flash CC2541 chips, but it's also possible to use an

Hello and what about CC2540 firmware files ?

Many "fake" HM-10 clones especialy those from HC especially HC-08 (they are stated that HM-10 is clone of their HC-08 ROTFL) does have CC2540 instead of CC2541, so i would be glad if someone would post firmware for that rev.

HM-10 were also sold with CC2540 IC onboard so firmware should exist. but there is none on the net as far as i was searching for it.

I upgrade my cc2141(hc05) firmware to hm-10. My board

  1. I see my board on my android phone. It name “Hmsoft”.
  2. I can connect to device with 000000 pin in android bluetooth device manager.
  3. I cant’t connect to device in any bt serial program on my phone
  4. I can’t receve any answer on AT commands. Before firmware upgrade I have answer on AT commands, and see bolutek link on AT+HELP command.

How I ca send AT commands on new firmware?

ani idea what I do wrong ?
Pins 7,8,11 soldered on CC2541
I try 5v, 3,3v with and without resistor on pin 12 always same response.


Hello, I tried flashing the firmware on my CC2541 but no success. CCLoader was stuck on "Waiting for respond from Arduino". I tried using both Arduino Mega and Arduino Nano. I was using level converter to connect module and Arduino. What am I doing wrong?

EDIT It seems I have figured it out. I have a HM10 clone which has 6 pins. I was originally powering the module through those pins (5V and ground). Now I tried powering the module directly using 3.3V (on pin 12, right below reset) and it worked perfectly.

Hi simsas18:

I also have a HM10 BLE 6pins clone which may be seen by BLE smartphone applications but does not respond to AT cmd:
Question: how do you connected the CC2541 pins to Arduino?
I tried like that: GND<->GND , Tx<->Rx, Rx<->Tx and Bluetooth module Vcc to arduino 3.3v as well as 5v and not work

What it is wrong?

I tried sending AT commands from smartphone to module but the module was sending them to arduino, not responding to them. I only got responses to AT commands if I sent them from arduino.

I connected them just like you did. I used 5v for Vcc. Also, you should use logic level converter or resistor divider to connect arduino's TX and module's RX because module's tx and rx are 3.3v level (if you use 5v arduino).

I used to get stuck with flashing firmware HMSoft to CC41-A (ZS-040) by ATMega168 Nano V3 with CH340 USB. No further respond on "Waiting for respond from Arduino ..." when running ccloader.exe in Windows 8.1

After a lot of time to debug the problem, I detect the exact reason is ccloader.ino cannot go over this statement on loop() function

if (Serial.available()==2) {.....}

because Windows serial sends two bytes too fast, the Nano can only catch one byte Serial.available()

I modified the loop() function

......... while(!Continue) // Wait for starting { digitalWrite(LED, HIGH); delay(1000); digitalWrite(LED, LOW); delay(1000); if(Serial.available()) { if( == SBEGIN) // check only 1 byte { digitalWrite(LED, HIGH); Verify =; Continue = 1; Verify = 0; // no verify } else {; // Clear RX buffer } } } ...

I flash successfully the clone HM-10 with new HMsoft firmware without neither voltage divider resistor nor any capacitors on Reset pin. :) :) :)

The clone HM-10 maybe not same LED pin so there is no blinking LED to indicate paired status, but you can query it with AT command or pairing.

I'm very new to Bluetooth BLE, I have a JDY-08 and I'm trying to use it the same way that you would use a HC-05/06.

Is it possible to use one this way? if so, does it support the standard SPP?

Any advice is appreciated.

Hi, I'm able to connect 2 MiniPro using CC2541 / HM-10 fake BLE module once firmware updated. I'm able to run AT commands, at 9600 and 57600 bps But I can't succeed running this BLE module at 115220 bps with correct data transfer : it's quite unstable :-( Even trying to add some delays for example... Did anybody tried to run the CC2541 at this rate (updated HM-10 firmware or original CC2541 firmware) ?

:) After some days of struggling I switched from pro/mini 3.3v/8MHz(w/ serial dongle cp2102) to Uno(ch340) w/ direct connection and it worked out fine! FML!! :-\

I'm on mac I needed to compile it from source with gcc -o ccloader main.c.


Hello all,

I’ve managed to successfully updated my CC41-A chip on a ZS-040 board with the guide. It is now discovered on my iphone with Bluelight as HMSoft.

However, i can only send limited AT command. When i send in AT, i’ll get a OK reply. Anything else would also just get a single OK. if i send AT+NAME? i get an OK as well.

This is my code which sends the AT command over serial

BLE CC41A Bluetooth 
This is a clone of the HM10 BLE board
In the Serial Monitor ensure that 'Both NL and CR' is selected
Select a Baud Rate of 9600
#include <SoftwareSerial.h>
SoftwareSerial bluetooth(9, 10); // RX, TX

void setup()
// Start the hardware serial port
pinMode(13, OUTPUT); // onboard LED
digitalWrite(13, LOW); // switch OFF LED

void loop()
// while there is data coming in, read it
// and send to the hardware serial port:
while (bluetooth.available() > 0) {
char inByte =;

// Read user input if available.
if (Serial.available()){
delay(10); // The DELAY!

My serial monitor is running at 9600 baud and has no line ending.

Please help.

Problem is solved. I realised that the serial code i was using was not working. I used the SoftwareSerialExample program to end the AT commands. I had to change both baud rates to 9600. But other than that, i dont have to edit much of the code.

  Software serial multple serial test

 Receives from the hardware serial, sends to software serial.
 Receives from software serial, sends to hardware serial.

 The circuit:
 * RX is digital pin 10 (connect to TX of other device)
 * TX is digital pin 11 (connect to RX of other device)

 Not all pins on the Mega and Mega 2560 support change interrupts,
 so only the following can be used for RX:
 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

 Not all pins on the Leonardo and Micro support change interrupts,
 so only the following can be used for RX:
 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

 created back in the mists of time
 modified 25 May 2012
 by Tom Igoe
 based on Mikal Hart's example

 This example code is in the public domain.

#include <SoftwareSerial.h>

SoftwareSerial bluetooth(10, 11); // RX, TX

void setup() {
  // Open serial communications and wait for port to open:
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only

  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  bluetooth.println("Hello, world?");

void loop() { // run over and over
  if (bluetooth.available()) {
  if (Serial.available()) {

Anyone has the latest Version 546 working? I downloaded the official firmware from the china website but the AT commands did not work. End up, i had to flash it back to V540. If anyone is keen to try, i’ve uploaded the official firmware and the release note for reference. Please take not that it DID NOT work for me.

readme.txt (10.9 KB)

HMSoft-10-2541-V546 (1).zip (533 KB)

There is an app for iOS that makes using the HM-10 easy to use. It is for a single pin output. There is also a link the sketch for it. I used it with Arduino Nano, HM-10, a Relay, junction box, and an outlet to turn my room light off at night without getting out of my bed. The app is FatBeard HM10 here

Hi guys, i managed to flash HM10 onto my AT09 [Same chip as ]

I realized, LEDs do NOT work. but there is a fix. Furthermore, the firmware messes with your pins and at 5V - Max current --> 55mA 3.3V - Max current --> 28mA

Activate mode is supposed to be 9mA but this is definetly way toooo high!

Here is a fix. AT+BEFC080 AT+AFTC088

Enter these two commands. After powering up, PIO4 will be 1. Don't ask me why, but this greatly decreases power!

After connecting, light will turn on and its 9mA [PIO8]

Also, please do ensure that your BLE is under sleep mode always! AT+PWRM0

Findings after this fix, After connecting to phone --> 8.7mA After disconnecting, immediately goes to sleep --> 0.5mA (500 nano Amps!)

And, for the guy above, I managed to flash v546 without any issues! It's running that now!

EDIT: Also run a AT+RENEW command after every flash. To revert back to factory settings!

mrchen: For those trying to flash hm10 using Arduino Nano clones - it is important to connect a 10uF capacitor between RESET and GND pins of Nano - see the photo. |500x375

For those trying to flash using Linux: 1/ compile ccloader ( /CCLoader-master/SourceCode/Linux/main.c from the zip archive): gcc main.c -o ccloader 2/ run it: ./ccloader /dev/ttyUSB0 CC2541hm10v540_from_hexor.bin 0

The flashing is quite slow, takes about 5min and pauses couple of times in the process. But it worked for me - many kudos to Hexor!!! I did not use 5v->3.3v level shifting - connected the 5v nano pins directly to DD and DC pins of CC2541.

After flashing the HM10 module announces itself as HMSoft (used to be BT05) and paired with android easily using pin 000000.

Hexor - you are the Man!

Thanks to Hexor and to you, don't work with the 5v-> 3.3V adaptor.

Now my clone will have a new life ! ;-)