ARM(STM32)

STM32 F4 Discovery - ARM

概要

STM32 F4 DiscoveryはSTMicroelectronics社が発売するSTM32 F4シリーズの評価ボードである。
STM32F4DISCOVERY
ここまで至れり尽くせりなボードがなんと1,650円(秋月)というから驚き:

ボードの仕様

  • STM32F407VGT6搭載(1MB Flash,192KB RAM)
  • ST-LINK/V2をサポート
  • MEMS 3軸加速度センサ(LIS302DL)搭載
  • 全方向マイクロフォン搭載
  • オーディオドライバ(CS43L22)搭載

試してみる

初期状態では、LEDブリンクと加速度センサーを利用したデモが内蔵されている。
USERボタン(PA00)を押すことによって、これら2つのモードを切り替えられる。
加速度センサーを利用したデモは、USERボタンを押した時点からの加速度変化を取得し、方向と大きさを4方向に配置されたLED(PD12〜15)の明滅によって表すものである。

また、STのサイトのSTM32F4DISCOVERYこのページからDesign Supportをクリックして一番下に出てくるSTM32F4DISCOVERY board firmware packageをダウンロードして、手持ちのIDE(Atollic TrueSTUDIOやKeilなど)でプロジェクトを読み込ませてビルドすることで、この他の機能についてのデモをひと通り試すことができる。
そのページに書いてある通り、22種類のサンプルが用意されていて、各種機能についての実装方法をサンプルソースから学ぶこともできる。
初期状態でボードに書きこまれていたプログラムは、RCCというプロジェクトの中に入っている。

開発環境の構築

古い情報

はじめに

参考:
https://sites.google.com/site/stm32datasheet/home/yagart-install-procedures

上の参考サイトでは、STM32F10x向けにyagartoを使用した開発環境を構築している。この環境はマイコン徹底入門のサイトで公開されているソースを使用して最小限の構成になるよう削っているため、STM32F4xx向けに拡張がしやすいのでは?と思い、テンプレートプロジェクトとデバッグ環境の整備を行うことにした。

必要なもの(基本的にはバージョンは不問…のはず…)

  • Eclipse (Heliosがいいかも)
  • CDT (EclipseでC/C++を開発できるようにするため)
  • STM32 F4 DSP and Standard Peripheral Library (これなしで開発するのは大変)
  • STM32F4DISCOVERY board firmware package (標準搭載している周辺回路を使うときに便利)
  • yagarto,yagarto-tools (ビルドに必要)
  • Atollic TrueSTUDIO for STMicroelectronics STM32 Lite (デバッグツールをパクるため 僕は2.2を使った)

作業手順

