開発環境
ブランクが開きすぎたので色々できなくなっている...足場固めのためにSTM32の環境の再構築からやり直し。(以前研究室のWikiで書いた記事が消えてしまっているし...)
ソフトウェア準備
- Eclipse CDT インストール: Eclipse CDT
- EclipseにてZylin CDTプラグインインストール
- ARMコンパイラインストール: Code sourcery
- JTAGデバッガドライバソフト⇒ST-LINKの場合、Atollic True StudioのLite版付属のGDBサーバを使うしかない?
STM32マイコン用ファイル追加
STM32マイコンでは、周辺回路の操作を行うライブラリや、スタートアップファイル(最初に実行されるプログラム。C/C++プログラムの動作前に必要なスタックの設定・変数の初期化などを行う。)、プロジェクトのテンプレートなどが含まれている。
以下のファイルをEclipse上のプロジェクトにコピーしておく。
- STM32F10x_StdPeriph_Lib_V*.*.*
- Libraries
- Projects
- main.c
- stm32f10x_conf.h
- stm32f10x_it.h
- stm32f10x_it.c
- system_stm32f10x.c
Libraries以下には「system_stm32f10x.c/h」があるが、テンプレートのものと重複するため除外しておく。このファイルはクロックの設定を行うSystemInit関数を定義しているが、使用するクリスタルや動作させたいクロックの周波数によってユーザが変更しなくてはならないため、変更しやすいところの方が良い。
スタートアップファイルは複数あるが、アセンブラに対応しているもの(Code SourceryならTrueStudioかgcc_ride7ならOK)の中から、ターゲットマイコンのタイプ(cl,hd,ld,mdなど)を選んで使用する。拡張子が「.S」だとアセンブラが処理するので、使用するものだけ拡張子を変更すると良い。
リンカスクリプトは自分で作成してプロジェクトに追加しておく。
プロジェクト基本設定
(1) ツールチェイン設定
C/C++コンパイラ、アセンブラ、リンカを使用するタイプであれば良い。ここでは「MinGW GCC」を使用する。PCにMinGWやCygwinが入っていなくても問題はない。Cross-GCCが一番素直な選択肢だが、なぜかアセンブラが選択できないので使用しない。
(2) ビルダ設定
Code Sourceryでは、makeではなくcs-makeが使われるため、設定を書き換える。
(3) ディスカバリオプション設定
gcc の代わりに arm-none-eabi-gcc を設定。パスが通っていないと使えないので注意する。
- インクルードパス設定
- CMSIS/CM3/CoreSupport
- CMSIS/CM3/DeviceSupport/ST/STM32F10x
- STM32F10x_StdPeriph_Driver/inc
- その他適宜設定
- シンボル
- USE_STDPERIPH_DRIVER: Standard Peripheral Libraryの関数が使うのに必要(無いとifdefで定義されなくなるように作られているため)
- STM32F10X_MD: ターゲットの種類に応じて変更する。STM32-P103基板の場合、Medium densityのSTM32F103RBT6が乗っているのでこのシンボルを設定。
- その他フラグ
(5) リンカ設定
GCCのXlinkerオプション経由でリンカに渡されるオプションを定義。
以上の設定をすれば、ひとまずプログラムがコンパイルできるようになるはず。
この設定をSubversionなどで保存しておき、使い回せるようにすると便利。
もう11月...PSoC5 FirstTouch購入
本格的にDCモータの勉強をするためにいろいろ購入。
PSoC5という、PSoCにARMコア(Cortex-M3)を搭載したマイコンを使って、モータ制御に挑戦開始。
PSoC5は世に出てから2年ほどたつが、個人でのチップ単体の入手はまだ出来ないらしい。まずはPSoC5 First Touch Kitを購入し、使い方を学ぶことからはじめる。
PSoC5での開発は、PSoC Creatorというソフトウェア上で行う。バージョンがまだ1.0βなのがちょっと...開発はXilinxでいうEDKのようなスタイルだった。以前のPSoC Creatorと比べると抽象化されているらしく、具体的な配線を裏側で勝手に考えてくれるようになったとか。
開発の考え方は簡単で、ハードウェアを組み立てて、ピンを物理的なピンにマッピングし、ソフトウェアでハードウェアを操作するコードを書くだけ。アナログだけでなく、デジタルも組めるのだから面白い(Verilogが使えるらしい)。
GPIOが無いことに戸惑ってしまった。GPIOは、コントロールレジスタというコンポーネントを配置し、レジスタの出力をI/Oピンへ接続すれば作れる。CPUからレジスタの値を操作すれば、I/Oに反映されるという仕組み。
ピン配置は、PSoC5 FirstTouch Starter Kit Guideのピン配置を参考に設定した。P2[0..3]がLED[1..4]に対応し、P4[0..3]がLED[5..8]に対応しているので、図のようにマッピングした。
コードは以下のように、LedReg(GPIOに相当)にカウンタレジスタの値をひたすら書き続けるだけの単純なもの。これだけで、8つのLEDが8ビットカウンタとして点滅する。
#includevoid main()
{
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
Counter_Enable();
Counter_Init();
Counter_Start();
/* CYGlobalIntEnable; */ /* Uncomment this line to enable global interrupts. */
for(;;)
{
/* Place your application code here. */
LedReg_Write( Counter_ReadCounter());
}
}
シートが異なるとダメ
名前定義で数式を定義する際、選択中のセルが基準となるのだが、ちょっと困ったことに。相対は相対だが、シートが固定されてしまうらしい。
「同じ名前で各シートの範囲を参照する」
あまりここに力を注いでもしょうがないので、とりあえず本題に戻ることに...
名前定義での数式定義では、選択中のセルに対する相対で記述できる
Excelでは名前定義という機能を使うことで、セル範囲や定数、数式を1箇所にまとめておくことができる。
数式の定義では、普通の数式と同じようにセルを直接記述できる。例えば「=A1+B1」のように、相対位置でセルを指定できる。この際、基準セルとなるのが「名前定義の際に選択していたセル」となる。
名前定義には3つの入力があるということ。
- 名前:
- 基準位置: 名前定義の際に選択していたセル
- 範囲
- 定数
- 相対または絶対位置で指定するセル範囲
- 相対または絶対位置のセルを用いて定義される数式
そのため、以下の2つのケースは別の意味を持つ。
- C1セルを選択中に、名前「ADD1」を参照範囲「=A1+B1」で定義
- 2つ左のセルと1つ左のセルを加算
- D1セルを選択中に、名前「ADD2」を参照範囲「=A1+B1」で定義
- 3つ左のセルと2つ左のセルを加算
初めは選択中のセルが意味を持つことを知らず、2時間以上も思ったとおりに動作しない状態が続いてしまった。「エクセルで特定のセルにある関数式を複数の場所で利用できる?」で回答者が以下のように「H2のセルを選択する(必須)」と書いていた所に気づき、ようやく「選択中のセルに対する相対で記述できる」事に気づいた。
あるシートで「H2セルを選択する」(必須)
挿入メニューの名前の定義で次の通り登録する
名前 H2の式
参照範囲
=IF(!H5=TEXT(NOW(),""),"",IF(COUNTIF(!H5,"*42*"),1,IF(COUNTIF(!H5,"*LA*"),2,IF(COUNTIF(!H5,"*67*"),3))))
「H5」じゃなく「!H5」なので,間違えないように作成します各シートのH2セルに
=H2の式
と記入する。
Excelで数式を名前定義して他から参照する
EagleのライブラリをExcelを使って効率的に作る方法として思いついたのが、「コマンドのパラメータリストを表として作成し、一括してコマンドに落とし込む」というもの。
この際問題となるのが、パラメータリストからコマンドを作る処理。といっても、CONCATENATE関数を使って文字列を連結していけば難なく行える。本当の問題は、数式をコピーしていくと、変更したくなったときの変更ポイントが増加してしまうのが厄介なところ。
そこで、一箇所に数式を定義しておき、この数式を全体から参照させるようにしようと考えた。こうすれば、大本の数式を1箇所変更するだけで、全体を一括して変更できるようになる。
その方法を探していたところ、「エクセルで特定のセルにある関数式を複数の場所で利用できる?」で「名前定義」を使った解決法を見つけた。(質問者は解決法にめぐり合えなかったみたいだけど)
名前定義
- Ctrl + F3でメニューを開く
- 新規作成
- 名前: 任意の名前をつける
- 参照範囲: ここに数式を入れる
例えば、以下の定義の場合、A3セルには「ABCXYZ」が入力される。
- 名前: TEST_NAME
- 参照範囲: =Concatenate( A1, A2)
- セルの入力状態
- A1: ABC
- A2: XYZ
- A3: =TEST_NAME
もし数式を入力したセルからの相対位置を使いたいなら、Address、Column、Raw関数を使う。名前定義をする際に選択していたセルを基準として、数式を記述できる。
Eagleコマンド「PIN」
「PIN」は、シンボルエディタ上でシンボルの接続点を定義するコマンド。
- PIN 'ピン名' オプション ・..
- オプション
- Direction: ピンのI/Oやパワーといった種類を指定(デフォルト:I/O)
- Function: ピンの表示を指定(デフォルト:None)
- None: 何も付けない
- Dot: インバートの○が付く
- Clk: クロックの△が付く
- DotClk: インバーテッドクロックの○△
- Orientation: ピンの方向(デフォルト:R0)
- R0: 接続点は右向き
- R90: 接続点は上向き
- R180: 接続点は左向き
- R270: 接続点は下向き
- Visible: 回路図上でのピン名、パッド名の可視性(デフォルト:Both)
- Off: ピン、パッド名は表示されない
- Pad: パッド名のみ表示(Pad: 対応付けられたパッケージのパッド名)
- Pin: ピン名のみ表示
- Both: どちらも表示
- Swap Level: スワップ可能なピンの番号
「・」は座標のことで、GUI上ではマウスクリックで与えるもの。コマンドラインで与えるときは、「(x y)」のように与える。
ピン名で「!RST」のように書くと、RSTの上に線が付けられ、アクティブローを表現できる。
スワップレベルは、標準ロジックなどで2入力ANDのように入れ替え可能なピン同士で同じ番号をつける。
同一のピン名がある場合(GNDやVccなど)、「ピン名@番号」と命名する。例えば「GND」が3本ある場合は、「GND@1」「GND@2」「GND@3」というピンを作る。こうして作られたピンは、回路図(Schematic)上では「GND」とだけ表示される。
Eagleのライブラリ
以前研究室でAltiumというツールを使っていて、その便利さに慣れてしまったためか...EAGLEがかなり不便に思えるようになってしまった。
中でも、ライブラリ作りがイライラの元。Altiumでは、Excelなどでピン名・番号を記入した表から部品を作れるSmart Grid(次世代電力網じゃない)という機能がついている。FPGAやマイコンといったピン数の多い部品のシンボルを作るのに非常に有用だった。また、フットプリント(PCBライブラリ)を作る際も同様にパッドを作れることから、マクロを使ったライブラリ作成ができた。なのにEAGLEではできない?
やっぱり手作業だと誤りが生じるし、統一性を維持しにくい。パラメータからライブラリを量産できるようなExcelシートを作ろうかと考え中。