Building an ARM toolchain
To compile code for the STM32F4DISCOVERY you’ll need an ARM toolchain that supports the Cortex-M3. I used the build script summon-arm-toolchain
to build one. Before running the script you need to install several dependencies:
$ su -c "apt-get install flex bison libgmp3-dev libmpfr-dev libncurses5-dev libmpc-dev autoconf texinfo build-essential libftdi-dev"
You might also need to run:
$ su -c "apt-get build-dep gcc-4.5"
Now make a directory to hold the files you’ll need to work with the STM32F4DISCOVERY:
$ mkdir ~/stm32f4discovery_root
$ cd ~/stm32f4discovery_root
Next clone the summon-arm-toolchain
, read the README, and begin the build:
$ git clone https://github.com/esden/summon-arm-toolchain.git
$ cd summon-arm-toolchain
$ ./summon-arm-toolchain
Setting up the software to communicate with the STLINK
While the toolchain is compiling you can set up the software required to communicate with the STLINK, which is the on-board JTAG programmer/debugger on the lefthand side of the board. From a new shell run:
$ su -c "apt-get install libusb-1.0-0-dev"
$ cd ~/stm32f4discovery_root
$ git clone git://github.com/texane/stlink.git stlink_texane
$ cd ~/stm32f4discovery_root/stlink_texane
$ make
Now you should install the udev rules 49-stm32l-discovery.rules
and restart udev. These steps will create a symbolic link called /dev/stm32l_stlinkN and give a normal user permission to access it.
$ su
# cp 49-stm32l-discovery.rules /etc/udev/rules.d/
# /etc/init.d/udev restart
# exit
Example projects and makefiles
Next, download the STM32F4DISCOVERY firmware package and an archive of makefiles for building some of the example projects found in the firmware package.
$ cd ~/stm32f4discovery_root
$ wget http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm32f4discovery_fw.zip
$ unzip stm32f4discovery_fw.zip
$ wget https://jethomson.github.io/stm32f4discovery_files/STM32F4DISCOVERY_Makefiles.zip
$ unzip STM32F4DISCOVERY_Makefiles.zip
$ cd ~/stm32f4discovery_root/STM32F4DISCOVERY_Makefiles
$ cp Makefile.IO_Toggle ~/stm32f4discovery_root/STM32F4-Discovery_FW_V1.1.0/Project/Peripheral_Examples/IO_Toggle/
$ cd ~/stm32f4discovery_root/STM32F4-Discovery_FW_V1.1.0/Project/Peripheral_Examples/IO_Toggle
If the toolchain installation still hasn’t finished, then familiarize yourself with the example code and makefiles or take a break.
Compiling and Flashing
Once summon-arm-toolchain
has finished building your ARM toolchain you can try it out on the IO_Toggle example by using the following commands.
$ cd ~/stm32f4discovery_root/STM32F4-Discovery_FW_V1.1.0/Project/Peripheral_Examples/IO_Toggle
$ make -f Makefile.IO_Toggle
If the build finished without error, then you’re ready to try downloading it to the board. Plug in the board and use stlink to write the blinking LED example, IO_Toggle.bin, to the STM32F4DISCOVERY’s flash memory.
$ PATH=~/stm32f4discovery_root/stlink_texane/flash:$PATH
$ flash write IO_Toggle.bin 0x8000000
Power cycle the board by removing then reinserting the USB plug. If the download was successful, the LEDs should light up in a clockwise pattern and pressing the pushbutton will not result in the board entering test mode.
You can easily modify one of the sample makefiles to work with another example by examining the .uvproj file (found in the example’s MDK-ARM directory) to determine which defines (-D), includes (-I), source files, etc. to add to the new makefile. Just open the .uvproj file in a text editor and look for lines like these:
<Define>USE_STDPERIPH_DRIVER,STM32F4XX</Define>
<IncludePath>
..\;
..\..\..\..\Libraries\CMSIS\Include;
..\..\..\..\Libraries\CMSIS\ST\STM32F4xx\Include;
..\..\..\..\Libraries\STM32F4xx_StdPeriph_Driver\inc;
..\..\..\..\Utilities\STM32F4-Discovery
</IncludePath>
<FilePath>..\main.c</FilePath>
<FilePath>..\..\..\..\Utilities\STM32F4-Discovery\stm32f4_discovery.c</FilePath>
<FilePath>..\..\..\..\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rcc.c</FilePath>
etc.
Final Notes
There is a lot I don’t understand about compiling for the STM32F4DISCOVERY and I’m certain that the Makefiles I’ve provided could be improved. For example, I don’t know which -m
options (see the Makefile’s MCUFLAGS
variable) to set, when to set them, and why. If you have any corrections or improvements to share, please leave a comment.
Links
The STM32F4 high-performance discovery board (STM32F4DISCOVERY) and a range of of STMicroelectronics products are available at Newark
Alternate method of programming the STM32F4DISCOVERY using the Bus Blaster and OpenOCD
A fork of the summon-arm-toolchain that builds gcc for the Cortex-M4F
A comment discussing this fork
Regarding your Makefile:
You don’t need “-mthumb-interwork”, since Cortex-M3/4 are thumb-only processors. You also don’t need “-mlittle-endian”, since this is the default for ARM targets.
Thanks! I can’t even recall where I took those flags from. I wasn’t sure about them from the start so that’s why they are commented out.
I just want to say thank you for the text.
Thank you so much… very clear and everything worked. The only minor deviations from your instructions were:
1. The build ended up in ~/stm32f4discovery_root/summon-arm-toolchain/ for some reason.
2. The latest version of the stlink_texane has two rule files 49-stlinkv1.rules (for older devices) and 49-stlinkv2.rules (for newer devices including the STM32F4-Discovery). The latter rules file creates a device of format /dev/stlinkv2_%n. )
Thanks for your helpful post. I just compiled the Demonstration Project using Codesourcery Lite, flashed using st-flash and now have a working tool-chain.
If you are compiling newer compiler, like gcc 4.7, then you will need small patch for libcmsis v1.10-3:
Without this, compiler is going to generate output like strexb r0, r0, [r1], which is illegal, because r0 is used both as input and output register (and assembler will actually detect it and fail), and strexb says you cannot use same register as both input and output (it is one of few instructions in ARM which have this exception). Patch makes sure compiler will not generate such assembler code.
Yes but where is that file libcmsis in ubuntu 1204?
Yes but where is libcmsis in ubuntu 1204?
Why I can’t find “flash” ?
$ flash write IO_Toggle.bin 0x8000000
No command ‘flash’ found,
I see now why. It should be “st-flash”
~/stm32f4discovery_root/stlink_texane/flash$ ls
main.c main.o Makefile st-flash
It was called ‘flash’ when I wrote this. This article is out of date. It looks like the process to build stlink-texane is now: ./autogen.sh; ./configure; make
[…] https://jethomson.wordpress.com/2011/11/17/getting-started-with-the-stm32f4discovery-in-linux […]
summon-arm-toolchain doesn’t compile. there is the following 2 errors in Makefiles.am
> src/jtag/drivers/Makefile.am:8: `pkglibdir’ is not a legitimate directory for `DATA’
> src/target/Makefile.am:166: `pkglibdir’ is not a legitimate directory for `DATA’
> Makefile.am: installing `./INSTALL’
Looking the files in gedit I see at the incriminate line:
> nobase_dist_pkglib_DATA =
There is nothing after the ‘=’
————-
system Ubuntu 12.04
gcc version 4.6.3
Jacques
It seems the problem is caused by the incompatibility of new version automake. Two ways are available to help it.
1. rolled back to old version of automake, like 1.11.1
2. using another branch with the fixed : https://github.com/agschult/summon-arm-toolchain/tree/
The information comes from: https://github.com/esden/summon-arm-toolchain/issues/22
when i run :
make -f Makefile.IO_Toggle
i get this error :
/sat/bin/arm-none-eabi-gcc: not found
Here is something you may try to get further:
Go to https://launchpad.net/gcc-arm-embedded en download the Linux install tarball. Difficult to find? Then check https://launchpad.net/gcc-arm-embedded/+download where you can get the files more directly. Choose the linux installation tarball.
Once downloaded extract it. I presume you still have Ubuntu 12.04 but I don’t know how far you’ve update your system. Anyway the extracted contents is quite similar as the current content in your user home folder called ‘sat’. Check it to verify we’re on the same level.
Now replace the ‘sat’ folder contents with the contents inside the folder you got after having extracted ‘gcc-arm-none-eabi-4_7-2013q3’ . Now that’s the name for the current release of the work of these folks, it’s September 2013 now so shortly what comes after ‘gcc-arm-none-eabi-‘ might be slightly different for you.
The “/sat/bin/arm-none-eabi-gcc: not found” should now be overcome when you try the ‘make -f Makefile.IO_Toggle’ command.
We’re not done yet.
Another issue will pop up when getting into flashing the STM32F4 Discovery board. What also has changed sinced the original date of this blog (17 November 2011) is the contents of the stlink_texane folder so the following commands must be changed too:
$ PATH=~/stm32f4discovery_root/stlink_texane/flash:$PATH
$ flash write IO_Toggle.bin 0x8000000
And executed these commands in ‘~/stm32f4discovery_root$ ‘
But that didn’t help much since IO_Toggle.bin is not listed in ‘~/stm32f4discovery_root$ ‘ and the ‘flash’ command doesn’t exist (anymore).
So I copied the produced files in ‘~/Project/Peripheral_Examples’ (IO_Toggle.bin, IO_Toggle.hex and IO_Toggle.elf) into ‘~/stm32f4discovery_root$ ‘ and changed the ‘flash’ command with ‘st-flash’ since that was closest of existing executable files listed in stlink_texane.
Thus I changed the above with:
$ PATH=~/stm32f4discovery_root/stlink_texane/:$PATH
$ st-flash write IO_Toggle.bin 0x8000000
And executed these commands again in ‘~/stm32f4discovery_root$ ‘ .
The board successfully took the code and the IO_Toggle program executed. It keeps rolling the original demo (turning on leds 1,1+2,1+2+3,1+2+3+4 clockwise and then all off and again) but without simultaneous all 4 blinking and no more accellerometering (blue user button has no more effect).
The next level is to get the toolchain working inside em::Blocks or Eclipse but that’s another story I still have to get myself through.
Good luck.
Nowhere arm-none-eabi-gcc is mentioned however my system returns the error that /home/benoit/sat/bin/arm-none-eabi-gcc is not found…
Hi everyone!
I have noticed that the link to http://jthomson.towhee.org/stm32f4discovery_files/STM32F4DISCOVERY_Makefiles.zip is brocken. So is the first one but I was able to download the files thanks to a bit of googling.
can anyone email me the link or file that is meant to be leading tohttp://jthomson.towhee.org/stm32f4discovery_files/STM32F4DISCOVERY_Makefiles.zip.
Thanks!
Nicholas B
The link is working now.
[…] on https://jethomson.wordpress.com/2011/11/17/getting-started-with-the-stm32f4discovery-in-linux/, adapted for my […]