以前还这没有注意到,STM32F103C6T6这款MCU居然有USB功能,一直使用了1年多了,一直没有发现这么便宜的单片机还有USB功能,今天特测记录一下,开通USB功能的步骤,防止后面忘记了,这个功能还是很实用的,我今天只是学习了一下怎么把这款MCU制作成一个虚拟串口,需要用到的引脚就是PA11(USB_DM)PA12(USB_DP)利用这两个端口和电脑的USB线相连就能叫电脑识别出一个新的串口,然后利用这个串口和单片机进行通讯,这个USB的速度可是比串口快多了啦,全速12M/S。好了,废话不多说了,下面展示步骤:

第一步:打开STM32CubeMX软件,点击ACCESS TO MCU SELECTOR按钮,用来选择新品型号

第二步:输入芯片信号,再下方列表中选择新品型号,最后点击开始建立工程。

第三步:点击A-Z的方式点击SYS系统设置,在Debug一栏选择Serial Wire,这是选择下载程序的方式,选择这项一般的ST-link,J-link都可以下载了,不然就只能下载一次就不能在下载了,具体真假我没有尝试,感觉没有必要,要听老师的话,不然呢会走很多弯路。

第四步:配置外部高速时钟。如图所示进行配置就好了。

第五步:启动USB功能,如图所示勾选Device(FS),勾选完成后下方的USB_DEVICE就变成黑色可选的一项了,没有勾选前是不可选的。

第六步:修改USB_DEVICE配置:Class For Fs IP:选择成虚拟串口模式。

下面的Device Descriptor选项中的VID和PID调成进制显示,如果电脑识别不出来把这两个值改了,改成电脑没有识别过的值。

第七步:配置时钟数:

第八步:配置工程名称,路径,类型。

第九步:选择只拷贝需要的库文件和生成.c和.h文件。

第十步:生成工程。

经过前面十步就生成了一个keil可以直接打卡的工程了:

下面就是打开这个工程:

接下来就是修改usbd_cdc_if.c文件中的内容了:

其实就是修改两个函数而已:

static int8_t CDC_Init_FS(void) //这个函数是电脑和MCU一旦建立链接就会调用的函数
{
  /* USER CODE BEGIN 3 */
  /* Set Application Buffers */
  uint32_t len = APP_RX_DATA_SIZE; //把USB接收到数据点的长度赋值给len
  USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0);
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS);
  CDC_Receive_FS(UserRxBufferFS,&len); //开始接收数据,接收到的数据放到UserRxBufferFS中,长度放到len中
  return (USBD_OK);
  /* USER CODE END 3 */
}

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
  CDC_Transmit_FS(Buf,*Len); //把接收到的数据发送出去,参数(要发送的数组,长度)
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  return (USBD_OK);
  /* USER CODE END 6 */
}

之后就可以编译:0错误0警告

改成J-link下载程序:

将USB从J-link上拔下来插拔开发板的USB口上:

此时电脑上的设备管理器中的串口就多了一个虚拟串口COM7:

最后用串口助手测试,往单片机发送数据后,单片机立马就把数据给返回了回来,证明实验成功。

本来想学习一下标准库怎么建立USB连接的,但是没有找到,USB的标准库文件,所以就用省事的STM32CubeMX来配置了,这个很省事,但是对于学习USB通讯来说还是一点用都没有,只会调用接收和发送的函数就行了,底层到的事一概不知。哪位读者要是有标准库文件,麻烦发我一份,谢谢了。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