古い情報

  1. 上のサイトの「projectの作成」の手前まで作業を進める
  2. 上のサイトに記述されている要領でプロジェクトを作成していく
    1. bin,lib,libf4の3つのフォルダをプロジェクト内に作成する
    2. STM32F4xxのStdPeriphLibのLibraryフォルダの中身をlibにインポートする(ドキュメントは不要)
    3. libf4にSTM32F4DISCOVERY board firmware packageのUtilities/STM32F4-Discoveryフォルダの中にあるファイルをインポート(libPDMFilter_IAR.aやドキュメントは不要)
    4. 適当なサンプルプロジェクトのTrueSTUDIOフォルダからstm32_flash.ldをコピーしてlibf4フォルダに入れる
    5. プロジェクトのルートフォルダにmain.c,stm32f4xx_it.h,stm32f4xx_it.cをインポート(適当なサンプルプロジェクトから移植してきてよい)
  1. makefileを以下のように記述 (TOOLDIRは各自のフォルダ構造に合わせること)
    SHELL = cmd.exe
    TARGET_ARCH   = -mcpu=cortex-m4 -mthumb -mfloat-abi=softfp -mfpu=fpv4-sp-d16
    INCLUDE_DIRS  = -I lib/STM32F4xx_StdPeriph_Driver/inc \
    				-I lib/CMSIS/ST/STM32F4xx/Include \
    				-I lib/CMSIS/Include \
    				-I libf4
    STARTUP_DIR = lib/CMSIS/ST/STM32F4xx/Source/Templates/gcc_ride7/
    BOARD_OPTS = -DHSE_VALUE=((uint32_t)8000000) -DSTM32F4XX \
                 -DSTM32F4DISCOVERY
    FIRMWARE_OPTS = -DUSE_STDPERIPH_DRIVER
    COMPILE_OPTS  = -fsigned-char -Wall -fmessage-length=0 $(INCLUDE_DIRS) $(BOARD_OPTS) $(FIRMWARE_OPTS)
    
    TOOLDIR = ../../yagarto/bin/
    CC      = $(TOOLDIR)arm-none-eabi-gcc
    AS      = $(CC)
    LD      = $(CC)
    AR      = $(TOOLDIR)arm-none-eabi-ar
    OBJCOPY = $(TOOLDIR)arm-none-eabi-objcopy
    CFLAGS  = -std=gnu99 $(COMPILE_OPTS)
    ASFLAGS = -x assembler-with-cpp -c $(TARGET_ARCH) $(COMPILE_OPTS) 
    LDFLAGS = -Wl,--gc-sections,-Map=bin\main.map,-cref -T libf4/stm32_flash.ld $(INCLUDE_DIRS) -L ./lib
    
    all: lib/lib.a bin\main.hex
    
    # main.o is compiled by suffix rule automatucally
    bin\main.hex: main.o stm32f4xx_it.o lib/lib.a
    	$(LD) $(LDFLAGS) $(TARGET_ARCH) $^ -o bin\main.elf 
    	$(OBJCOPY) -O ihex bin\main.elf bin\main.hex
    
    # many of xxx.o are compiled by suffix rule automatically
    LIB_OBJS = $(sort \
     $(patsubst %.c,%.o,$(wildcard lib/*.c)) \
     $(patsubst %.c,%.o,$(wildcard libf4/*.c)) \
     $(patsubst %.c,%.o,$(wildcard lib/STM32F4xx_StdPeriph_Driver/src/*.c)) \
     $(patsubst %.c,%.o,$(wildcard lib/CMSIS/CM3/ST/STM32F4xx/Source/Templates/*.c)) \
     $(patsubst %.s,%.o,$(wildcard $(STARTUP_DIR)startup_stm32f4xx.s)))
    
    lib/lib.a: $(LIB_OBJS)
    	$(AR) cr lib/lib.a $(LIB_OBJS)
    
    $(LIB_OBJS): \
     $(wildcard lib/STM32F4xx_StdPeriph_Driver/inc/*.h) \
     $(wildcard lib/STM32F4xx_StdPeriph_Driver/src/*.c) \
     $(wildcard lib/CMSIS/ST/STM32F4xx/Include/*.h) \
     $(wildcard lib/CMSIS/ST/STM32F4xx/Source/Templates/*.c) \
     $(wildcard $(STARTUP_DIR)startup_stm32f4xx.s) \
     $(wildcard libf4/*.h) \
     $(wildcard libf4/*.c) \
     makefile
    
    all_clean:
    	del /f /q *.o *.s bin\* lib\*.a lib\*.o libf4\*.o
    	del /f /q lib\STM32F4xx_StdPeriph_Driver\src\*.o
    	del /f /q lib\CMSIS\ST\STM32F4xx\Source\Templates\gcc_ride7\*.o

    古い情報

    1. 最終的なフォルダ/ファイル構成はこんな感じ
      stm32f4_template_folder.png
    2. ビルドしてhexがbinフォルダにできることを確認する
    1. デバッガを設定する
      1. Atollic TrueSTUDIOをインストール、インストール先のフォルダの中にあるServers/ST-LINK_gdbserverフォルダ(私の場合はC:\Program Files (x86)\Atollic\TrueSTUDIO for STMicroelectronics STM32 Lite 2.2.0\Servers\ST-LINK_gdbserver)をまるごとコピーして適当なフォルダに入れる。
      2. Eclipseに戻り、実行→デバッグの構成から、GDB Hardware Debuggingを選択、このサイトSTM32F4 Discovery を Eclipse で開発を参考に、「ST-LINK gdb Server を起動できるようにする。」と「デバッグコンフィギュレーションの作製」を行う。
      3. STM32F4DiscoveryをUSBで接続し、ドライバをインストールした後、ST-LINK gdb_serverを実行、デバッグを開始すると、まずフラッシュが行われ、その後mainにブレークポイントが挿入された状態でデバッグパースペクティブが開かれる。

    とまぁ、ざっとこんな感じ…
    少し設定が怪しい部分もあるのでまた別記事で紹介予定。

開発上の注意

  • StdPeriphLibのマニュアルがchmで用意されている (stm32f4xx_dsp_stdperiph_lib_um.chm)
    データシートに書いてあるレジスタの設定を隠蔽してくれているので読みやすいコードが書ける
    そのあたりはこのマニュアルに含まれるサンプルソースを閲覧するか、実際のサンプルプロジェクトのソースを読むかすると良い。
  • USART1がなぜかきちんと動かない(この環境でも、TrueSTUDIOでも)
  • STM32F4xxではデフォルトで外部クロックの周波数を25MHzとしているが、STM32F4Discoveryに載っている水晶は8MHzのものである(実際にクロックを出力しているのはこの水晶ではなくST-LINK機能を担当するSTM32F103のようだが…)。PLLの設定やmakefile中のHSE_VALUEの設定に注意。

作ってみたもの

コメントはこちら

  • デバッガをAtollic TrueSTUDIOのST-LINK_gdbserverを流用する手段を書かれていますが、使ったAtollic TrueSTUDIOのver.はいくつでしょうか。当方Lite v3.2.0から流用しようとしましたが、gdbserverを立ち上げてST-Link/V2との接続まではOKですが、gdbを立ち上げるとgdbserverが落ちてしまいます。Windows7(64bit)/WindowsXP(32bit)の両方で確認しました。TrueSTUDIO本体からはデバッグできているので、HWの接続には問題ないと思います。 -- @psudomat? 2012-10-15 (月) 11:41:12
  • psudomatさん、こんにちは。Atollic TrueSTUDIOはver2.2.0を使用しました。こちらでも新しいバージョンのgdbserverを使って状況を確認してみます。解決策等わかりましたらご報告させていただきます。 -- Tokoro? 2012-10-18 (木) 17:39:15


添付ファイル: filestm32f4_template_folder.png 927件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-09-10 (火) 04:40:30 (1665d)