用户工具

站点工具


icore3_arm_hal_21
银杏科技有限公司旗下技术文档发布平台
技术支持电话0379-69926675-801
技术支持邮件Gingko@vip.163.com
版本 日期 作者 修改内容
V1.0 2020-04-18 gingko 初次建立






STM32CubeMX教程二十一——虚拟串口

1. 新建工程:在主界面选择File–>New Project 或者直接点击ACCEE TO MCU SELECTOR  2. 出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置 在搜索栏的下面,提供的各种查找方式,可以选择芯片内核、型号等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32F407IGTx。  3. 配置RCC,使用外部时钟源  4. 配置调试引脚  5. 将LED对应的3个引脚(PI5,PI6,PI7)设置为GPIO_Output  6. 引脚模式配置  7. 配置USB_OTG_HS  8. 配置USB_Device  9. 打开USB中断  10. 时钟源设置,选择外部高速时钟源,配置为最大主频  11. 工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 IDE我们使用的是 MDK5

12. 点击Code Generator,进行进一步配置

  • Copy all used libraries into the project folder
  • 将HAL库的所有.C和.H都复制到所建工程中
    • 优点:这样如果后续需要新增其他外设又可能不再用STM32CubeMX的时候便会很方便
    • 缺点:体积大,编译时间很长
  • Copy only the necessary library files
  • 只复制所需要的.C和.H(推荐)
    • 优点:体积相对小,编译时间短,并且工程可复制拷贝
    • 缺点:新增外设时需要重新用STM32CubeMX导入
  • Add necessary library files as reference in the toolchain project configuration file
  • 不复制文件,直接从软件包存放位置导入.C和.H
    • 优点:体积小,比较节约硬盘空间
    • 缺点:复制到其他电脑上或者软件包位置改变,就需要修改相对应的路径

自行选择方式即可

13. 然后点击GENERATE CODE 创建工程  创建成功,打开工程。





STM32CubeMX教程二十一——虚拟串口

一、 实验目的与意义

  1. 了解STM32 USB SLAVE结构。
  2. 了解STM32 USB SLAVE特征。
  3. 掌握STM32 HAL库中USB SLAVE的配置方法。
  4. 掌握USB SLAVE VCP使用方法。
  5. 掌握Keil MDK集成开发环境使用方法。

二、 实验设备及平台

  1. iCore3 双核心板。点击购买
  2. JLINK(或相同功能)仿真器。点击购买
  3. Micro USB线缆。
  4. Keil MDK 开发平台。
  5. STM32CubeMX开发平台。
  6. 装有WIN XP(及更高版本)系统的计算机。

三、 实验原理

1、USB_VCP设备

  • USB_VCP是属于USB_CDC类设备中的一种,是通过USB接口虚拟串口实现串口通讯的功能。
    • USB虚拟串口,简称VCP,是Virtual COM Port的简写,它是利用USB的CDC类来实现的一种通信接口。
    • USB虚拟串口属于USB通信设备类。在物理层通过USB总线,采用虚拟串口的方式为主机提供一个物理串口。在系统内部,USB控制器提供了一个批量传输IN端点和一个批量传输的OUT端点,用于数据的接收和发送,模拟串口的RX和TX线。另外USB控制器还提供中断IN端点,发送当前串口的状态,实现对串口传输的控制。串口设备的数据,由系统的串口采集,在芯片内完成USB包的封装,通过USB总线上传至主机,再由相应的串口应用程序进行处理。对用户来说,看到的是基于串口的数据采集和传输,而实际上实现的是基于USB协议包的数据传输。
    • 我们可以利用STM32自带的USB功能,来实现一个USB虚拟串口,从而通过USB,实现电脑与STM32的数据互传。上位机无需编写专门的USB程序,只需要一个串口调试助手即可调试,非常实用。
    • 本实验利用STM32自带的USB功能,连接电脑USB,虚拟出一个USB串口,实现电脑和开发板的数据通信。

