本例程在CH32F103 EVT例程中的USB模擬CH372例程的基礎上進行修改,所用USB庫和STM32基本差不多。修改時,重點是修改usbconfig文件夾下面的代碼,usbcore文件夾下的代碼一般不用修改。
USB庫各文件介紹:
USB_CORE文件夾文件介紹(底層結構):
usb_core.c 文件:該文件為USB2.0協議的核心處理文件
usb_init.c 文件:該文件僅包含一個函數:USB控制器的初始化函數—USB_Init函數,通過調用其他文件的函數實現的
usb_int.c 文件:該文件包含兩個函數:CTR_LP和CTR_HP,CTR_LP負責低優先級端點正確傳輸中斷的處理;CTR_HP負責USB高優先級端點正確傳輸中斷的處理
usb_mem.c文件:該文件包含兩個函數,用於對發送、接收緩存區的操作(處理PMA數據),PMA全稱為Packet memory area,是MCU內部用於USB/CAN的專用數據緩沖區。該文件包含兩個函數: PMAToUserBufferCopy和 UserToPMABufferCopy,分別用於將端點接收到的數據和數據長度復制給應用程序 和 端點接收的數據復制到用戶緩沖區
usb_regs.c文件:該文件主要負責USB控制寄存器的底層操作,里面包含各種USB寄存器的底層操作函數
usb_sil.c 文件:該文件主要對usb_mem.c文件的接口進一步封裝,為USB端點提供簡化的讀寫訪問函數
以上文件除特殊情況,一般不用做修改,直接調用內部函數即可。
USB_CONFIG文件夾文件介紹(上層結構):
hw_config.c文件:該文件主要用於硬件設備配置等。比如初始化 USB 時鍾、 USB 中斷、低功耗模式處理等
usb_desc.c 文件:該文件主要用於USB設備相關描述符的定義,比如設備描述符、配置描述符、報表描述符等等,不同設備定義描述符不同。關於這部分可參考《圈圈教你玩USB》
usb_endp.c 文件:該文件包含端點IN/OUT的回調函數。用於非控制傳輸,處理正確傳輸中斷回調函數
usb_istr.c 文件:該文件用於處理USB中斷函數
usb_prop.c 文件:該文件主要進行上層協議處理,不同類型的設備(大容量存儲、鼠標),數據協議不同。該文件用於處理所有USB設備的相關事件,包括初始化、復位等操作。USB的建立階段、數據階段以 及狀態階段的處理都是在該文件,包括USB標准請求的函數也在該文件
usb_pwr.c 文件:該文件主要用於USB控制器的電源管理
通常我們在移植修改時,主要就是對該文件夾下文件進行修改。
以CH32F103模擬鼠標(HID設備)為例,在原工程(模擬CH372)基礎上主要修改如下:
源文件修改:
1、hw_config.c文件
該文件在本次例程中不做修改;
2、usb_desc.c文件
該文件主要修改設備描述符、配置描述符(配置描述符中注意增加HID描述符),同時需要注意添加HID設備報表描述符,具體修改見附件例程。
3、usb_endp.c文件
該文件中主要添加端點發送數據函數,此處為USBD_SendMouse函數,如下圖。同時需要注釋掉端點2的兩個回調函數。此外,鼠標數據發送采用端點2,注意USBD_SendMouse函數中使用端點2。
4、usb_istr.c文件
該文件在本次例程中不做修改;
5、usb_prop.c文件
該文件增加注冊報告描述符函數、注冊HID描述符函數。完善USBD_Data_Setup函數,所有在數據階段的特殊類(報表,HID)請求都USBD_Data_Setup函數中處理,該函數會響應去檢查所有的特殊類請求,同時根據請求填充ENDPOINT_INFO結構信息。當請求有效,該函數返回USB_SUCCESS,否則返回USB_UNSUPPORT。完善USBD_NoData_Setup函數,在建立過程中,會有很多特殊類請求的無數據階段,所有的沒有數據階段的特殊請求都在該函數中處理 ,該函數會響應去檢查所有特殊類請求,並且執行請求。此外,因為GET_CONFIGURATION和GET_INTERFACE兩個請求跟個別的類聯系密切,所以他們會在這兩個函數中檢查和處理。增加獲取報告描述符函數、獲取HID描述符函數、設置接口協議請求函數、協議獲取函數。
該文件相對修改較多,可直接對照流程修改。關於該文件具體介紹,可見該鏈接:
http://news.eeworld.com.cn/mcu/article_2016122032525.html
6、usb_pwr.c文件
該文件在本次例程中不做修改;
頭文件修改:
1、hw_config.h文件
該文件主要增加發送函數定義,如下圖:
2、usb_conf.h文件
該文件主要修改如下圖:
3、usb_desc.h文件
該文件主要增加宏定義,如下圖
4、usb_prop.h文件
該文件主要增加結構體和函數定義,如下圖:
main文件修改
以上就是整個工程文件在原工程基礎上的修改內容,未介紹文件不做修改。