SNSへはこちら

CubeMXでUSB CDCをやってみる


テスト前ですが、しばらく更新していなかったので投稿します。近況ですが、レポートを LaTeX で書くのに「恋に落ちるエディタ」こと Sublime Text を使っていました。が、Twitter のフォロワーさんのおすすめにより VSCode を採用。日本語入力に少し癖(バグ)がありますが、1画面で編集からプレビュー、ターミナル操作が完結するのですごく快適です。拡張機能の動作もキビキビしていて素晴らしい。起動がやや遅いんですが、それを差し引きしても満足です。

さて、先に USB デバイスを作りたいなあという記事を投稿しました。なんか自力でやろうとしても、どうしてもうまくいかないんですよね。ああつらい。

ということで、今回は僕が生きた心地がしないので使わないと断言していた CubeMX を使っちゃいたいと思います。ものづくりはとりあえず形にするのが正義だからね!!(開き直り)

っちゅーわけで今回は SW4STM32 と STM32F042 の組み合わせで USB デバイスを作っていきます。今回は USB-CDC で仮想シリアルポートによる通信を行いたいと思います。Windows の方はドライバが必要らしいのでググってください。Mac や Linux では標準で出来ます。

CubeMXの設定

こちらは至って簡単。まずはペリフェラルの設定です。Pinout タブの設定画面で USB のところの Device(FS) にチェックを入れてください。

続いて上の MiddleWares から USB_DEVICE を見つけ、クラスを画像のように Communication Device Class としてください。これでペリフェラルの設定は完了です。

クロックの設定に移ります。Clock Configuration タブでシステムクロックが 48MHz となるようにしてください。こんな感じに。何故か HSI48 を選択するとうまく動きませんでした。謎。

さあこれでOKです。後はプロジェクトを吐いて、SW4STM 側の操作に成増。

ソースコードの記述

これだけで USB 動作に必要なクラスファイル、ディスクリプタが含まれていますので後はどうオペレーションをさせたいかをただ書くだけです。今回は Hello と言わせてみましょう。

まずは CDC 用関数のプロトタイプ宣言を追加します。インクルード部分に以下を追加してください。

/* USER CODE BEGIN Includes */
#include "usbd_cdc_if.h"
#include <string.h> // strlen用
/* USER CODE END Includes */

そんで適当にグローバルスコープで文字列を定義。

/* USER CODE BEGIN 0 */
char *buf = "Hello\n\r";
/* USER CODE END 0 */

今回は1秒(=1000msec)ごとに挨拶をさせるので while 付近をこんな感じにします↓

  /* USER CODE BEGIN WHILE */
  while (1)
  {
      CDC_Transmit_FS((uint8_t *)buf, strlen(buf));
      HAL_Delay(1000);
  /* USER CODE END WHILE */

ということでこれを書き込めば良いんですね。Baud Rate はデフォルトで 115200 のようです。多分。

書き込み

DFU 書き込みでもシリアル書き込みでもどうぞ。
僕が作ったデバッガ基板(STM32F042 搭載で、ソフトのコードは他人のもの)ではそのまま DFU で書き込んでそのまま実行できます。デバッガとして以上に USB デバイスとしての動作も出来るんですね。便利。

そう言えば最近、基板が小さくなりました。画像左側が最適化版です。

余りサイズが変わっていないように見えるでしょうが、L字ピンソケットを右側の従来のものから去勢して移植したためです。右側にもL字ピンソケットを付けるとだいぶ違って見えます。
また、STM32 をイキって斜めに置くことで、よくわからないんですがスペースに余裕ができました。更にレギュレータをこれまでの 3.3V/1.5A というオーバースペックなものを使わずに 3.3V/200mA(多分) とすることでただの MOSFET 並のチップサイズに。さらにこれを基板の裏側に配置することで横方向の大幅なサイズ縮小につながりました。小さいってカッコイイ

次回は気が向いたらなんちゃってキーボードデバイスを作ろうかなあと思っていますが、ネットの情報をパクるだけになりそうです。生きた心地がしない...

コメント

  1. Katsumi Enomoto より:

    sizeof(buf)だとbufポインタのサイズが4なので4文字しか送られないみたいです。
    HellHell…と送られてきて地獄か…orzとなったのは内輪話です。
    #include してstrlen(buf)がいいのかなと思いました。

    • shima-529 より:

      ご指摘ありがとうございます。確かに、buf は char * 型なので、sizeof(buf) したら結果は4になりますね。
      地獄のメッセージが出るのも当然といったところでしょうか(笑)。

      ご指摘の通り #include \ をして、strlen(buf) するのが良いとおもいます。記事もそう変更しておきました。

      • Katsumi Enomoto より:

        (しまったstring.hが埋め込みHTMLタグ扱いで除去されちゃってた)
        早速のお返事・ご反映ありがとうございました。