摘要
在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 主機)應用程式。
實現
- Connective->USB開啟USB Device(FS)
- Middleware->USB_DEVICE->開啟Communication Device Class
- 配置時鐘(引數如下)
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. */
時鐘圖 |
---|
- 修改程式碼
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 */
}
- 編譯&燒錄
生成hex和bin檔案方法:C/C++ Build->Settings->MCU Post Build outputs->convert to binary file
使用jflash燒錄二進位制 |
---|
燒錄完成後重新上電.
效果
虛擬串列埠輸出 |
---|