究了一下之後, 也順手將FreeRTOS v8.2.3和USB Virtual Com-Port & HID移植完畢, 接著會將
移植的過程簡單的描述一下.
2. main flow:
- 基本上就是先對LED & USB 來做Init.
/** * @brief Main program. * @param None * @retval None */ int main(void) { RCC_ClocksTypeDef RCC_Clocks; RCC_GetClocksFreq(&RCC_Clocks); /* Steup Hardware. */ prvSetupHardware(); /* Create task. */ vAltStartTask1Tasks( mainCREATOR_TASK_PRIORITY); //Task1 vAltStartTask2Tasks( mainCREATOR_TASK_PRIORITY); //Task2 /* Start the scheduler. */ vTaskStartScheduler(); /* Will only get here if there was not enough heap space to create the idle task. */ return 0; } static void prvSetupHardware( void ) { /* LED Init. */ STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); STM_EVAL_LEDInit(LED5); STM_EVAL_LEDInit(LED6); STM_EVAL_LEDOff(LED3); STM_EVAL_LEDOff(LED4); STM_EVAL_LEDOff(LED5); STM_EVAL_LEDOff(LED6); /* USB VCP or HID Init. */ USB_Init(); }
- USB VCP & HID的切換在usb_define.h裡面去做選擇.
- Task1: 就是固定每100msec去Toggle LED3而已.
//Task1
static portTASK_FUNCTION( vTask1FunctionTask, pvParameters )
{
portTickType xLastWakeTime;
/* Just to stop compiler warnings. */
( void ) pvParameters;
xLastWakeTime = xTaskGetTickCount();
for( ;; )
{
Task1Task_Counter++;
STM_EVAL_LEDToggle(LED3);
vTaskDelayUntil( &xLastWakeTime, ( 100 / portTICK_RATE_MS ) );
}
}
- Task2: 固定每200msec會去Toggle LED6外, 還會根據usb_define選擇的結果來輸出VCP or HID測試信號.
//Task2 static portTASK_FUNCTION( vTask2FunctionTask, pvParameters ) { portTickType xLastWakeTime; /* Just to stop compiler warnings. */ ( void ) pvParameters; xLastWakeTime = xTaskGetTickCount(); for( ;; ) { Task2Task_Counter++; STM_EVAL_LEDToggle(LED6); #ifdef HIDRAW for(int i=0;i<32;i++) HID_Buffer[i] = i; USBD_HID_SendReport (&USB_Device_dev, HID_Buffer, 32); PrevXferDone = 0; #endif #ifdef VirtualComPort memset(VCP_Buffer,0x00,sizeof(VCP_Buffer)); sprintf(VCP_Buffer, "$,HelloWorld:%d\r\n", vcp_counter++); USBD_VCP_SendReport(&USB_Device_dev, CDC_IN_EP, (uint8_t*)&VCP_Buffer[0], strlen(VCP_Buffer)); #endif vTaskDelayUntil( &xLastWakeTime, ( 200 / portTICK_RATE_MS ) ); } }
3. Test Flow: 當我們利用usb_define.h來切換VCP/HID的時候, 程式會根據切換的結果來做不同
的Init, 因此在裝置管理員上看到的裝置也不相同.
#ifdef HIDRAW #define USBD_VID 0x0483 #define USBD_PID 0x5750 #define USBD_LANGID_STRING 0x409 #define USBD_MANUFACTURER_STRING "STMicroelectronics" #define USBD_PRODUCT_FS_STRING "Custome HID" #define USBD_CONFIGURATION_FS_STRING "HID Config" #define USBD_INTERFACE_FS_STRING "HID Interface" #endif #ifdef VirtualComPort #define USBD_VID 0x0483 #define USBD_PID 0x5740 /** @defgroup USB_String_Descriptors * @{ */ #define USBD_LANGID_STRING 0x409 #define USBD_MANUFACTURER_STRING "STMicroelectronics" #define USBD_PRODUCT_FS_STRING "STM32 Virtual ComPort in FS Mode" #define USBD_CONFIGURATION_FS_STRING "VCP Config" #define USBD_INTERFACE_FS_STRING "VCP Interface" #endif
- HID: 假設我們要測試HID, 可以利用BusHound這套軟體來測試, 它可以針對特定裝置來側錄輸出入的log, 如下圖, 可以看到系統新增出一個HID-compliant device, 透過Hardware ID(VID/PID)可以確認這就是我們目前在使用的stm32f072 discovery board.
- 從log上看到和我們程式的結果符合, 固定每200msec輸出0x00~0x1f這32個bytes.
- VCP:
- 燒錄程式後, 先確認目前ST VCP的編號是多少? (ex: COM14)
- 可以使用Putty來觀察結果, 設定如下.
- 接著就可以看到如下圖的結果:
- Test Video:
4. Test Code Link:
你好,請教一下,我目前在做CustomHID雙向傳輸+MSC的複合設備,CustomHID的部分已經做好,但是加進MSC就會安裝驅動程式不成功,bNumInterfaces、Configuration Descriptor size都改了,可能哪裡還會有問題呢?
回覆刪除