STM32F401で遊んでみる(5)

9.printf()やgetc()を使ってみる

mbedを挿入した際のログをdmesgコマンドでみてみました。

よくみると、USBストレージだけではなく、ttyACM0というデバイスが追加されていることがわかります。

調べてみると、Serialクラスでprintf()やgetc()などが使えそうです。プログラムの方は、

としてみました。内容は、

  • シリアルコンソールを115.2kbpsで開いて、メッセージを出力します。
  • 読み出せるキャラクタがあるかreadable()で確認
    (これをやらないとgetc()はキーが押されるまで動作をブロックします)
  • 読み出せる場合にはgetc()で読み出し
  • 入力文字を判別してcの値を増減
    (キーの値が読めているか確認するため)
  • ボード上のUSERスイッチが押されていない場合はcの値に応じてLEDを点滅
  • ボード上のUSERスイッチが押されている場合には文字を多数出力
    (本当に115.2kbpsでているか確認したいため)

としています。

プログラムを作成したらコンソールを一つ開いて、

としてシリアルコンソールを115.2kbpsで開きます。

その後、compile(と書き込み)を行って動作を確認しました。

STM32F401で遊んでみる(4)

7.ソースコードをさらに改変してみる

そのままIDEのウインドウを閉じてしまっても、IDEの左側の「Programu Workspace」の中の「My Programs」の中にツリー状に残るようです。

こんどは別のテストをしてみるため、importしなおしてみましたが、この時にプロジェクト名も変更してみました。そうすると、「My Programs」の中にもう1つツリーができました。

次の変更はボード上のボタンを使ってみます。ポート割り当ては、「USER_BUTTON」と「PC_13」のようなので、まずは「USER_BUTTON」でやってみます。

修正後のソースは

としてみました。

これでコンパイルすると・・・ボタンを押すと点滅が高速になりました。

8.ここまでのまとめ

書くと長いですが、わかってしまえば実際の作業はあっという間です。
特に何よりもありがたいのは開発環境のインストールが必要ないことです。これでどこでも開発ができてしまいます。

一方で、実際に触ってみたmbed環境はIDEこそ本格的な開発環境の雰囲気ですがライブラリ等まで考えて見てみるとArduinoを強く意識しているように見えます。
より本格的な開発環境もWeb上で完結してしまうと楽ちんでいいですね。

STM32F401で遊んでみる(3)

5.サンプルプログラムを実行してみた

IDE上の「Compile」をクリックしてみるとバイナリが生成されるようで、binファイルの保存場所を聞いてきます。
ここでは、直接USBマスストレージに見えている場所(/media/NUCLEO)を指定してみました。これで勝手にターゲットボード側にプログラムが書き込まれるようで、書き込み中はデバッガ側のLEDが赤と緑に何度かチラチラ変わるようです。

指定すると、緑LEDの点滅は止まり、赤LEDが点灯するのみになってしまいました。

6.ソースコードを修正する

ワークスペース左側のツリーの中から main.cpp をクリックすると、ソースが表示されました。ソースコードによれば、LED1が200ms点灯、1s消灯の繰り返しになりそうな感じです・・・が、実際にはそのようには動いていません。

ボードのユーザーマニュアルにある回路図を見ると、

  • ターゲットボード上の赤LED(LD3)は電源供給で点灯
  • ターゲットボード上の緑LED(LD2)はJP6を介してArduinoコネクタの10pin幅の方の6pin(D13)へ接続

となっています。一方で、端子一覧でも

  • LED1はD13と同じPA_5に割り当て

となっているので、これでLEDは点灯してもおかしくないはずです。

そこで、LED1の定義が怪しいと睨んで探してみたのですがみつかりません。そこで試しにソースコードの3行目の

をもっともCPU自体のポート割り当て記述に近いと思われる

と書き換えてコンパイルしなおしてみたところ、無事にLチカが始まりました!

STM32F401で遊んでみる(2)

3.ファームウェアのアップデート・・・はパスする

「ST Nucleo F401RE」のページの真ん中あたりに、「ST-LINK/V2-1 Firmware」という見出しの段落があります。そこをみると、「Firmware update required」という記載になっているので、デバッガのファームウェアアップデートが必要なことがわかります。

その説明の中のリンクをクリックしてファームウェアをアップデートしてみます・・・・が、アップデートにあたってはWindows環境が必要なようです。
(ドライバをインストールして、exeファイルを実行しろ、ということみたいです)

・・・・後ほどやってみることにします。

4.サンプルプログラムを確認してみる

