web-dev-qa-db-ja.com

STM32CubeMX USB CDC VCP?

多数の例を見つけましたが、STM32MXCubeから「適切に」それを行う方法については何もありません。

USB CDC仮想COMポート通信用にSTM32CubeMXからスケルトンコードを作成する方法(可能な場合はSTM32F4ディスカバリー)

8
user505160

USBデバイスとしてのCDCを使用したDiscovery F4のSTM32CubeMXプロジェクトは、そのまま使用できます。最新のSTM32CubeMXとライブラリを使用すると仮定します。

  • STM32CubeMXを起動します
  • ボードDiscovery F4を選択します
  • 周辺機器UBS_OTG_FSデバイスのみを有効にします(スタッフはそのままにしておきます)
  • ミドルウェアUSB_Device通信を有効にする.. .aka CDC

クロックタブで、クロックソースがHSE HCLKであることを確認します。 168 MHz HLCKおよび48 MHz(USB)で48 MHzを提供します。どこにも赤がないことを確認してください。

プロジェクトを保存する

コードを生成します(SW4STM32ツールチェーンを使用しました)

ビルド(内部CDTビルダーとGNU make)に切り替える必要がある場合があります。

次に、COMポートを介してデータを送信するコードを追加し、機能するようにします。

実際、トリッキーな部分は、ホストUSBが接続するまで「CDC」アクセスを試みません(CDCセットアップはまだありません)

クイックエミッションテストのためにどのようにしたかを以下に示します。

ファイルusbd_cdc_if.c

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
    uint8_t result = USBD_OK;

    /* USER CODE BEGIN 7 */
    if (hUsbDevice_0 == NULL)
        return -1;

    USBD_CDC_SetTxBuffer(hUsbDevice_0, Buf, Len);
    result = USBD_CDC_TransmitPacket(hUsbDevice_0);
    /* USER CODE END 7 */

    return result;
}

static int8_t CDC_DeInit_FS(void)
{
    /* USER CODE BEGIN 4 */
    hUsbDevice_0 = NULL;
    return (USBD_OK);
    /* USER CODE END 4 */
}

ファイルmain.c内

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

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

    /* USER CODE BEGIN 3 */
    uint8_t HiMsg[] = "hello\r\n";
    CDC_Transmit_FS(HiMsg, strlen(HiMsg));
    HAL_Delay(200);
}

Micro USB(CN5)を差し込むとすぐに、CDCデータがホスト端末に表示され始めます。

動作します。ターミナルに「hello」と表示されます(ドライバーのインストールが必要な場合があります http://www.st.com/web/en/catalog/tools/PF257938 )。

受信するためには、まず、適切な場所でUSBD_CDC_ReceivePacket()を最初に呼び出して起動する必要があります。そのためには、CDC_Init_FSにすることができます。

次に、CDC_Receive_FSに到着したデータを処理し、ここから再び受信を再設定できます。

それは私のために働く。

static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)
{
    /* USER CODE BEGIN 6 */
    USBD_CDC_ReceivePacket(hUsbDevice_0);
    return (USBD_OK);
    /* USER CODE END 6 */
}

static int8_t CDC_Init_FS(void)
{
    hUsbDevice_0 = &hUsbDeviceFS;

    /* USER CODE BEGIN 3 */
    /* Set Application Buffers */
    USBD_CDC_SetTxBuffer(hUsbDevice_0, UserTxBufferFS, 0);
    USBD_CDC_SetRxBuffer(hUsbDevice_0, UserRxBufferFS);
    USBD_CDC_ReceivePacket(hUsbDevice_0);

    return (USBD_OK);
    /* USER CODE END 3 */
}
13
Michel Sanches

STM32CubeソフトウェアでサポートされているSTM32F4ディスカバリーボードは多数ありますが、どちらを使用しているかについては説明していませんが、F401VCT MCUのディスカバリーボードでもまったく同じ問題があります。

STM仮想COMポートドライバーをインストールした後、WindowsデバイスマネージャーはSTMicroelectronics仮想COMポートを示しましたが、黄色の警告マークが付いていました。ターミナルアプリケーションでCOMポートにアクセスできませんでした( PuTTY )。

最終的に、STMCubeプログラムからのソースコード出力に問題があることがわかりました。しかし、簡単な修正があります。

  1. 新しいSTM32Cubeプロジェクトを開き、USB_OTG_FSをデバイスのみとして有効にし、MiddleWares USB_DeviceドロップダウンからCDC仮想ポートCOMを選択します。
  2. USB設定を他に変更することなくソースコードを生成します。
  3. ファイルusbd_cdc_if.cで、#define USB_HS_MAX_PACKET_SIZE from512〜256
  4. ファイルusbd_cdc.cで、#define CDC_DATA_HS_MAX_PACKET_SIZE from512〜256

これを実行した後、黄色の警告がデバイスマネージャーから消え、PuTTYを使用しているときに(usbd_cdc_if.cファイル内の)CDC_Receive_FS関数でデータを受信できました。これらの定義は、STM32Cubeがコードを生成するたびに誤った値に戻ることに注意してください。これを回避する方法はまだ見つかりません。

これがお役に立てば幸いです。

6
iChal

iChalの修正 黄色の警告マークを削除しました。

USB_HS_MAX_PACKET_SIZEはusbd_def.hにあり、CDC_DATA_HS_MAX_PACKET_SIZEはusbd_cdc.hにあります

STM32CubeMX v4.11.0 STM32Cube v1.0およびSTM32F401C-DISCOを使用しています。

今後の作業では、ヒープサイズをより大きな値に設定するだけで済みます。 FreeRTOSも有効にしているため、0x600に設定しています。 IAR EWARMを使用しているため、リンカスクリプトstm32f401xc_flash.icf

4
Richard Kadrmas