Flashing STM32 via serial line on Linux – stm32flash

For Windows users there is a tool called “Flash Loader Demonstrator”. This obviously does not run on Linux, but there is also a possibility to natively flash a binary (or hex file) in case you cannot use the WIZnet update tools that use the bootloader. So this is basically needed when you want to upgrade the bootloader. In case you don’t have subversion installed you need to do the following in a console:
tw@kallisto:~# sudo apt-get update && sudo apt-get install subversion

After that you have to first checkout the latest sourcecode of the tool

tw@kallisto:~$ svn checkout http://stm32flash.googlecode.com/svn/trunk/ stm32flash

Then you can compile and install the tool

tw@kallisto:~$ cd stm32flash && make && sudo make install

Bildschirmfoto vom 2015-03-18 14:17:16

Now you have to bring the board into boot mode. There is usually some BootEnable pin. Hold that booten pin during power up or reset of the module. After that, the module is waiting for the following command:
tw@kallisto:~$ stm32flash –w combine.bin –v /dev/ttyS0

Bildschirmfoto-Namenloses Fenster

Generate Padding for the Bootloader

There is one important difference between the Windows version of Flashloader Demo and the stm32flash. In the current version of the stm32flash the complete flash is erased before programming. As long as you have only one binary for the application this is no issue. But in case you have a bootloader and an application the bootloader is erased when you flash the application.
As a workaround for this you have to combine the two files.
How to combine Bootloader and Application file.

As an example i’ll show how to combine the bootloader and application file of WIZ550web. As per note on http://wizwiki.net/wiki/doku.php?id=products:wiz550web:wiz550web_download the bootloader shall go to the adress 0x8000000 and the application shall go to 0x8006000. So as we will copy both files together the bootload needs some padding to be exactly 0x6000 = 24576 in size.

Bildschirmfoto vom 2015-03-18 14:30:56So first we find out the size of the bootloader. In this example it is 23312 bytes in size. So we just calculate 0x6000 – 23312 = 1264. To get the padding we just dump 1264 bytes from the device /dev/zero which contains an unlimited number of zeros into some file, e.g., zeroes.bin.

tw@kallisto:~$ dd if=/dev/zero of=zeroes.bin bs=1 count=1264

After that, we just add these zeroes.bin to the bootloader file.

tw@kallisto:~$ cat zeroes.bin >> WIZ550web_Boot.bin

If you check now with ls, you can see that the size is now exactly 0x6000 = 24576 bytes.

Bildschirmfoto vom 2015-03-18 14:48:01

Now we can combine bootloader and application file in the same way. Later when you compile only the application, you can reuse the padded bootloader file, and only need this last step.

tw@kallisto:/tmp$ cp WIZ550web_Boot.bin combine.bin && cat WIZ550web_App.bin >> combine.bin

Bildschirmfoto vom 2015-03-18 14:55:16

tw@kallisto:~$ stm32flash –w combine.bin –v /dev/ttyS0

There is one important difference between the Windows version of Flashloader Demo and the stm32flash. In the current version of the stm32flash the complete flash is erased before programming. As long as you have only one binary for the application this is no issue. But in case you have a bootloader and an application the bootloader is erased when you flash the application.
As a workaround for this you have to combine the two files.

How to combine Bootloader and Application file.

As an example i’ll show how to combine the bootloader and application file of WIZ550web. As per note on http://wizwiki.net/wiki/doku.php?id=products:wiz550web:wiz550web_download the bootloader shall go to the adress 0x8000000 and the application shall go to 0x8006000. So as we will copy both files together the bootload needs some padding to be exactly 0x6000 = 24576 in size.

Bildschirmfoto vom 2015-03-18 14:30:56So first we find out the size of the bootloader. In this example it is 23312 bytes in size. So we just calculate 0x6000 – 23312 = 1264. To get the padding we just dump 1264 bytes from the device /dev/zero which contains an unlimited number of zeros into some file, e.g., zeroes.bin.

tw@kallisto:~$ dd if=/dev/zero of=zeroes.bin bs=1 count=1264

After that, we just add these zeroes.bin to the bootloader file.

tw@kallisto:~$ cat zeroes.bin >> WIZ550web_Boot.bin

If you check now with ls, you can see that the size is now exactly 0x6000 = 24576 bytes.

Bildschirmfoto vom 2015-03-18 14:48:01

Now we can combine bootloader and application file in the same way. Later when you compile only the application, you can reuse the padded bootloader file, and only need this last step.

tw@kallisto:~$ cp WIZ550web_Boot.bin combine.bin && cat WIZ550web_App.bin >> combine.bin

Bildschirmfoto vom 2015-03-18 14:55:16

by TW

Advertisements

One thought on “Flashing STM32 via serial line on Linux – stm32flash

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s