← ポチっていただけると嬉しいです
Elec

SUM32CubeIDE:USB通信

さて、STM32マイコンいじりの続きです。

デバッグ用途でもとりあえず文字出力させたいので、USBから通信してみます。
基本的なピン設定は先日の初期設定の通りです。

今回は初期設定後に出来上がった雛形のmain.c内に記述するだけで通信してみます。

ST-Link/V2

おっと、その前にWriterの接続が必要ですね。
私が使ったのは先日紹介したST-Link/V2。

最初4ピンのケーブルも付いてるんでSTM8って書いてある端子から直接接続できるのかなぁって思ったんですが、違うようです。
STM32って書いてある20ピン端子から必要な4本をデュポンワイヤで基板上の端子に接続しました。
ここから取ってます。

GNDとかはこのピン以外にもあるのでこの接続だけが正解ではありません。
また、デュポンワイヤはこういう時に便利なのでラズパイとかで使う際に以前買っておきました。

コード記述

さて、先日の初期設定の後はこんな感じで素のmain.cが生成され表示されているかと思います。

USBに関するコード類は、ちゃんと設定ができていればProject ExplorerのUSB_DEVICEって下に出来ているはずですのでそれを使います。

main.cにまずは定義ファイルを設定

以降は一例ですが、int main(void)の前に変数定義して

mainのwhileの中にカウントアップしてUSBに送るっていうコードを書きます。

HAL_Delayってのはこのハードウェア特有のsleepのようでms単位なので1000だと1秒待つってことらしいです。

これでセーブしてビルドしてRunすればOKです。
その前にちゃんとST-Linkの接続と基板上への電源供給、USB接続をしておいてください。

動作確認

TeraTermを立ち上げてUSBシリアルデバイスってのが出たのでそっちに接続。

USBなのでパラメータはどうでもいいみたいです。

RUNすると最初はSTM32CubeIDEのコンフィグ画面が立ち上がるかもしれませんが、
そのままOKでいいでしょう。

すると 動き始めます っていいたいところなんですが、Terminalは出力されず止まったまま。
電源を入れ直すを動き始めました。

これなんでしょうね。リセットしてくれないのかなぁ。よくわからんです。
また別に書くと思いますが、SPIのアクセスだったらRUNするとそのまま動き始めるんですよね。だからCPUとしては動いているはず。ただUSB通信が上手く動かない。
結局USB通信は電源入れ直さないとだめでした。
SPIとUSB両方記述した時はSPIはすぐに動いてたんで、USBの方がずっとBUSYになるのかな。
どうしたらリセットできるんだろうか?

あと、スタートしてすぐじゃなくて1秒程度Waitいれておかないと出ないってこともありました。
これはTerminalと接続が確立する猶予ってことかなぁ。

まぁとにかくこれでUSB通信っていうか出力だけですが出来ました。

次、入力の方ですが、こっちはちょっと面倒です。
まずUSB_Device/App/usbd_cdc_if.cの中にある

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)

この関数が通信で受信したら呼ばれるようです。
キーボード入力なら1文字づつ来る感じでしょうか。

その関数内のreturnの前に

CDC_Transmit_FS( Buf, *Len );

を入れておくとローカルエコーのように押したキーがそのまま見えるようになります。
ただ、リターンがただのCRで改行はされませんでした。

この入力をどう使うか?ですが、
私はコマンドのようにしたので、リターンが入力されるまでは単なるローカルエコー&バッファに追記。

メインループの方で、バッファの最後の文字がリターンだったらその文字列を使って処理。
文字列はクリアしておく。
画面も’\n’を出力して改行しておく

ってしてみました。
もっと素直な使い方ってあるんだとは思うんですけどね。

次はSPI通信を書いてみます。

コメント

タイトルとURLをコピーしました