自分のアカウント名が右上に表示されていますので、そこをクリックすると自分のホーム画面に遷移するようです。
その画面の右側に自分が所有するボードが「(ユーザ名)’s Platforms」として表示されるので、これをクリックします。
するとボードの仕様などの一覧と、右側に「Example programs」としてサンプルプログラムが表示されます。

この中から、「nucleo_blink_led」をクリックしてみます。
ソースコードは「main.cpp」と「mbed.bld」の2つのファイルからなるようです。(クリックすれば中身が見えます)

右側に「Import this program」というボタンがありますので、これを押してみると、IDE(統合開発環境)っぽい画面のタブが追加されます。プロジェクトをImportする際の名前を聞いてきますが、デフォルトで名前が入っているのでそのまま「Import」を押してみます。

自分のワークスペースにソースコードが取り込まれたようです。

Screenshot-1

STM32F401で遊んでみる(1)

以前、『mbedボードについてわからないから教えてくれ~』という話があったのですが、その時点で『mbedは触ったことないからわからないよ~』と言わざるをえませんでした。

で、『mbedって何ぞや?』というのを調べてみたところ、

  • どうやらWebだけで開発環境が完結するものらしい
  • 秋月でも安価なmbed対応のボードがあるっぽい

ということがわかり、秋月に立ち寄った際に購入したのがNUCLEO-F401REです。秋月で扱っている安価なSM Microのmbedボードは全て1,500円なのですが、その中で一番性能が高そうなものを選んでみました。

  • Cortex-M4 84MHz
  • Flash 512KB
  • SRAM 96KB
  • D/Aコンバータがないものの周辺いろいろ

ということで、お試しする分には何も問題ないはずです。

正月休み・・・ということで、元日からトライしてみることにします。テスト環境は LinuxMint13 64bit 環境、ブラウザは Google Chrome でやってみます。

1.とにかくつないでみる

とにかくMini-USBのケーブルでホストとつないでみると、

  • デバッガ側(基板のUSBコネクタ側)のLEDが赤点灯
  • ターゲットボード側の赤LEDが点灯
  • ターゲットボード側の緑LEDが高速で点滅
  • USBマスストレージとして認識され、ドライブ内にmbed.htmというファイルが存在

という状態になりました。このmbed.htmというファイルをGoogle Chromeで開いてみると、mbedのサイトへのログインおよびサインアップのサイトが開きました。

2.サインアップしてみる

とにかくSignupを押してユーザー登録してみます。

すると、『以前にユーザー登録をしたことがあるか(Have you ever signed up on developer.mbed.org before?)』と問われます。

もちろん初めてですので、「いいえ、以前アカウントを作ったことはありません(No, I haven’t created an acount before)」を押します。

  • メールアドレス
  • ユーザー名
  • パスワード
  • 姓名

を入れて、「Signup」を押すと、今回購入したボードがデカデカと表示され、関連する情報がズラズラと表示されます。

  • ボードの写真
  • ボードのスペック
  • 基板上の端子の機能説明(Arduino互換コネクタとピンヘッダのそれぞれ)
  • サポートされているシールドの一覧
    (イーサネットやWiFi、Bluetooth、NFC、XBeeなどの近距離ネットワークに加え、GPRSもシールドで対応しているようです。日本ではGPRSは意味がありませんが・・・)

あわせて、登録したメールアドレスに確認メールが届くので、その中のずらずらと長いHTTPリンクをクリックしてログインし直すと、メールアドレスが確認できた旨(ここだけ日本語で)表示されます。

STM32 Value Line DiscoveryをLinuxで開発する(3)

こんどは、Eclipse Plug-in をテストしてみます。参考にしたのは、http://gnuarmeclipse.sourceforge.net/wiki/Main_Pageです。EclipseはすでにAndroidの開発環境の構築の際にインストール済みなので、そこにARMのPlug-inをインストールしてみることになります。

1.EclipseのPlus-inのインストール

http://gnuarmeclipse.sourceforge.net/wiki/Plug-in_installationに沿って、プラグインをインストールしていきます。

  1. 「ヘルプ」→「新規ソフトウェアのインストール」で「インストール」ウインドウが開きます。
  2. 「追加」ボタンを押し、「リポジトリの追加」ダイアログでロケーションに「http://gnuarmeclipse.sourceforge.net/updates」を入力してOKを押します。
  3. しばらくすると、名前のところに「CDT GNU Cross Development Tools」というグループが表示されるので、グループのチェックボックスはチェックなしのまま、1階層下を開き、「GNU ARM C/C++ Development Support」にチェックを入れます。チェックを入れたら「次へ」を押します。
  4. インストールする項目の確認画面が表示されるので「次へ」を押します。
  5. ライセンスの同意確認画面がでてくるので、同意して「完了」を押します。
  6. ソフトウェアのインストールが実行されますが、途中で署名なしコンテンツを受け入れるか確認する警告が表示されますので、「OK」を押します。
  7. Eclipseの再始動確認画面がでてくるので、画面に従います。

