STM32F103C8T6マイコンボードのUSB-CDC

次のネタはタイマのインプットキュプチャを利用してロータリエンコーダをゴリゴリ回して回転数を計測するというプログラムとか、タイマの比較出力(アウトプットコンペア)の周波数を微妙に設定しなおして音階を出すプログラムなどを用意してるのですが、ロータリエンコーダとか圧電スピーカーなどのモジュールを組み立てていないので今回はペンディングというとで、USB-CDCをやってみる。

マイコンボードにはUSB端子が付いていて、PCなどに接続すると電源が供給されるが、PC側は不明なデバイスが接続されたと警告が出てしまう。ハードウェアのレベルでは接続されているが、ソフトウェアがのっていないのでエラーが出てしまうのだ。

STM32F4-DicoveryなどはUSB OTG機能があるのでUSBメモリなどを接続して利用することができるが、STM32F103C8T6はUSB OTG機能ないのでUSBメモリなどを接続しても利用ができないが、適切なプログラムを載せればPCから見てUSBクライアントデバイスとしてふるまうことができる。
USBクライアントソフトによってPCから見てSTM32F103C8T6マイコンボードをUSBマウスやキーボードUSBメモリなど見せることができるが、今回はあとあと使い道がありそうなPCとの通信ができるUSB-CDCとして実装してみる。

STM32CubeMXでの設定

今回もSTM32CubeMXでの設定から始まる、MPUの選択やクロック設定をいちから始めるのは邪魔臭いので前回作ったSTM32CubeMXのファイルをCDC_testとして別名保存する。

別名保存

別名保存

Pinoutの再設定

Pinoutの再設定である。
USBにチェックを入れ、Class For FS IPはCDCを選択する。

Pinoutの設定

Pinoutの設定

これでPinoutの設定終わり。CDCに必要なMiddle Wareがインクルードされる。

詳細設定

Configurationのタブをクリックしたのがこれだ。

コンフィグ

コンフィグ

USB_DevviceのMiddle wareがインクルードされたのが分かる。
今回は割り込みやDMAなどを利用しないのでデフォルトのままで使用する。

以上である。

プログラム生成

初期コードを生成である。これにてSTM32CubeMXの作業は終わりである。

プログラム生成

プログラム生成

コードを追加

USB_DevviceのMiddle wareのソースも生成されている。赤ペンで囲んだところだ。

生成されたファイル

生成されたファイル

STM32F103C8T6マイコンボードがCDCデバイスとして認識されテキストを送信するのが今回のゴールだ。

STM32CubeMXで生成されたプログラムは初期化まで完了している。今回も同じだ。

/* USER CODE BEGIN Includes */と/* USER CODE END Includes */に、以下を追加

/* USER CODE BEGIN Includes */
#include "usbd_cdc_if.h"

/* USER CODE END Includes */

さらに/* USER CODE BEGIN 1 */と /* USER CODE END 1 */の間に

  /* USER CODE BEGIN 1 */
    uint8_t Buf[] = "test\n";

  /* USER CODE END 1 */

そして/* USER CODE BEGIN 3 */と /* USER CODE END 3 */の間に追加

  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
    CDC_Transmit_FS(Buf, sizeof(Buf));
    HAL_Delay(1000);
  }
  /* USER CODE END 3 */

これで、終わりである。
今回はusbd_cdc_if.cは弄らないが、CDC_Transmit_FSはusbd_cdc_if.cで実装されていてCDC経由で文字列を送信する関数である。

これをコンパイルして書き込めばOKなはず。

STM32 Virtual Comport Driver

Windows環境では、ここからSTM32 Virtual Comport Driverをダウンロードしてインストールする必要がある。

トラブル発生!!

これで問題なく動くはずだが、PCはSTM32F103C8T6マイコンボードをCDCデバイスとして認識しないのだ。

試行錯誤した結果、使用していないRTCを外してSTM32CubeMXでプログラムを再生成したらCDCデバイスとして認識した。
RTCとCDCは両立できるばすだが!???
もしかしたらSTM32F103C8T6マイコンボードの回路のミスとか、実装時の半田トラブルなどがあるのかもしれない。

認識した

認識した

データシート関係

今となっては日本語マニュアル等をどこで入手したかわからないので、当方手持ちのPDFファイルをアップロード公開した。最新版があるならそちらを参考してください。

STM32F100xx 日本語リファレンスマニュアル"STM32F100xx 日本語リファレンスマニュアル"をダウンロード
STM32F103xx日本語リファレンスマニュアル"STM32F103xx日本語リファレンスマニュアル"をダウンロード
STM32F100x データシート"STM32F100x データシート"をダウンロード
STM32CubeMXのユーザスマニュアル"STM32CubeMXのユーザスマニュアル"をダウンロード
STM32F1xxx HALドライバ・ユーザマニュアル"STM32F1xxx HALドライバ・ユーザマニュアル"をダウンロード

プログラム関係