Vývoj software s CodeBlocks pro procesor STM32
31. 3. 2010 18:30
Dlouho jsem řešil problém, jak úspěšně programovat a ladit na procesoru STM32F107 s jádrem Cortex-M3. Nakonec začala fungovat varianta s prostředím Code::Blocks + OpenOCD + Amontek Jtagkey. Vše je názorně ukázáno v demonstračním projketu, který si můžete stáhnout na konci stránky.
Instalace toolchain
Tato fáze zabrala spoustu promarněného času. Nejprve jsem zkoušel
přesvědčit program crossdev.
Nejprve jsem zkoušel target arm-elf, který se vytvořil, ale
všechny podpůrné knihovny byly zkompilovány s podporou VFP, to ale
Cortex-M3 nemá. Další varianta byla s arm-softfloat-elf, která
sice zkompilovala korektně všechny knihovny pouze se software floating
pointem, ale zase nezkompilovala podporu pro instrukční sadu Thumb2, která je
potřeba pro jádro Cortex-M3.
Následovala tedy další fáze, a to stažení toolchain z CodeSourcery, který obsahoval vše potřebné.
Nastavení Code::Blocks
Nejprve je potřeba nastavit správné programy pro kompilaci a sestavení
(toolchain). Řeším to tak, že si nejprve nadefinuji novou proměnnou
prostředí (environment variable) toolchain_path se správnou
cestou, kam jsem nainstaloval CodeSourcery.
Nastaveni Toolchain
Nastavení cesty
Následně je potřeba nastavit správně linker, aby používal knihovny Thumb2 a ne jiné.
-L$(toolchain_path)/lib/gcc/arm-none-eabi/4.4.1/thumb2 -L$(toolchain_path)/arm-none-eabi/lib/thumb2 -nostartfiles
Dále bylo potřeba nastavit správné přepínače pro gcc
-mlittle-endian
-msoft-float
-mno-thumb-interwork
-mcpu=cortex-m3
-mthumb
a bylo již téměř vše připraveno pro první projekt.
Nakonec je ještě potřeba použít vlastní linker skript.
/* include the common STMxxx sub-script */ INCLUDE "STM32F10x_COMMON.ld" /* include the memory spaces definitions sub-script */ INCLUDE "STM32F107_256K_64K_DEF.ld" /* include the sections management sub-script for FLASH mode */ INCLUDE "sections_FLASH.ld"
Ladění programu
K ladění je potřeba program OpenOCD, který se musí nastavit pro příslušné ladítko a procesor, který máte. Protože používám procesor STM32 a JTAG adaptér Amontek jtagkey-tiny, je konfigurace jednoduchá
source [find interface/jtagkey-tiny.cfg] source [find target/stm32.cfg]
Tuto konfiguraci stačí uvést v souboru
~/.openocd/openocd.cfg a již se s ní nemusíte dále zabývat.
Po spuštění programu openocd bez parametrů si tuto konfiguraci
sám načte a automaticky se k procesoru připojí.
Pro ladění je použit program gdb. Inicializační skript lze také zadat do Code::Blocks, takže se pak vše provádí automaticky při stisku tlačítka ladění.
# pripojeni ke vzdalenemu gdb serveru target remote localhost:3333 # reset procesoru monitor reset halt # nacteni kodu load # reset procesoru monitor reset # zastaveni procesoru monitor reset halt # break na funkci main b main # spisteni kodu, zastavi se na main continue
Pro jistotu přikládám demo projekt pro Code::Blocks, který má většinu z těchto nastavení v sobě.
Závěr
Po dlouhém snažení mohu nakonec vytvářet software pouze s použitím opensource nástrojů (neomezená velikost binárky a pod.). OpenOCD funguje jen s některými JTAG adaptery, takže Ulink2, který mě leží na stole s ním bohužel nefunguje. Všechny adaptéry s čipem FT2232D budou bez problémů.
Při správném nastavení Code::Block lze nakonec jednoduše programy ladit, což byl hlavní důvod celého snažení.
Testovací projekt je možné stáhnout z odkazu níže. Obsahuje blikání
LED a provozoval jsem ho na desce MCBSTM32C. Je třeba správně nadefinovat
pouze toolchain a proměnnou toolchain_path, zbytek je již
v projektovém souboru.
Přiložené soubory:
Dík za pěkný návod. Jen tak dál
ZKusil jsem si to zprovoznit, ale mám STM32vldiscovery kit, který používá k ladění STLink a SWD. Jde to nějak importovat, nebo upravit některý stávající konfigurační file?
Děkuji za pomoc, Rad;)
Ahoj Jan, Vaše pokyny Zdá se, že přesně to, co jsem chtěl. Bohužel nemohu česky, to mi pomohlo Google. Můžete mi přeložit do angličtiny návod? To by bylo opravdu skvělé!
Děkuji vám,
Dieter
STLink je možné provozovat například v prostředí TrueStudio. Je možné z C::B nasměrovat toolchain_path na GCC, které je přibalené v TrueStudiu a využít i jejich ladítko místo OpenOCD. Je s tím trochu hraní a musí se samozřejmě změnit i skript pro GDB. Když jsem to naposledy zkoušel, tak to ale nebylo příliš dobré řešení.
Honza

