stm32筆記[16]-使用usb-cdc串列埠.md

qsBye發表於2024-06-15

摘要

在stm32f103cbt6核心板使用usb cdc虛擬串列埠,迴環傳送的字串.

關鍵資訊

  • STM32CubeIDE
  • JLINK
  • stm32f103cbt6
  • 外部晶振:8MHz

原理簡介

usb-cdc簡介

[https://blog.csdn.net/weixin_52296952/article/details/135776171]
[https://www.usbzh.com/article/detail-842.html]
[https://usb.org/sites/default/files/CDC1.2_WMC1.1_012011.zip]
USB通訊裝置類CDC分類編號為0x0a,且必須指定為介面裝置類。

USB 通訊裝置類(或USB CDC類)是一個複合通用序列匯流排 裝置類。
通訊裝置類用於類似於網路卡的計算機網路裝置,提供用於將乙太網或ATM幀傳輸到某些物理介質的介面。它還用於調變解調器、ISDN、傳真機和電話應用程式以執行常規語音呼叫。
通訊裝置具有三個基本任務:

裝置管理(控制配置特定裝置並通知 USB 主機某些事件)
呼叫管理(建立和終止電話呼叫或其他連線)
資料傳輸(傳送和接收應用資料)

USB 元件中的 CDC 實現具有:

使用CDC的ACM(抽象控制模型)子類模擬虛擬 COM 埠。
使用CDC的ACM(抽象控制模型)子類使用RDNIS協議模擬網路連線。這支援Windows 主機 PC 和嵌入式裝置之間的 USB 網路連線,以及USB 裝置 RNDIS 到乙太網橋應用程式。
使用 CDC 的NCM(網路控制模型)子類模擬乙太網介面卡(僅適用於USB 裝置)。使用 CDC (NCM),您可以在基於 Linux 的主機系統上建立Ethernet-over-USB(適用於 Linux 主機)應用程式。

實現

  1. Connective->USB開啟USB Device(FS)
  2. Middleware->USB_DEVICE->開啟Communication Device Class
  3. 配置時鐘(引數如下)
    USB部分時鐘必須是48MHz
/* ########################## Oscillator Values adaptation ####################*/
/**
  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
  *        This value is used by the RCC HAL module to compute the system frequency
  *        (when HSE is used as system clock source, directly or through the PLL).
  */
#if !defined  (HSE_VALUE)
  #define HSE_VALUE    8000000U /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */

#if !defined  (HSE_STARTUP_TIMEOUT)
  #define HSE_STARTUP_TIMEOUT    100U   /*!< Time out for HSE start up, in ms */
#endif /* HSE_STARTUP_TIMEOUT */

/**
  * @brief Internal High Speed oscillator (HSI) value.
  *        This value is used by the RCC HAL module to compute the system frequency
  *        (when HSI is used as system clock source, directly or through the PLL).
  */
#if !defined  (HSI_VALUE)
  #define HSI_VALUE    8000000U /*!< Value of the Internal oscillator in Hz*/
#endif /* HSI_VALUE */

/**
  * @brief Internal Low Speed oscillator (LSI) value.
  */
#if !defined  (LSI_VALUE)
 #define LSI_VALUE               40000U    /*!< LSI Typical Value in Hz */
#endif /* LSI_VALUE */                     /*!< Value of the Internal Low Speed oscillator in Hz
                                                The real value may vary depending on the variations
                                                in voltage and temperature. */

/**
  * @brief External Low Speed oscillator (LSE) value.
  *        This value is used by the UART, RTC HAL module to compute the system frequency
  */
#if !defined  (LSE_VALUE)
  #define LSE_VALUE    32768U /*!< Value of the External oscillator in Hz*/
#endif /* LSE_VALUE */

#if !defined  (LSE_STARTUP_TIMEOUT)
  #define LSE_STARTUP_TIMEOUT    5000U   /*!< Time out for LSE start up, in ms */
#endif /* LSE_STARTUP_TIMEOUT */

/* Tip: To avoid modifying this file each time you need to use different HSE,
   ===  you can define the HSE value in your toolchain compiler preprocessor. */
時鐘圖
  1. 修改程式碼
    USB_DEVICE/usbd_cdc_if.c
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, *Len); // 回傳
  return (USBD_OK);
  /* USER CODE END 6 */
}
  1. 編譯&燒錄
    生成hex和bin檔案方法:C/C++ Build->Settings->MCU Post Build outputs->convert to binary file
使用jflash燒錄二進位制

燒錄完成後重新上電.

效果

虛擬串列埠輸出

相關文章