スキップしてメイン コンテンツに移動

投稿

9月, 2023の投稿を表示しています

STM32F407VET6でCMD Endpointを使わずに簡易Triple VCPを構成してみる

STM32F407の場合、OTG_FSではSTM32F103よりもEndpointの数はさらに少なく、EP0を除くと、IN endpoint が3つ、OUT endpoint が3つしか使えません。つまり(CubeMXでの)CDCインターフェースの場合、1インターフェースで2 IN/1 OUTのエンドポイントを使うので、VCPは本来は1インターフェースが上限です。 しかし、前回の投稿でも少し言及したのですが、Command EP(Interrupt IN EP)を使わずVCPを構成する場合だと、Data IN EP/Data Out EPの組み合わせなので、論理的には3インターフェース(3IN/3OUT)まで構成できることになります。 そこで実際やってみたところ、Command EPを使う必要がない場合、つまり、簡易的にVCP/CDCとして機能させることで、3 vcp/cdcとして構成することができました。 今回はSTM32CubeIDEでプロジェクトを作成しました。コードは こちら です。なお 大元のコードはこちらでSTM32F103C8T6 Dual VCPです 。Thanks!! 動作確認は STM32 F4VE(通称) で行いました。115200でのテキスト送受信とzmodemでのファイル送受信および3ch同時受信は確認できましたが送信は同時に1ch半?という感じでした。9600でのファイル転送はzmodemではできませんでしたがkermitでの転送はできました。921600ではテキスト送受信とzmodemのファイル送受信はできましたが、2ch同時受信はできませんでした。CubeProgrammerは115200/Even/8/1でBluePillに接続できました。その他細かいところはチェックしていませんので簡易VCPの一例として参考程度にしてもらえればと思います。 なお使用にあたり当方は一切責任を負いませんのであしからずご了承ください。 F401/411/407のCortex-M4コアで安価にマルチチャンネル簡易VCPを構成する一方法かもしれません。ホストとUSB FS経由で3ch同時に小さなデータを送受信する事などはできそうです。参考までにこちらに STM32のUSBに関するApplication Note があり、(Gxxxを除く)どのMCUがど

STM32F103RCT6でクアッド USB Serial Converterは可能かどうか試してみる

STM32F103は利用できるUSBエンドポイントがep0を含めて8個までなので、CDCインターフェースを複数使用する場合、CMD epとData epの2epのセットが3個半になり、CDCインターフェースは3個が本来上限です。しかし、どこで読んだのかおぼえていないんですが、CMD epを使わない場合、Data epだけでもプログラム次第では(簡易的に)CDCとして機能できるとのことでした。 ちなみにcubemxのusb cdcのコードでは、何もしないとcommand endpointを使いませんので、usbd_cdc.cのUSBD_CDC_Init()でcommand endpointを初期化時にopenしなくても簡易vcp/cdcとしては機能します。(stm32f103rct6, stm32f407vet6, stm32g474reでcdcを複数簡易実装して確認済。なお、stm32でvcpを扱う記事では、command endpointの使用方法にまで言及していないものが多いです。) そこでbluepill-serial-monster をベースにソースを編集し、vscodeでデバッグしたところ、ターゲットボード上では確かに8ep目(4つ目のcmd ep, ep_num 7)までは初期化しているようでしたが、9ep目(4つ目の data ep, ep_num 8)は初期化に失敗していることが確認できました。ハードウェアーとしては仕様通りです。 次に8ep目(ep_num 7)にdata epが来るようにしその他一部調整したところ、あっさりと、4 port 同時に115200で文字送受信・zmodemでファイル送受信できたので、本稿を挙げてみることにしてみました。 注意:rs232接続ではなく、tx/rxのみ使用する場合、bluepill-serial-monsterと同じく、9600等の低速だとテキストサイズが大きめ(約1.1k byte以上)の場合、残念ながら暴走します。また、同じく、9600等の低速だと、zmodemによるファイル転送はサイズの大小にかかわらず暴走してしまいます。なおkermitの場合は9600でもファイル転送できました。また、115200の場合はzmodemによるファイル転送は同時に4つ送受信できますが、テキストサイズが極端に大き

WSL+VSCODEにてSTM32関連コードの入力補完・定義表示を行う

WSL+VSCODEでSTM32のコーディングはできるようになったのですが、入力補完・定義表示が出来ないともったいないというか、せっかくVSCODEを使っているのに意味がありません。そこで、C/C++の入力補完の仕方は他で見つかったので参考にして設定してみたところ、STM32関連コードの入力補完・定義表示ができたので簡単ですが、備忘録として挙げてみることにしました。 まずWSLでソースコードディレクトリに移動し、code . でVSCODEを起動します。つぎにctrl+shift+pでコマンドパレットを開きます。続いて、"edit configurations" と入力します。C/C++エクステンションをインストールしていると、中に"C/C++: Edit Configurations (JSON)"があるはずなのでそれをクリック・選択し、jsonファイルを編集します。今回はSTM32F103RCT6のボードが対象でCubeF1ソースが~/stm32/STM32CubeF1にあるのですが、以下のようにしました。 { "configurations": [ { "name": "Linux", "includePath": [ "${workspaceFolder}/**", "~/stm32/STM32CubeF1/Drivers/STM32F1xx_HAL_Driver/Inc/**", "~/stm32/STM32CubeF1/Drivers/CMSIS/Device/ST/STM32F1xx/Include/**", ], "defines": [ "STM32F103xE", ], "compilerPath": "