CDC-ACM,是USB ORG组织在1999年基于通信类设备推出的一个USB通用设备类别,事实上,绝大多数使用CDC串口的USB应用,并不处理串口操作,仅借助于CDC串口驱动实现USB设备和USB主机之间的数据透传。
CDC串口的主要特点:
(1)无需为产品开发专用的USB驱动程序,但无法达到HID类设备的在所有系统上面的免驱效果。目前已有不少系统已集成CDC-ACM驱动,且驱动也在不断完善,如在WIN8.1前需要驱动安装包还需要做驱动包的数字签名,因为系统只集成了SYS;如WIN10系统集成了微软重新编写的CDC-ACM驱动。
(2)固件开发容易,CDC-ACM类规范内容简单,数据上下传内容为透传方式。(3)可以实现部分串口功能,如串口参数设置和DTR/DSR的控制,但串口软件中较常用的CTS/RTS不支持,且不同操作系统下实现的CDC类驱动,还存在CTS状态不变且不可更改的差异。
下面是图形化配置:USB DEVICE, CDC
点击保存,自动生成USB外设驱动代码。其中初始化位于函数:void MX_USB_DEVICE_Init(void)
- void MX_USB_DEVICE_Init(void)
- {
- /* USER CODE BEGIN USB_DEVICE_Init_PreTreatment */
- /* USER CODE END USB_DEVICE_Init_PreTreatment */
- /* Init Device Library, add supported class and start the library. */
- if (USBD_Init(&hUsbDeviceHS, &CDC_Desc, DEVICE_HS) != USBD_OK)
- {
- Error_Handler();
- }
- if (USBD_RegisterClass(&hUsbDeviceHS, &USBD_CDC) != USBD_OK)
- {
- Error_Handler();
- }
- if (USBD_CDC_RegisterInterface(&hUsbDeviceHS, &USBD_Interface_fops_HS) != USBD_OK)
- {
- Error_Handler();
- }
- if (USBD_Start(&hUsbDeviceHS) != USBD_OK)
- {
- Error_Handler();
- }
- /* USER CODE BEGIN USB_DEVICE_Init_PostTreatment */
- /* USER CODE END USB_DEVICE_Init_PostTreatment */
- }
主函数:
- int main(void)
- {
- /* USER CODE BEGIN 1 */
- /* USER CODE END 1 */
- /* Enable the CPU Cache */
- /* Enable I-Cache---------------------------------------------------------*/
- SCB_EnableICache();
- /* Enable D-Cache---------------------------------------------------------*/
- SCB_EnableDCache();
- /* MCU Configuration--------------------------------------------------------*/
- /* Update SystemCoreClock variable according to RCC registers values. */
- SystemCoreClockUpdate();
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- /* USER CODE BEGIN Init */
- /* USER CODE END Init */
- /* USER CODE BEGIN SysInit */
- /* USER CODE END SysInit */
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- MX_UART4_Init();
- MX_USB_DEVICE_Init();
- /* USER CODE BEGIN 2 */
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- CDC_Transmit_HS("from usb device - cdc", sizeof("from usb device - cdc"));
- HAL_Delay(5000);
- }
- /* USER CODE END 3 */
- }
展示:
在没有插入TYPE-C接口的CN1 (USB1)的时候:
插入TYPE-C接口的CN1 (USB1)的时候:
|