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.
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.