2.プロジェクトの生成とToolChainの設定

プロジェクトを生成し、http://gnuarmeclipse.sourceforge.net/wiki/Featuresを参考にツールチェーンの所在をCDTに教えます。

  1. C言語のプロジェクトとして新規のプロジェクトを生成します。
  2. プロジェクトタイプは「ARM Cross Target Application」とし、ツールチェーンは「ARM Linux GCC(Sourcery G++ Lite)」とします。 (summon-arm-toolchain は同じarm-none-eabi-gccなので)
  3. 構成の選択の拡張設定の中の「C/C++ビルド」の「環境」で「すべての構成」を選択した上で、「追加」を押して「名前」に「PATH」を追加し、「値」に「~/sat/bin」を展開した値を追加して、ツールチェーンの場所を知らせます。(展開した値でなければうまく行かないようです)
  4. 「OK」、「完了」、「はい」で、プロジェクトを生成します

3.ソースファイルの追加とビルド

  1. ソースの追加で、main.cを追加します。
  2. stlink/example/blink/main.c の内容をコピー&ペーストします
  3. 「プロジェクト」→「プロパティ」で「環境」の「C/C++ビルド」の「PATH」に「~/sat/bin」を展開した値が入っているのを確認します。
  4. 同じく、「ビルド変数」に「~/sat/bin」を展開した値が入っているのを確認します。

これでビルドすると一応コンパイルされるのですが、まず、サンプルはどのボード向けのコンパイルをするか指定するマクロ定義がないのでエラーになります。

さらに、コンパイルできても、リンク時のマップ指定(何番地からの前提でリンクするか)を指定する箇所がわかりません。素直にMakefileがある前提(自分で作る前提)のプロジェクトとしたほうが良さそうです。

・・・・とりあえず、ここまでで今日は挫折・・・orz

STM32 Value Line DiscoveryをLinuxで開発する(2)

続きです。

2.stlinkのインストール

gitでリポジトリをクローンします。

パッケージマネージャで libusb-1.0 と pkg-config がインストールされていることを確認する必要があります。自分の場合は一見libusb-1.0がインストールされているように見えたのですが、実際にmakeするとエラーになったので、

でlibusb-1.0をインストールしました。

その後、コンパイルします。コンパイルは make 一発です。

STM32 Value Line Discoveryを取り付けます。・・・が、こいつのSCSIエミュレーションはだめだめらしいので、システムから無視させるために、

とすることになっていますが、エラーになってしまいます。しかも、アンマウントしても、すぐに復活してしまいます。恒久策としては

なのですが、それでもエラーになってしまいますので、一旦強制的に挿抜しました。

次に、udevルールをセットアップします。

ここでSTM32 Value Line Discoveryを取り付けると、/devの下が

というようになります。

3.弄ってみる

gdbserverを起動してみます。

とりあえず正しく認識して、gdbserverが起動しているようです。

4.何か動かしてみる

gdbserverが動いたままの状態にして、tutorialに沿って、Lチカのサンプルを動かしてみます。

まず、サンプルプログラムをコンパイルします。(赤字が入力箇所です)

次に、gdbserverに接続して、ダウンロード&実行します。

ボード上のLEDがチカチカし始めましたので成功です。

STM32 Value Line DiscoveryをLinuxで開発する(1)

STM32 Value Line Discoveryは面白そうで、安いのですが、開発環境がWindows専用だったりするので、購入したものの放置していました。

しかし、なにげに HACK A DAY を見ていたら、Linux上にSTM32の開発環境を構築する記事がでていたので、追試してみました。OSはLinuxMint11の64bit環境です。

まず、tutrialに沿って環境構築を進めます。

0. gitのインストール

リポジトリはgitで管理されています。ダウンロードするためにgitを使うので、インストールします。

1.summon-arm-toolchainをインストール

gitでリポジトリをクローンします。

インストーラスクリプトをカスタマイズします。

以下の行のみ変更します。(コマンドラインオプションでも設定できるようです。)

その他の依存関係をクリアしておきます。

ツールチェーンを構築します。

として構築します。勝手にツールチェーンをダウンロードして、コンパイルしていってくれます。

かなり負荷がかかるようで、普段は静かなCPUファンがかなりの轟音を立てていました。