はじめに
PCとボードとをRS232CではなくUSBで通信しようと思い、今回何とかやってみました。
世界的な半導体不足とのことで、それが原因かわかりませんが、STマイクロエレクトロニクスの評価ボードを買おうとしたところ、ほとんど在庫なしというこれまで経験したことのない状況でした。
これまで評価ボードは必要なときにRSやDigikeyで何の苦も無く買えていたので、今回は在庫がある評価ボードを探すのに一苦労しましたが、何とかST MicroelectronicsのNUCLEO-L496ZGを購入することができたので、これを使用します。
動作環境
- NUCLEO-L496ZG(STマイクロエレクトロニクス)
- STM32CubeIDE Version 1.12.0
- Windows10

NUCLEO-L496ZG評価ボード
STM32CubeIDEを起動
STM32CubeIDEを起動して、File - New - STM32 Projectをクリック。

Board Selectorをクリック。
Command Part Numberの欄でNUCLEO-L496ZGを選択しNextをクリック。

Project NameをNUCLEO-L496ZG_test01として(もちろん何でもいいです)Finishをクリック。

Yesをクリック。

下のようなウィンドウが表示されます。

Clock Configurationを開くとUSBのクロック周波数は48MHzに設定されています。

Middleware - USB_DEVICEを選択し、Class For FS IPにCommunication Device Mode(Virtual Port Com)を設定します。

PA11, PA12がボード上のUSBコネクタ(CN14)に接続されていますので、ここが使われることになります。

Ctrl-Sを押すとコードを生成するか聞かれるのでYesをクリック。

Yesをクリック。

するとコードが自動生成されます。
USB_DEVICE/App/usbd_cdc_if.hを開いて以下のように追加します。
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------*/
char cmd = 0; <- 追加
/* USER CODE END PV */
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
/* USER CODE BEGIN 6 */
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
CDC_Transmit_FS( &Buf[0], *Len); <- 追加
cmd = Buf[0]; <- 追加
return (USBD_OK);
/* USER CODE END 6 */
}
続いてUSB_DEVICE/App/usbd_cdc.hを開いて以下のように追加します。
/* USER CODE BEGIN INCLUDE */
extern char cmd; <- 追加
/* USER CODE END INCLUDE */
そしてmain.cを開いて以下のように追加します。
while (1)
{
/* USER CODE END WHILE */
if (cmd == '1'){
printf("Start\n\r");
sprintf(cdcBuffer, "Count value = %d\n\r", count++);
CDC_Transmit_FS((uint8_t*)cdcBuffer, strlen(cdcBuffer));
HAL_Delay(1000);
}
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
PCからキー入力された文字がターミナルにエコーバックされます。文字が1のとき、表示回数がターミナルに表示され、1以外の文字が入力されると表示回数の表示が停止します。
buildをしてST-LINK経由で書き込みます。その後Tera Termで接続し、キーを入力してみます。

とりあえず、基本的な動作を確認することができました。どこかの場面で使えそうな気がします。