2020年12月6日日曜日

STM32で廉価4chオシロを作ろう (6) USB virtual COM port

STM32で4chオシロを作ろう!

今回は、STM32のUSBを使ってvirtual COM portを動かしてみます.

つかう開発ツールは、STM32CubeIDE+STM32CubeMX です.CPUはSTM32F205.

最初に、CubeMXでUSBとCOMを組み込みます.

ConnectivityにあるUSB_OTG_FSをクリック.

Device_Onlyにします.

PA12とPA11がUSB portになります.

次に、MiddlewareにあるUSB_DEVICEをクリック.
(Virtual Port Com)にします.

以上で、virtual COM port classがsource codeとして組み込まれます.
他にいじれる設定はたくさんありますけど、とりあえず放置でいいかな.

CubeMXでcode生成させます.

-----
virtual COM port classをsource codeでどう使うかを以下で書きます.

usbd_cdc_if.hに便利そうな関数があります.引数がバッファと長さだけです.これを使えば良さそうです.
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);

ただ、、、USBがBusyかReadyかはどうしたら判るのでしょうか?
USB statusを調査するような関数は見当たりません.

どうやら、CDC_Transmit_FS()の返り値が、OKまたはBUSYのどちらかなのでそれを使ってよしなにやってね、という設計のようです.

なので、一例としてmain()のwhile loopをこんな風にすれば永久に”A”がUSBからPCへ送信されます.BUSYだったら待ちましょう.BUSYを無視して送信を強硬しまくると文字化けします.
  while (1)  {
  if(CDC_Transmit_FS("A",1)==USBD_BUSY) {
  HAL_Delay(100);
  }
  }

なお、CDC_Transmit_FS()がブロッキングするタイプの関数なのかどうかは不明です.

USB→PCへの送信のやり方はひとまず以上です.

------
PC→USBの方向、すなわちSTM32がUSB COMを受信するにはどうしたら良いのでしょうか?

実は試していません.受信はとりあえず興味がないので.

ですが、CDC_Receive_FS() という似た雰囲気の関数が近所にあります.

この CDC_Receive_FS() は、受信したい時にcallする関数ではないですね.
この関数はcallback関数なので、STM32のUSBが受信したら、STM32がcallしてくれる関数です.その際、バッファと長さを引っ提げてCDC_Receive_FS()がcallされるので、この中にuser programをカキコすればいいと、そうゆうカラクリになってますね.


以上でぇす.勇者諸君の参考になれば幸いでぇす.

かしこ

0 件のコメント:

コメントを投稿