2017年6月25日日曜日

りはびり:03


さて、話しは前後して、作ったプログラムを動かすマイコンボードの話。
パソコンプログラムと違って、組み込みプログラムはビルドしただけでは動かせない。
組み込みマイコンも市販品は数多くあるので何を使うかは迷うところだけれど、今回はストロベリー・リナックスさんのSTBee F4miniを使うことにする。

特にこれと言って理由はないけれど、あえて言えば、

・小さいこと
・手元にあること
・あまりネットに情報がないこと

、が選定理由でしょうか。
STBee Miniとはまた別の製品なので注意が必要です。

STBee F4miniの製品ページはこちら(https://strawberry-linux.com/catalog/items?code=32405)を参照。

使用マイコン:STM32F405RGT
メインクロック:12MHz
プッシュスイッチ:ポートA-0
ユーザLED:ポートD-2

ひとまず直近のプログラムでは、この情報がわかっていればいいです。



プログラムのライターソフトは、マイコンメーカのSTマイクロのDfuSeというソフトを使います。
リンクはこちら(http://www.st.com/ja/development-tools/stsw-stm32080.html)


DfuSeを使ったプログラムの書き込み手順は、ストロベリー・リナックスのこちらのページ(http://strawberry-linux.com/stbee/dfuse)が詳しい。
※紹介ページのマイコンボードはSTBeeです。STBee F4miniとは違いますので注意です。


さて、DfuSeで書き込めるファイル形式は、*.dfuです。
前回gccで生成したmain.elfはそのままでは書き込めませんので、変換作業が必要です。

dfu形式のファイルを作るには、DFU File Managerを使いますが、このソフトで扱えるのはS19形式、HEX形式、BIN形式です。今回は、以下のコマンドでHEX形式のファイルを生成します。

> arm-none-eabi-objcopy -O ihex main.elf main.hex

他の作業はストロベリー・リナックスのサイトのやり方と同じです。

※GUI操作なので、超面倒です。

コマンドライン操作の方法は次回。

2017年6月21日水曜日

りはびり:02

前回の続き。
main.cをコンパイルしたらエラーになる話。

> arm-none-eabi-gcc.exe main.c -o main

arm-none-eabi/lib\libc.a(lib_a-exit.o): In function `exit':
exit.c:(.text.exit+0x2c): undefined reference to `_exit'
collect2.exe: error: ld returned 1 exit status

この_exitは参照した覚えがない。

C言語の勉強をすると、ほぼ必ず、「C言語はmain関数から始まります」と教えられる。
基本的にはそれで正しいのだと思うけれど、組み込みC言語の目線では正しくない。
組み込みの世界ではmain関数を呼び出すためのスタートアップルーチンという裏方さんに、どんな仕事をしてほしいか、きっちり教えて上げる必要がある。

教育の機会に恵まれない裏方さんは、とりあえず万人向けの仕事をしようとする。その仕事の一つが_exitという処理なのだ(難しい話なので抽象化して書いてます)。

ひとまず、裏方さんには大人しくしていて貰いたいので、「-nostartfiles」というオプションをつけてコンパイルしてみます。このオプションについてはgccの公式ページを見てください。

>arm-none-eabi-gcc main.c -o main.o -nostartfiles

arm-none-eabi/bin/ld.exe: warning: cannot find entry symbol _start; defaulting to 00008000

今度はwarningが発生しています。_startのエントリがないので、デフォルトの00008000にするよ、というメッセージです。
何を言っているのか、分かりませんね。

うまく説明できないので強引に対策だけいうと、リンカスクリプトをオプションで指定します。
「-T ./STM32F405RGT6.ld」です。

STM32F405RGT6.ld ファイルは、ねむいさんが公開されているサンプルコードから流用させてもらいました。STマイクロのサンプルコード集にも別マイコン用のリンカスクリプトがあるので、それをもとに自分で作れる人は頑張ってください。
ちなみに、「STM32F405RGT6.ld」は内部で「STM32F40_41xxx_FLASH.ld」を呼び出しているので、同じフォルダにおいておきます。

>arm-none-eabi-gcc main.c -o main.o -nostartfiles -T ./STM32F405RGT6.ld

ひとまずエラーはでなくなった。

最後に、main.oをgccが出力する実行形式のelf形式に変換します。

>arm-none-eabi-gcc -nostartfiles -T ./STM32F405RGT6.ld main.o -o main.elf 

今日はここまで。
エラーが出なくなったからって、動くものが出来たわけではないのが、組み込みの怖いところ。(笑)

2017年6月15日木曜日

りはびり:01


しばらく組み込みから離れていたので、リハビリがてらARMマイコンで動くプログラムをコマンドラインでコンパイル・ビルドする方法を勉強しなおす。

基本的な開発環境は「ねむいさんのぶろぐ(http://nemuisan.blog.bai.ne.jp/?eid=188089)」を参考に構築しています。

コーディングに使うエディタは秀丸エディタを使用します。
coreutilsとかlaunchpadとかへのパスはwindowsの環境変数にセットしています。



まずは、とてもシンプルなプログラムを作ってみます。

main.c
int main(void)
{
    return 10;
}

これをコンパイルしてみます。

> arm-none-eabi-gcc.exe hello.c -o hello

arm-none-eabi/lib\libc.a(lib_a-exit.o): In function `exit':
exit.c:(.text.exit+0x2c): undefined reference to `_exit'
collect2.exe: error: ld returned 1 exit status

なにやらエラーになりました。
未定義の_exitを参照していると言われています。そんなの参照している覚えはないのですけどね。

続きは次回。

2016年7月22日金曜日

基板到着

FusionPCBから基板が到着した。

箱がちょっと潰れていたけれど、こんなのまったく気にしない。


基板は、10枚が輪ゴムでとめられていたので、一番上と下の基板には輪ゴムの跡がくっきりと残っていた。(写真の手前の基板中央に輪ゴムの跡が見える)
エタノールで拭けばすぐに取れるだろうけど、素直に中の基板を使うことにする。


とりあえず基板が届いたのはいいけれど、プログラムの進捗がよくない。

壁センサのLEDはパルス駆動を前提の回路構成になっていて、直流電圧が印加されると焼ききれるので、プログラムが暴走したとしても大丈夫なようなフェールセーフの仕組みを構築しないといけない。

他にもやることたくさん

  1. モータマウントの作り直し(子基板のサイズが設計より0.5mm大きいので中心を合わせるため)
  2. 磁石マウントの作り直し(φ4の磁石だと、モータと磁力干渉が大きいので小さくしたほうがいいとアドバイスもらったので)
  3. wilcoでM2の短いネジを注文
  4. RTで迷路購入

とはいえ、部品が全部そろった状態で生基板を前にすると、早く実装したくなる。

2016年7月8日金曜日

ST-Linkの種類

現在、ねむいさんの環境でSTM32F4のデバッグを行なっている。

STM32F4-discoveryを使ってGDB+inghtは正常に動くのだけれど、STM32F4-nucleo のST-LINK回路+STbeeF4miniだと上手くいかない。

target setting の画面を表示しようとするとフリーズしてしまう。


似たような環境だけれど、細かい部分は全然違うので、どこから手をつけたらいいか。


まず、OpenOCDとはJTAGではなく、SWDで接続しているつもり。

STM32F4-discoveryはST-Link/V2の回路になっていて、ねむいさんのサンプルcfgファイルで接続できる。
STM32F4-nucleoもST-Link/V2の回路になって・・・・、あれ、紹介ページにはST-Link/V2-1になっている。-1ってなんだ?


ねむいさんのこのブログでは、ST-Link/V2とST-Link/V2-1は明確に使い分けされている。
なるほど。
ST-Link/V2-1用のcfgファイルも用意されているので、なんとか解決の糸口を見つけた。

STM32F4-discovery用のcfgファイルを編集するのは嫌なので、STbeeF4mini用にコピー&編集してST-Link/V2-1を使ったOpenOCDアクセス環境を作って接続!・・・・失敗。


ねむいさんのブログでは、 ST-Link/V2-1を使うときはVCPドライバ必須とある。
すでに私の環境ではWindows7からはSTM32F4-nucleoとVCPで繋がっているように見える。
けれど、手元のダウンロード保管庫には ST-Link/V2用のVCPドライバは保管してあるけれど、ST-Link/V2-1用のVCPドライバは保管されていない。

わずかな望みを掛けてST-Link/V2-1用のVCPドライバをインストールしてみた。

結果、 target setting の画面が表示されて、設定をすることもできた。
ターゲットと接続することが出来て、ステップ実行も出来た。
これで万事解決!

と思ったけれど、もう一度つなごうとしたら、やはりtarget setting の画面でフリーズする。
惜しいところまで行っていると思うのだけれど。


 ST-Link/V2-1用のVCPドライバはこちら

2016年7月6日水曜日

FusionPCB 微修正

画面を記録するのを忘れてしまったが、FusionPCBのOrder Historyを確認したら、ステータスの所にRe-uploadという見慣れないボタンが表示されていた。

WEBのコメント欄には何も書かれていないので、メールの確認をしたらデータの修正が必要と書かれていた。

分かりやすく画像が添付されていた。



具体的には、マウスのメイン基板に、エンコーダ用の子基板を2枚つけてデータを送ったが、そういうことをするときは、小さいほうの基板の1辺の1/3以上の面積が親基板と接していないといけないというルールを守れていなかったようだ。

一応ルールは知っていたし、守ったつもりだったのだが、データを確認すると1/10mm足りなかったようだ。
 せっかくなので、1/3といわず、2/3の長さで接するように修正してデータをアップロードした。


早く届かないかなぁ。

2016年7月3日日曜日

2016年版ハーフマウス基板設計完了

何度もやり直しをしたけれど、2016年版のマイクロマウス(ハーフサイズ)の回路設計とパターン設計を完了した。

特に特徴も無く、ネットで公開されている先人たちが公開してくれている情報をまとめた感じ。
二番煎じだとしても、自分の手を動かしてみることが大切だと考えている。

それに、マイクロマウスの楽しみはソフトウェアにある。
ハードウェアの完成は単なるスタート地点に過ぎない。

とはいえ、一区切りついたので、ちょっと一息つこう。
来週はマイクロマウス関西地区大会があるので、見学に行きたい。

 回路図(スピーカ周りは定数決めてません)

パターン図(top面)

パターン図(bottom面)