Pro používání procesorů ARM je nejlepší pracovat v operačním systému Linux, proto následující návod popisuje instalaci a využití nástrojů pro práci s ARM v tomto systému. Postup instalace Linuxu.
Veškeré zde užité programové vybavení je dostupné zdarma.
Jako volně dostupný kompilátor se může použít GNU C Compiler, dostupný v git repositáři gcc-arm-embedded.
sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded sudo apt-get update sudo apt-get install gcc-arm-none-eabi libnewlib-arm-none-eabi
Pokud si nechcete do systému přidávat nový PPA repozitář, tak můžete použít rovnou připravené deb balíčky.
V terminálu je potřeba se nacházet ve složce, kde se nachází soubory potřebné pro kompilaci a následně stačí zadat příkaz make.
Protože nastavení a obsluha některých periferií mikroprocesorů ARM je nyní už velmi komplikovaná, je žádoucí si ušetřit práci a čas při vývoji, knihovnami, které již obsahují základní operace.
Úplná proprietární knihovna od STMicroelectronics, která však nemá příliš pohodlné programovací rozhraní a zabírá hodně prostoru ve výsledném programu.
Dostupná ke stažení na stránkách STMicroelectronics.
Nová open-source knihovna, prostorově úsporná a s lepším rozhraním, která je ale zatím neúplná (avšak pod aktivním vývojem).
Po přeložení zdrojového kódu je potřeba výsledný binární program zapsat do FLASH paměti mikroprocesoru. To lze udělat několika způsoby. Podle toho, jaký konkrétní procesor ARM máme a jak je konstruovaná elektronika ve které je procesor osazený.
Booloader může být použit na rozhraních USART1, USART2, CAN2 nebo USB. Všechny typy ARM ale nepodporují všechny typy. Dále může být bootloader použit pouze v případě užití konkrétních frekvencí krystalů.
Užití bootloaderu je výhodné v případech, kdy nechceme používat žádný přídavný programovací hardware a nepotřebujeme pokročilé vývojové funkce, jako například debugger. Procesory ARM STM32F103 umí používat sériový bootloader přes UART. Procesory řady STM32F107 umožňují použití i bootloaderu na USB.
Pro aktivaci bootloaderu držte tlačítko BOOT, zmáčkněte tlačítka RESET a poté hned pusťte tlačítko BOOT. S bootloaderem se může komunikovat přes USB nebo přes UART (např. programem stm32flash). Pro nahrávání firmware přes USB je vhodný program dfu-util, který existuje pro Linux, Mac OS i Windows.
Pro použití sériového bootloaderu je třeba modul připojit na seriovou linku. V případě použití modulu USB232R01B stačí mít zapojené pouze RXD a TXD následovně:
USB232R01B | STM32F10xRxT01A |
---|---|
TXD | PA10 |
RXD | PA9 |
Ostatní signály DTR a RTS si na modulu zapojují profesionálové, kteří nechtějí mačkat tlačítka pří každém uploadu :) (Tato funkce vyžaduje upravený stm32flash, který se však asi podařilo ztratit)
svn checkout http://stm32flash.googlecode.com/svn/trunk/ stm32flash-read-only cd stm32flash-read-only make sudo make install
Příklad použití:
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.
Nahravani programu vypada napriklad takto:
$ ./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 je program, který umožní do procesorů ARM STM32F107 nahrávat firmware USB bootloaderem.
Pro aktivaci bootloaderu přes USB musíte připojit Vcc (+3,3 V) na nožičku PA9. Spuštění bootloaderu se provádí sekvencí tlačítek: stiskni RESET, stiskni BOOT, pusť RESET, pusť BOOT. Že je mikroprocesor přepnutý do DFU módu lze zkontrolovat přikazem lsusb:
$ lsusb Bus 003 Device 007: ID 0483:df11 STMicroelectronics STM Device in DFU Mode
Dále je dobré si zkontrolovat, že je sapojený jumper USB power enable, který umožňuje napájení ARMu z USB. Jumper USB D+ pull-up musí naopak být v tomto módu rozpojený, jinak nedojde ke korektní enumeraci při přepnutí do DFU módu.
Dávka pro volání dfu-util pro platformu Windows a přeložená verze dfu-util bez potřeby dalších knihoven je uložena v dokumentační složce modulu STM32F10xRxT01A v svn repositáři. Pod Windows je ještě nutné nainstalovat nějakou verzi usblib. To nejsnáze uděláte programem zadig. V průběhu instalace usblib musíte mít procesor v DFU módu (viz sekvence tlačítek výše).
Příklad volání dfu-util:
dfu-util -d 0483:df11 -a 0 -D ./bin/blik.bin -s 0x8000000:leave
Popis parametrů příkazu
Nahrání firmware si můžete vyzkoušet pomocí tohoto vzorového bináru, který z procesoru STM32F107 udělá USB HID myš, která opisuje kolečko: STM32F107_mouse.bin
Přímo z klonu MLAB svn repozitáře se nahrání přeloženého bináru STM32F107_mouse.bin provede takto:
$ sudo ./dfu-util -d 0483:df11 -a 0 -D ../sample/STM32F107_mouse.bin -s 0x8000000:leave -v
je však potřeba v terminálu být na správné cestě. tj. například svnMLAB/Modules/ARM/STM32F10xRxT01A/SW/USB_bootloader/linux-i386
Jtag lze použít téměř s libovolným ARM mikroprocesorem.
K programování přes JTAG je potřeba externí programátor. Na modulu STM32F10xRxT01A jsou JTAG signály vyvedeny na zvláštním konektoru (J51). Jako externí programátor může být využit například modul JTAGFT2232V02A.
Modul JTAGFT2232V02A lze ovládat například programem OpenOCD, který podporuje většinu používaných JTAG programátorů a umí vytvořit back-end pro GDB, takže podporuje i debugování.
Jde o základní relaltime operační systém s HAL zjednodušující práci s mikroprocesorem. Pro snazší práci byla vytvorena kofigurace Chibios přímo pro modul s ARM dostupná je na githubu
Další programová dokumentace je dostupná ChibiOS/RT
#include <ch.h> #include <hal.h> int main(void) { halInit(); chSysInit(); while (TRUE) { palTogglePad(GPIOB, GPIOB_LED1); chThdSleepMilliseconds(250); } }