本篇實現的是從庫中直接移植過來,能實現庫中說的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 ;
9、再次編譯下載,已經可以在電腦管理中看到虛擬出來的COM口(圖7);
注意事項:移植完成測試的時候需要注意,官方庫中是將USB口收到的數據直接發送到USART2,將從USART2收到的數據又發送到了USB口,所以測試的時候需要用兩個串口助手來完成這個現象的測試;另外需要注意的是,如果在串口2端用的是TTL轉USB模塊的時,需要用PD5和PD6引腳,庫中在stm32f10c_eval.c文件中將串口2的引腳進行了重映射。
備註:關於usbd_desc.c文件中做的修改是參考某開發板給的歷程,這部分涉及到USB的枚舉過程,目前還不是很熟悉,如果有哪位朋友在這方面有好的總結請留言,互相交流。