====== ARM STM32 processors programming ====== The best working environment for ARM processors is the Linux OS. That is why the following manual describes the installation process and how to handle the tools for work with ARM in this particular system. [[http://wiki.ubuntu.cz/Instalace/Pr%C5%AFvodce%20instalac%C3%AD?redirect=1|Linux installation manual]]. All the software that is mentioned in this guide can be obtained for free. ===== Introduction for beginners ===== A required HW includes: * ARM processor of your choice with necessary peripherals ([[en:stm32f10xrxt|STM32F10xRxT]]) * Program __loading__ * Through a serial link ([[en:usbrs23201b|USBRS23201B]]) * J-TAG ([[en:jtagft2232v02a|JTAGFT2232V02A]]) A required SW includes: * SW for writing the code * Compiler * Loading of the compiled program ===== Compiler ===== You can use a freely available GNU C compiler, obtainable from git repository [[https://launchpad.net/gcc-arm-embedded|gcc-arm-embedded]]. To help you with the Ubuntu installation it is possible to used a ready-made [[https://launchpad.net/~terry.guo/+archive/gcc-arm-embedded|deb packages]]. A PPA repository currently works only for Ubuntu version 12.04. == Quick installation using a software repository == sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded sudo apt-get update sudo apt-get install gcc-arm-none-eabi == Compilation procedure == Open a terminal and change the directory to the one containing the compilation files. Start the compilation process using the MAKE command. ===== GUI ===== ==== Sublime text ==== [[http://www.ubuntuupdates.org/ppa/sublime|Ubuntu PPA repository]] ==== Code::Blocks ==== [[http://www.codeblocks.org/|Code::Blocks]] sudo apt-get install codeblocks ===== Libraries ===== ==== STM32F10X standard peripheral library ==== The complete proprietary library from STMicroelectronics, suffering form an uncomfortable programming interface and occupying a lot of space in the final program. It is available for download at [[http://www.st.com/stonline/stappl/resourceSelector/app?page=resourceSelector&doctype=FIRMWARE&SubClassID=1169|STMicroelectronics web site]]. ==== libopencm3 ==== A new open-source library with better interface and smaller size, that in unfortunately yet incomplete (though under an ongoing development). [[http://libopencm3.org|Web pages of the project]] ===== Loading ===== ==== Bootloader ==== The use of bootloader is useful in cases when we do not intend to use any additional programming HW and we do not need advanced developmental functions like debugger. === STM32F10xRxT01A module === To activate the bootloader, hold the BOOT key, then press the RESET key and immediately release the BOOT key. It is possible to communicate with the bootloader through USB or UART (using e.g. [[http://code.google.com/p/stm32flash/|stm32flash]] program). For loading the firmware through USB you can use [[http://dfu-util.gnumonks.org/|dfu-util]], that works for Linux, Mac OS and Windows as well. == Connecting the module == In order to be able to use the bootloader, it in necessary to connect it to the serial link. In the case of using [[en:usb232r|USB232R01B]] module, it is sufficient to have only RXD and TXD connected in a following way: ^ USB232R01B ^ STM32F10xRxT01A ^ | TXD | PA10 | | RXD | PA9 | Professionals can connect other DTR and RTS signals as well, to get rid of an annoying pressing of the keys during every upload :) (This function requires a modified stm32flash). == stm32flash compilation == svn checkout http://stm32flash.googlecode.com/svn/trunk/ stm32flash-read-only cd stm32flash-read-only make sudo make install An example of use: sudo stm32flash /dev/ttyUSB0 stm32flash - http://stm32flash.googlecode.com/ Serial Config: 57600 8E1 Version : 0x20 Option 1 : 0x00 Option 2 : 0x00 Device ID : 0x0418 (Connectivity line) RAM : 64KiB (4096b reserved by bootloader) Flash : 256KiB (sector size: 2x2048) Option RAM : 15b System RAM : 18KiB Resetting device... done. An example of program loading: $ ./stm32flash -w ./bin/LED_Blink.hex -v -g 0x0 /dev/ttyUSB0 stm32flash - http://stm32flash.googlecode.com/ Using Parser : Intel HEX Serial Config: 57600 8E1 Version : 0x22 Option 1 : 0x00 Option 2 : 0x00 Device ID : 0x0414 (High-density) RAM : 64KiB (512b reserved by bootloader) Flash : 512KiB (sector size: 2x2048) Option RAM : 15b System RAM : 2KiB Wrote and verified address 0x08000c48 (100.00%) Done. Starting execution at address 0x08000000... done. === dfu-util === The binaries for this utility can be found here: [[http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=%2FModules%2FARM%2FSTM32F10xRxT%2FSW%2FUSB_bootloader%2F#_Modules_ARM_STM32F10xRxT_SW_USB_bootloader_/|dfu-util]] To activate the bootloader through USB, you have to connect + 3,3 V to the PA9 pin. In order to run the bootloader follow the sequence: press RESET, press BOOT, release RESET, release BOOT. A __batch__ to call the dfu-util on Windows platform and the compiled version of dfu-until without the need to download other libraries can be found here: [[http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&path=%2FModules%2FARM%2FSTM32F10xRxT%2FSW%2FUSB_bootloader%2FWin32%2F#_Modules_ARM_STM32F10xRxT_SW_USB_bootloader_Win32_/|dfu-util-static]]. Furthermore, to run the program on Windows, it is necessary to install some version of uslib. The easiest way to do it is to use [[http://www.mlab.cz/WebSVN/filedetails.php?repname=MLAB&path=%2FModules%2FARM%2FSTM32F10xRxT%2FSW%2FUSB_bootloader%2FWin32%2Fzadig.exe/|zadig]]. In the course of installation, the processor must be in DFU mode (see the key sequence mentioned above). You can test the firmware loading, using this sample binary, that creates the USB HID mouse out of the STM32F107 processor. [[http://www.mlab.cz/WebSVN/filedetails.php?repname=MLAB&path=%2FModules%2FARM%2FSTM32F10xRxT%2FSW%2FUSB_bootloader%2Fsample%2FSTM32F107_mouse.bin/|STM32F107_mouse.bin]] ==== J-TAG ==== An external programmer is required to program through JTAG. In the case of [[cs:stm32f10xrxt|STM32F10xRxT01A]] module, the JTAG wires have a special __pin-out__ (J51). The [[http://www.mlab.cz/PermaLink/JTAGFT2232V02A|JTAGFT2232V02A]] module can be used as an external programmer. For programing is suitable eg. [[http://openocd.sourceforge.net/|OpenOCD]], an open programm that supports the majority of JTAG programmers and is able to create the back-end for [[http://www.gnu.org/software/gdb/|GDB]], thus supporting the debugging as well. === Ubuntu === Though there already exist natively supported packages for OpenOCD in Ubuntu, their versions are usually quite old compared to the latest development. It is therefore recommended to compile the current version... sudo apt-get install libtool git gcc automake libftdi-dev texinfo git clone git://git.code.sf.net/p/openocd/code openocd-code cd openocd-code/ ./bootstrap ./configure --enable-maintainer-mode --disable-werror --enable-ft2232_libftdi make sudo make install To uninstal the OpenOCD, use the following command sudo make uninstall If you have a [[cs:jtagft2232v|JTAGFT2232V02A]] module with __uploaded FPGA scheme__ connected to you computer, you can connect to ARM sudo openocd -f "interface/busblaster.cfg" -f "target/stm32f1x.cfg" Open On-Chip Debugger 0.7.0-rc1-dev-00011-gd9ba56c (2013-04-28-11:46) Licensed under GNU GPL v2 For bug reports, read http://openocd.sourceforge.net/doc/doxygen/bugs.html Info : only one transport option; autoselect 'jtag' adapter speed: 1000 kHz adapter_nsrst_delay: 100 jtag_ntrst_delay: 100 cortex_m3 reset_config sysresetreq Info : max TCK change to: 30000 kHz Info : clock speed 1000 kHz Info : JTAG tap: stm32f1x.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3) Info : JTAG tap: stm32f1x.bs tap/device found: 0x16410041 (mfg: 0x020, part: 0x6410, ver: 0x1) Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints Tho OpenOCD has created a server, that you can connect with through telnet telnet localhost 4444 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Open On-Chip Debugger > === Mac OS X === ./configure --enable-ft2232_ftd2xx openocd -f busblaster.cfg -f /usr/local/share/openocd/scripts/target/stm32f1x.cfg\\ \\ busblaster.cfg:\\ interface ft2232 ft2232_device_desc "Dual RS232-HS" ft2232_layout jtagkey ft2232_vid_pid 0x0403 0x6010 basic info: http://pramode.net/fosstronics/stm32-circle.txt ===== RTOS ===== ==== Chibios ==== [[http://www.chibios.org/dokuwiki/doku.php|Webpage of the project]] Chibios is a basic realtime OS with HAL component that simplifies the work with a microprocessor. To facilitate the work, a Chibios configuration directly for module with ARM has been created, and it is available at [[https://github.com/toxygen/mlab-chibios|github]]. In order to obtain more documentation use [[http://chibios.sourceforge.net/html/index.html|ChibiOS/RT]] site. === LED blink demo === #include #include int main(void) { halInit(); chSysInit(); while (TRUE) { palTogglePad(GPIOB, GPIOB_LED1); chThdSleepMilliseconds(250); } }