STM32F107——OTG模塊之USB設備之虛擬串口移植(二)

本篇實現的是從庫中直接移植過來,能實現庫中說的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的枚舉過程,目前還不是很熟悉,如果有哪位朋友在這方面有好的總結請留言,互相交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章