2、USB_CDC

  • USB2.0标准下定义了很多子类,有音频类,CDC类,HID,打印,大容量存储类,HUB,智能卡等等,这些在usb.org官网上有具体的定义,这里主要介绍通信类CDC。CDC(Communication Device Class)类是USB2.0标准下的一个子类,定义了通信相关设备的抽象集合。
  • USB的CDC类是USB通信设备类(Communication Device Class)的简称。CDC类是USB组织定义的一类专门给各种通信设备(电信通信设备和中速网络通信设备)使用的USB子类。根据CDC类所针对通信设备的不同,CDC类又被分成以下不同的模型:USB传统纯电话业务(POTS)模型,USBISDN模型和USB网络模型,其中USB传统纯电话业务模型又可分为直线控制模型(Direct Line Control Model)、抽象模型、电话模型。虚拟串口就属于USB传统纯电话业务模型下的抽象控制模型。
  • USB CDC类的通信部分主要包含三部分:枚举过程、虚拟串口操作和数据通信。其中虚拟串口操作部分并不一定强制需要,因为若跳过这些虚拟串口的操作,实际上USB依然是可以通信的。之所以会有虚拟串口操作,主要是我们通常使用PC作为Host端,在PC端使用一个串口工具来与其进行通信,PC端的对应驱动将其虚拟成一个普通串口,这样一来,可以方便PC端软件通过操作串口的方式来与其进行通信,但实际上,Host端与Device端物理上是通过USB总线来进行通信的,与串口没有关系,这一虚拟化过程,起决定性作用的是对应驱动,包含如何将每一条具体的虚拟串口操作对应到实际上的USB操作。需要注意的是,Host端与Device端的USB通信速率并不受所谓的串口波特率影响,它就是标准的USB2.0全速(12Mbps)速度,实际速率取决于总线的实际使用率、驱动访问USB外设有效速率(两边)以及外部环境对通信本身造成的干扰率等因素组成。
  • CDC类软件框架

  • 如上图所示,黄色USB Device Core部分为USB设备库文件,属于中间件,它为USB协议栈的核心源文件,一般不需要修改:
  • USB Device Core中,Log/debug为打印/调试开关;
  • core为USB设备核心;
  • USB request中定义了枚举过程中各种标准请求的处理;
  • I/O request为底层针对USB通信接口的封装。
  • 黄色USB Device Class部分为USB类文件,也属于中间件,USB设备库,目前ST DEMO中支持的类有HID, Customer HID, CDC, MSC, DFU, Audio, ST提供了这些类的源码框架,其他的Class或者是复合设备需要自己根据实际需求情况进行扩展或定制。如果用户需求只是需要一个标准类,比如CDC通信,那么最好就使用现成的代码,不需要做任何修改就可以实现这个CDC类通信的功能。
  • 蓝色USB Device HAL Driver为HAL库部分,是对USB外设接口的封装,属于底层驱动,不需要修改,它分为PCD和LL Driver,PCD处于LL Driver之上。
  • 洋红色USB Device Configuration为USB配置封装,位于USB底层HAL层驱动与中间件USB协议栈之间,一方面向上层(USB设备库)提供各种操作调用接口,另一方面,向底层USB驱动提供各种回调接口。正是由于它的存在,使得USB协议栈(USB设备库)与底层硬件完全分离,从而使USB设备库具有更加兼容所有STM32的通用性。USB Device Configuration为开放给用户的源文件,用户可以根据自己的某些特殊需要进行修改,也可以使用默认的源文件,假如没有任何特殊要求的话,我们使用默认即可。
  • Application为应用层,USB Device Class有可能将自己对应该的操作接口封装在一个操作数据结构中,由应用来具体实现这些操作,在系统初始化时,由应用将已经定义好的操作接口注册到对应的USB类中,比如usbd_cdc_if, 就这样,使得应用层的应用代码与属于中间件层的USB协议栈分离。同时,USB协议栈会将一些字符串描述符放到APP中,当USB初始化时将这些已经定义好的字符串通过指针初始化到USB协议栈中,以便后续需要时获取。
  • USB_CDC类详细内容可参考《USB_CDC类入门培训》。

3、USBD_VCP实验介绍

  • USBH_VCP实验是用STM32F407的USB接口通过STM32_HAL库生成的代码达到iCore3上的USB接口实现虚拟串口的功能。

4、实验内容:

  • 通过移植STM32_HAL库提供的代码来实现STM32虚拟串口功能,然后就可以像操作串口一样操作USB,本实验实现终端发送数据,STM32将接收到的数据直接返回给终端,验证发送和接收。

四、 实验程序

1. 主函数

int main(void)  
{  
  HAL_Init();  
  SystemClock_Config();  
  MX_GPIO_Init();  
  MX_USB_DEVICE_Init();  
  LED_GREEN_ON;  
 
  while (1)  
  {  
 
  }  
} 
  • 主程序主要打开了LED_GREEN,在while循环中并没有写任何内容,接受发送处理文件主要在usb_cdc_if.c中。

2. 接受回调函数:

static int8_t CDC_Receive_HS(uint8_t* Buf, uint32_t *Len)  
{  
  /* USER CODE BEGIN 11 */  
  USBD_CDC_SetRxBuffer(&hUsbDeviceHS, &Buf[0]);  
  USBD_CDC_ReceivePacket(&hUsbDeviceHS);  
   CDC_Transmit_HS(Buf,(uint16_t)(*Len));  
  return (USBD_OK);  
  /* USER CODE END 11 */  
}

3. 发送函数

 uint8_t CDC_Transmit_HS(uint8_t* Buf, uint16_t Len)  
{  
  uint8_t result = USBD_OK;  
  /* USER CODE BEGIN 12 */  
  USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceHS.pClassData;  
  if (hcdc->TxState != 0){  
    return USBD_BUSY;  
  }  
  USBD_CDC_SetTxBuffer(&hUsbDeviceHS, Buf, Len);  
  result = USBD_CDC_TransmitPacket(&hUsbDeviceHS);  
  /* USER CODE END 12 */  
  return result;  
}
  • CDC_Transmit_HS是发送函数,指定数据首地址和字节长度,数据就会发送到串口,底层是USB库实现的。CDC_Receive_HS是接收到收据后的回调函数,数据是收到一帧后才调用的CDC_Receive_HS,所以每次的字节长度不一定相同,传入的两个参数是数据缓存首地址和数据长度。这里简单的将接收到的数据原样返回,实现数据回环,只需要在CDC_Receive_HS函数添加一行调用CDC_Transmit_HS函数即可。

五、 实验步骤

  1. 把仿真器与iCore3的SWD调试口相连(直接相连或者通过转接器相连);
  2. 将跳线帽插在USB_UART;
  3. 把iCore3通过Micro USB线与计算机相连,为iCore3供电;
  4. 打开Keil MDK 开发环境,并打开本实验工程;
  5. 烧写程序到iCore3上;
  6. 打开Commix串口终端(注:Commix使用方法见附录);
  7. 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。

六、 实验现象

  • 终端发送“Hello,I’M iCore3.”,STM32将接收到的消息又直接返回给终端,现象如下:

附录:

  • 1、驱动安装:打开本实验文件夹中的驱动文件夹,双击VCP_V1.4.0_Setup.exe,开始安装虚拟串口驱动。按照顺序安装即可。

  • 2、安装完成后并下载程序设备上将会显示相应的端口

icore3_arm_hal_21.txt · 最后更改: 2022/03/18 15:10 由 sean