STM32F107——OTG模块之USB设备之虚拟串口移植(二)

来源:互联网 发布:淘宝海外全球购 编辑:程序博客网 时间:2024/05/22 11:32

本篇实现的是从库中直接移植过来,能实现库中说的USB和USART2相互传输数据。

1、先把USB_VCP(虚拟串口)的驱动安装上去,安装步骤直接下一步N次,最后点finish;

2、拷贝一个STM32F107VCT6的模板工程(MDK5.14),命名为F107_USB_VCP_Pro(图1);















3、在工程中新建USB目录,从USB库en.stm32_f105-07_f2_f4_usb-host-device_lib\STM32_USB-Host-Device_Lib_V2.2.0\Libraries中把“STM32_USB_Device_Library”和“STM32_USB_OTG_Driver”拷贝到该目录下。再在USB目录内建立一个UsbConfig文件夹,然后再从en.stm32_f105-07_f2_f4_usb-host-device_lib\STM32_USB-Host-Device_Lib_V2.2.0\Project\USB_Device_Examples\VCP下拷贝相关文件到该目录下(图2);



















4、UsbConfig目录下的文件删除system_stm32f2xx.c,system_stm32f4xx.c,system_stm32f4xx.h,stm32f2xx_conf.h,stm32f4xx_conf.h,stm32f1xx_conf.h。然后app.c文件中的内容全部覆盖main.c文件,同时删除app.c。替换或者覆盖中断文件stm32fxxx_it.c,stm32fxxx_it.h(图3);























5、新建UsbEval文件加,添加评估版相关文件,文件在en.stm32_f105-07_f2_f4_usb-host-device_lib\STM32_USB-Host-Device_Lib_V2.2.0\Utilities\STM32_EVAL目录下的Common和STM3210C_EVAL两个文件夹下(图4);





















6、工程目录下新建相关文件目录,并添加头文件(图5,图6);














































7、接下来先编译一次,会出现很多错误,我们一个一个纠正。

  • 错误1:#error "Missing define: Evaluation board (ie. USE_STM322xG_EVAL)"。修改usb_conf.h文件中的开头头文件,删掉原先的预编译的,直接添加头文件#include "stm32f10x.h",#include "stm3210c_eval.h" ,#include "stm3210c_eval_lcd.h",#include "stm3210c_eval_ioe.h";
  • 再次编译错误2:stm32_eval_legacy.h文件忘记添加;
  • 再次编译错误3:"stm3210c_eval_lcd.h"中头文件fonts.h目录发生变化,修改为#include "fonts.h"
  • 再次编译错误4:usb_conf.h文件中关于 #define USE_USB_OTG_FS宏定义没有打开,第65行左右,需要添加;
  • 再次编译错误5:usb_dcd_init.c文件中有个局部变量定义的时候没有初始化,放在了其他几个有初始化的定义变量之后,放到这几个变量的前面即可,变量为:uint32_t fifoemptymsk;
  • 再次编译错误6:lcd_log_conf.h头文件部分删去那一堆预定义头文件,直接替换为#include "stm3210c_eval_lcd.h";
  • 再次编译错误7:stm3210c_eval_lcd.c文件中fonts.c的目录改变,直接替换为#include "fonts.c";
  • 再次编译无错误,但是下载之后并不能检测到USB设备,可以想到,应该是枚举有问题,定位到usbd_desc.c,usbd_desc.h中。usbd_desc.h中去掉DEVICE_ID1,DEVICE_ID2,DEVICE_ID3,USB_SIZ_STRING_SERIAL这几个宏定义。usbd_desc.c中IntToUnicode(),Get_SerialNum(),USBD_StringSerial()这几个函数去掉;添加两个宏定义,#define USBD_SERIALNUMBER_HS_STRING     "00000000050B",#define USBD_SERIALNUMBER_FS_STRING   00000000050C"。函数USBD_USR_ConfigStrDescriptor修改为:uint8_t *  USBD_USR_ConfigStrDescriptor( uint8_t speed , uint16_t *length)
{
  if(speed  == USB_OTG_SPEED_HIGH)
  {  
    USBD_GetString((uint8_t *)(uint8_t *)USBD_CONFIGURATION_HS_STRING, USBD_StrDesc, length);
  }
  else
  {
    USBD_GetString((uint8_t *)(uint8_t *)USBD_CONFIGURATION_FS_STRING, USBD_StrDesc, length); 
  }
  return USBD_StrDesc;  
}
  • 再次编译错误8,提示没有定义USBD_StrDesc,在usbd_req.c文件中94行之后选个地方添加定义__ALIGN_BEGIN uint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ] __ALIGN_END ;
8、bsp.c文件修改,这里面是usb模块的时钟和中断设置,可以精简一下,留下必要的,把预定义的又换HS(告诉设备)的删除掉,方便阅读;

9、再次编译下载,已经可以在电脑管理中看到虚拟出来的COM口(图7);



















注意事项:移植完成测试的时候需要注意,官方库中是将USB口收到的数据直接发送到USART2,将从USART2收到的数据又发送到了USB口,所以测试的时候需要用两个串口助手来完成这个现象的测试;另外需要注意的是,如果在串口2端用的是TTL转USB模块的时,需要用PD5和PD6引脚,库中在stm32f10c_eval.c文件中将串口2的引脚进行了重映射。

备注:关于usbd_desc.c文件中做的修改是参考某开发板给的历程,这部分涉及到USB的枚举过程,目前还不是很熟悉,如果有哪位朋友在这方面有好的总结请留言,互相交流。

阅读全文
0 0
原创粉丝点击