STM32で4chオシロを作ろう!
今回は、STM32のUSBを使ってvirtual COM portを動かしてみます.
つかう開発ツールは、STM32CubeIDE+STM32CubeMX です.CPUはSTM32F205.
最初に、CubeMXでUSBとCOMを組み込みます.
ConnectivityにあるUSB_OTG_FSをクリック.
(Virtual Port Com)にします.
他にいじれる設定はたくさんありますけど、とりあえず放置でいいかな.
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をカキコすればいいと、そうゆうカラクリになってますね.
この関数はcallback関数なので、STM32のUSBが受信したら、STM32がcallしてくれる関数です.その際、バッファと長さを引っ提げてCDC_Receive_FS()がcallされるので、この中にuser programをカキコすればいいと、そうゆうカラクリになってますね.
以上でぇす.勇者諸君の参考になれば幸いでぇす.
かしこ
0 件のコメント:
コメントを投稿