趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
RSS icon
  • STM32F401で遊んでみる(5)

    投稿日 2015年 1月 6日 コメントはありません

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

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

    [15886.601036] usb 2-1.4.3: USB disconnect, device number 9
    [15888.075962] usb 2-1.4.3: new full-speed USB device number 10 using ehci_hcd
    [15888.225240] scsi7 : usb-storage 2-1.4.3:1.1
    [15888.225648] cdc_acm 2-1.4.3:1.2: This device cannot do calls on its own. It is not a modem.
    [15888.225670] cdc_acm 2-1.4.3:1.2: ttyACM0: USB ACM device
    [15889.223047] scsi 7:0:0:0: Direct-Access     MBED     microcontroller  1.0  PQ: 0 ANSI: 2
    [15889.224257] sd 7:0:0:0: Attached scsi generic sg2 type 0
    [15889.226709] sd 7:0:0:0: [sdb] 1072 512-byte logical blocks: (548 kB/536 KiB)
    [15889.227459] sd 7:0:0:0: [sdb] Write Protect is off
    [15889.227464] sd 7:0:0:0: [sdb] Mode Sense: 03 00 00 00
    [15889.227958] sd 7:0:0:0: [sdb] No Caching mode page found
    [15889.227963] sd 7:0:0:0: [sdb] Assuming drive cache: write through
    [15889.230723] sd 7:0:0:0: [sdb] No Caching mode page found
    [15889.230728] sd 7:0:0:0: [sdb] Assuming drive cache: write through
    [15889.235618]  sdb:
    [15889.237988] sd 7:0:0:0: [sdb] No Caching mode page found
    [15889.237993] sd 7:0:0:0: [sdb] Assuming drive cache: write through
    [15889.237996] sd 7:0:0:0: [sdb] Attached SCSI removable disk
    
    

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

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

    #include "mbed.h"
    
    Serial pc(USBTX,USBRX);
    DigitalOut myled(PA_5);
    DigitalIn button(USER_BUTTON);
    
    int main() {
        int c=200;
        char k;
        pc.baud(115200);
        pc.printf("This is TEST!!\r\n");
        while(1) {
            if(pc.readable()){
                k = pc.getc();
                if((k=='a') && c<1000) c+=50;
                if((k=='z') && c>100) c-=50;
                pc.printf("Value of c: %d\r\n",c);
            }
            if(button){
                myled = 1; // LED is ON
                wait((double)c/2.0/1000);
                myled = 0; // LED is OFF
                wait((double)c/2.0/1000);
            } else {
                pc.printf("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
            }
        }
    }
    
    

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

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

    としています。

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

    $ screen /dev/ttyACM0 115200

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

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


  • STM32F401で遊んでみる(4)

    投稿日 2015年 1月 5日 コメントはありません

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

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

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

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

    修正後のソースは

    #include "mbed.h"
    
    DigitalOut myled(PA_5);
    DigitalIn button(USER_BUTTON);
    
    int main() {
        while(1) {
            if(button){
                myled = 1; // LED is ON
                wait(0.2); // 200 ms
                myled = 0; // LED is OFF
                wait(0.2); // 200 ms
            } else {
                myled = 1; // LED is ON
                wait(0.05); // 50 ms
                myled = 0; // LED is OFF
                wait(0.05); // 50 ms
            }
        }
    }

    としてみました。

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

    8.ここまでのまとめ

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

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


  • STM32F401で遊んでみる(3)

    投稿日 2015年 1月 4日 コメントはありません

    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行目の

    DigitalOut myled(LED1);

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

    DigitalOut myled(PA_5);

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


  • STM32F401で遊んでみる(2)

    投稿日 2015年 1月 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)

    投稿日 2015年 1月 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)

    投稿日 2012年 2月 10日 コメントはありません

    こんどは、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)

    投稿日 2012年 2月 9日 コメントはありません

    続きです。

    2.stlinkのインストール

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

    ~/stm32-linux $ mkdir stlink
    ~/stm32-linux $ cd stlink/
    ~/stm32-linux/stlink $ git clone git://github.com/texane/stlink.git
    Cloning into stlink...
    remote: Counting objects: 3515, done.
    remote: Compressing objects: 100% (1228/1228), done.
    remote: Total 3515 (delta 2276), reused 3434 (delta 2204)
    Receiving objects: 100% (3515/3515), 12.63 MiB | 45 KiB/s, done.
    Resolving deltas: 100% (2276/2276), done.
    ~/stm32-linux/stlink $

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

    $ sudo apt-get install libusb-1.0

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

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

    ~/stm32-linux/stlink/stlink $ make

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

    ~$ sudo modprobe -r usb-storage && modprobe usb-storage quirks=483:3744:i

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

    ~$ sudo cp stlink_v1.modprobe.conf /etc/modprobe.d
    ~$ sudo modprobe -r usb-storage && modprobe usb-storage

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

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

    ~/stm32-linux/stlink/stlink $ sudo cp 49-stlinkv*.rules /etc/udev/rules.d
    ~/stm32-linux/stlink/stlink $ sudo udevadm control --reload rules

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

    ~/stm32-linux/stlink/stlink $ ls -la /dev/stlink*
    lrwxrwxrwx 1 root root 15 2012-02-08 02:40 /dev/stlinkv1_2 -> bus/usb/001/005

    というようになります。

    3.弄ってみる

    gdbserverを起動してみます。

    ~/stm32-linux/stlink/stlink $ ./gdbserver/st-util -1 /dev/stlinkv1_2
    non-option ARGV-elements: /dev/stlinkv1_2
    2012-02-08T02:44:28 INFO src/stlink-sg.c: Current mode unusable, trying to get back to a useful state...
    2012-02-08T02:44:28 WARN src/stlink-sg.c: received tag 0 but expected 3
    2012-02-08T02:44:28 INFO src/stlink-common.c: Loading device parameters....
    2012-02-08T02:44:28 INFO src/stlink-common.c: Device connected is: F1 Medium-density Value Line device, id 0x10016420
    2012-02-08T02:44:28 INFO src/stlink-common.c: SRAM size: 0x2000 bytes (8 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 1024 bytes
    2012-02-08T02:44:28 INFO src/stlink-sg.c: Successfully opened a stlink v1 debugger
    Chip ID is 00000420, Core ID is 1ba01477.
    KARL - should read back as 0x03, not 60 02 00 00
    init watchpoints
    Listening at *:4242...

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

    4.何か動かしてみる

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

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

    ~/stm32-linux/stlink/stlink/example/blink $ PATH=~/sat/bin:$PATH
    ~/stm32-linux/stlink/stlink/example/blink $ make
    arm-none-eabi-gcc -g -O2 -mlittle-endian -mthumb -ffreestanding -nostdlib -nostdinc -Wl,-Ttext,0x20000000 -Wl,-e,0x20000000 -mcpu=cortex-m3 -DCONFIG_STM32VL_DISCOVERY=1 main.c -o blink_32VL.elf
    arm-none-eabi-gcc -g -O2 -mlittle-endian -mthumb -ffreestanding -nostdlib -nostdinc -Wl,-Ttext,0x20000000 -Wl,-e,0x20000000 -mcpu=cortex-m3 -DCONFIG_STM32L_DISCOVERY main.c -o blink_32L.elf
    arm-none-eabi-gcc -g -O2 -mlittle-endian -mthumb -ffreestanding -nostdlib -nostdinc -Wl,-Ttext,0x20000000 -Wl,-e,0x20000000 -mcpu=cortex-m4 -DCONFIG_STM32F4_DISCOVERY=1 main.c -o blink_F4.elf
    main.c:83:6: warning: conflicting types for 'main'
    main.c:53:2: note: previous implicit declaration of 'main' was here

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

    ~/stm32-linux/stlink/stlink/example/blink $ ~/sat/bin/arm-none-eabi-gdb
    GNU gdb (GDB) 7.3.1
    Copyright (C) 2011 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law. Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "--host=x86_64-unknown-linux-gnu --target=arm-none-eabi".
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>.
    (gdb) target extended localhost:4242
    Remote debugging using localhost:4242
    0x08000b4c in ?? ()
    (gdb) load blink_32VL.elf
    Loading section .text, size 0x40 lma 0x20000000
    Start address 0x20000000, load size 64
    Transfer rate: 810 bytes/sec, 64 bytes/write.
    (gdb) continue
    Continuing.
    Cannot access memory at address 0x7bf35cc8

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


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

    投稿日 2012年 2月 8日 コメントはありません

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

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

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

    0. gitのインストール

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

    ~$ sudo apt-get install git
    ~$ mkdir stm32-linux
    ~$ cd stm32-linux

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

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

    ~/stm32-linux $ git clone git://github.com/esden/summon-arm-toolchain.git
    Cloning into summon-arm-toolchain...
    remote: Counting objects: 312, done.
    remote: Compressing objects: 100% (193/193), done.
    remote: Total 312 (delta 145), reused 266 (delta 115)
    Receiving objects: 100% (312/312), 61.76 KiB, done.
    Resolving deltas: 100% (145/145), done.

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

    ~/stm32-linux $ cd summon-arm-toolchain 
    ~/stm32-linux/summon-arm-toolchain $ gedit summon-arm-toolchain

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

    SUDO=sudo
    LIBSTM32_EN=1

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

    ~/stm32-linux/summon-arm-toolchain $ sudo apt-get install flex bison libgmp3-dev libmpfr-dev libncurses5-dev libmpc-dev autoconf texinfo build-essential libftdi-dev

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

    ~/stm32-linux/summon-arm-toolchain $ ./summon-arm-toolchain

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

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