*ビルド [#vafd9dd0] プログラムをビルドしターゲットボードに書き込む時のメモ #contents **Eclipse [#rd88deb5] プログラムをコンパイルし、ビルドを行いターゲットボードに書き込むまでを一手に引き受けるIDE(統合開発環境)として[[Eclipse>http://www.eclipse.org/]]を使用します。Eclpseは単純にダウンロードしただけでは出来ることは少なく、必要なプログラムをプラグインとして組み込んでいくことで自分用の開発環境を構築していきます。初めてEclipseを使う人には敷居が高く、本来のマイコン開発の目的から離れてしまうので、[[STM32徹底入門>http://miqn.net/]]のHPの[[ダウンロード>http://miqn.net/node/10]]コーナーに、環境構築済みのEclipse同梱版があるので、それをそのまま使うのが近道です。 Eclipseを日本語化した[[Pleiades>http://mergedoc.sourceforge.jp/]]というものもあります。私はPleiadesに[[開発ツールのインストール>http://miqn.net/introduction/55.html]]に従って環境を作ったので先のHPと異なる場合があります。 他のマイコンでは環境を構築するのに費用(コンパイラ等)が掛かったり、無償版には使用制限があったりしますが、STM32(ARM Cortex-M系)はGCC等のOSSを使って完全無償でフルスペックな開発環境を構築できます。 開発環境構築には[[簡単版:DFU(新版)>http://miqn.net/node/185]]を参考にして下さい。 ここに自分でやってみて悩んだところ等をメモします。 #ref(eclipse.jpg) **project Explorer [#p5e3ba28] 初期状態ではSamplesとSTM32の二つが存在します。SamplesにはサンプルがSTM32には雛形になるプロジェクトがあります。 STM32プロジェクトがビルド出来たら、一度エクスポートして雛形として取っておくのがよいと思います。 STM32プロジェクトがビルド出来たら、一度エクスポートして雛形として取っておくのがよいと思います。プロジェクトを増やしたり、人から貰ったプロジェクトを取り込むには以下の様にします。 +左側ペインのproject Explorerで新規プロジェクト(C Target)を作成します。 +エクスポートしたSTM32プロジェクトをインポートします。 +右側ペインのMake Targetにターゲット(all,all_clean,main,flash等)を作成しておきます。 +プロジェクトプロパティを開いてC/C++ BuildのBuilder Settings → Build commandを'''../../toolchain/yagarto/bin/make '''に変更しておきます。 #ref(eclipse_build.jpg) ***bin [#db5f5ba3] ビルドして出来上がるhexファイル等が入ります。 ***inc [#xd3789ff] インクルードする自作のヘッダファイルを置きます。 ***jtag [#x5e71baf] JTAGに関するファイルの置き場です。 ***ld [#t4ba16e3] リンカに関するファイルの置き場です。 ***lib [#s462ed6f] ライブラリの置き場です。 -STM32F10x_StdPeriph_Driver&br; ST Microのファームウェアライブラリ&br; ST Micro提供のファームウェアライブラリ&br; STM32マイコン徹底入門同梱のものよりバージョンが上がったものが存在しています。置き換えてもほぼ動作しますが、'''bool'''型の定義が無くなっていますので、注意が必要です。 -UTIL&br; STM32マイコン徹底入門管理者様提供のライブラリ&br; -platform_config.h -stm32f10x_conf.h &br; -platform_config.h&br; ボード別の設定&br; -stm32f10x_conf.h&br; &br; ***src [#c5ea06c2] ソースファイルを置く場所です。 ***makefile [#s1484afc] ターゲットボードの設定をするファイルです。&br; STBeeでの基本的な設定は以下の様にします。&br; STBeeでの基本的な設定は以下の様にします(必要に応じて変更)。&br; &br; STBee = 1 DFU = 1 USART1 = 1 SD_SPI = 1 YAGARTO = 1 DEBUG = 1 STVP_ALL = 1 #STVP_ALL = 1 &br; 他の競合するライブラリと組み合わせたり、ファームウェアライブラリのアップデートを行ったりする場合は改造が必要でしょう。 例としてインクルード先の指定 INCLUDE_DIRS = -I . -I inc \ -I lib \ -I lib/CMSIS/CM3/CoreSupport -I lib/CMSIS/CM3/DeviceSupport/ST/STM32F10x \ -I lib/STM32F10x_StdPeriph_Driver/inc \ -I lib/SD/inc \ -I lib/USART/inc -I lib/COM/inc -I lib/UTIL/inc\ -I lib/Startup \ -I lib/Platform これに続いてオブジェクトの指定などが続くのでプロジェクト・フォルダの構成を変更したり、競合するライブラリ(SDカードドライバやFatFs等のバージョンアップ)を排他的に利用する場合は変更します。 慣れるまでは意味不明になるので触らないほうが無難です。 ***main.c [#hf0b9554] メイン関数を書くプログラムソースファイルですが、ここに置く必要はありません。srcに置いても問題ありません。 大きなプロジェクトになるとmainだけに収めるのは不可能になってきますので、分割コンパイルする事になります。その場合はsrcに纏めると良いでしょう。 ***stm32f10x_it.c [#m93e9b8a] 割込み時に実行されるプログラムを書くファイルです。こに置く必要はありません。srcに置いても問題ありません。 ***stm32f10x_it.h [#g996a452] 割り込みに関するヘッダファイルです。こに置く必要はありません。includeに置いても問題ありません。 **Make Target [#hd8bfb73] 実際のビルドは、このペインのターゲットを実行します。プロジェクトを新規作成した時には無いので追加作成しておきます。&br; 追加できるのは以下のターゲットです。&br; -all&br; 全てビルドします。&br; -all_clean&br; ビルド済みのファイルをクリアします。&br; -flash&br; DFU等を使ってプログラムをターゲットに書き込みます。&br; -lib&br; ライブラリのみをビルドします。&br; -lib_asm&br; ライブラリのみをアセンブラレベルまでビルドします。&br; -main&br; メインプログラムのみビルドします(リンクはしません)&br; -main_asm&br; メインプログラムのみアセンブラレベルまでビルドします(リンクはしません)&br; -main_clan&br; メインプログラムのみクリアします。&br; -restore_dfu&br; DFUをリストアします。&br; &br; 通常は(all_clean)→all→flashで書き込みが完了します。&br; **VCP [#nf4991c5] Vitural Com Portの略で書き込みに使うUSBを仮想COMポートとして使えます。デバッグ等に便利そうですが、実際のところはマイコンをリセットする度にパソコン側のターミナルを再起動する羽目にに陥るのでデバッグ用途には通常のUSARTをお勧めします。 現在のPCにはRS-232Cポートが無いうえ、マイコンのUSARTは3.3Vレベルなので、Arudino用にSparkfunから出ている[[USBシリアルコンバータ>http://www.sparkfun.com/products/8772]]を愛用しています。ターゲットにPinヘッダを立てておいてデバッグが終われば使いまわせば経済的です。 **マクロ [#g3365b77] STM32徹底入門のサンプルは同じプログラム(ソースファイル)をターゲットボードが異なっても使いまわせるように、マクロを使ってGPIOポート等を指定しています。従ってファームウェアライブラリのマクロ名がさらに上書きされている場合があります。実際のピン名を解読するには[[マクロ定義表>http://miqn.net/modules/pubdlcnt/pubdlcnt.php?file=http://miqn.net/files/macro101210.pdf&nid=10]]を入手するか、'''lib/Platform'''以下のボード別ヘッダファイルを見ることになります。又、Eclipseのツールチップにも元の定義名が出てくることもあります。 **デバッグ [#jb9671ce] ***printfデバッグ [#w7a85a11] JTAGを使わずにデバッグするにはSTM32徹底入門様提供の[[cprintf]]関数を使った、いわゆる''printfデバッグ''が基本です。printfデバッグは挿入するとその遅さからタイミングが狂って再現しなくなったりすることもあります。又、USARTの初期化前には使えません。 cprintf類似の関数はFatFsのxprintf等もあります。 ***GPIOデバッグ [#l222c92d] printfデバッグより影響の少ない方法として''GPIOデバッグ''があります。調査したい場所にGPIOのピンレベルを変換させるように短いコード([[GPIO_SetBits]]等)を仕込んで置きます。分岐Aを通過したらトグルのようなかんじです。I2CやSPIをロジアナで解析する場合等も、取り込みたいタイミングの時にGPIOを変化させ、その変化をトリガにロジアナに取り込むようにすると往々にして少ないロジアナのメモリを節約することも出来ます。 GPIOはUSARTに比べて最低限の設定で動作出来る利点もありますが、表現できる状態は1/0しかありません。 ***JTAGデバッグ [#vbc0d00b] 動作することは確認しましたが、まだ活用出来ておりません。フルサイズのチップでないとピンが出ていないことも難しくさせています。が、利用できると非常に便利です。