2016年1月18日 星期一

STM32F072B Discovery Board unboxing + FreeRTOS v8.2.3 + USB_VCP_HID

1. 最近在露天買了一張stm32f072b discovery board, 基本上stm32f072 = stm32f051 + usb,  而在研
    究了一下之後, 也順手將FreeRTOS v8.2.3和USB Virtual Com-Port & HID移植完畢, 接著會將
    移植的過程簡單的描述一下.



2. main flow:
  • 基本上就是先對LED & USB 來做Init.
  1. /**
  2. * @brief Main program.
  3. * @param None
  4. * @retval None
  5. */
  6. int main(void)
  7. {
  8. RCC_ClocksTypeDef RCC_Clocks;
  9. RCC_GetClocksFreq(&RCC_Clocks);
  10. /* Steup Hardware. */
  11. prvSetupHardware();
  12. /* Create task. */
  13. vAltStartTask1Tasks( mainCREATOR_TASK_PRIORITY); //Task1
  14. vAltStartTask2Tasks( mainCREATOR_TASK_PRIORITY); //Task2
  15. /* Start the scheduler. */
  16. vTaskStartScheduler();
  17. /* Will only get here if there was not enough heap space to create the idle task. */
  18. return 0;
  19. }
  20.  
  21. static void prvSetupHardware( void )
  22. {
  23. /* LED Init. */
  24. STM_EVAL_LEDInit(LED3);
  25. STM_EVAL_LEDInit(LED4);
  26. STM_EVAL_LEDInit(LED5);
  27. STM_EVAL_LEDInit(LED6);
  28. STM_EVAL_LEDOff(LED3);
  29. STM_EVAL_LEDOff(LED4);
  30. STM_EVAL_LEDOff(LED5);
  31. STM_EVAL_LEDOff(LED6);
  32. /* USB VCP or HID Init. */
  33. USB_Init();
  34. }
  • USB VCP & HID的切換在usb_define.h裡面去做選擇.
 
  • Task1: 就是固定每100msec去Toggle LED3而已.
  1. //Task1
  2. static portTASK_FUNCTION( vTask1FunctionTask, pvParameters )
  3. {
  4. portTickType xLastWakeTime;
  5. /* Just to stop compiler warnings. */
  6. ( void ) pvParameters;
  7. xLastWakeTime = xTaskGetTickCount();
  8.  
  9. for( ;; )
  10. {
  11. Task1Task_Counter++;
  12. STM_EVAL_LEDToggle(LED3);
  13. vTaskDelayUntil( &xLastWakeTime, ( 100 / portTICK_RATE_MS ) );
  14. }
  15. }


  • Task2: 固定每200msec會去Toggle LED6外, 還會根據usb_define選擇的結果來輸出VCP or HID測試信號.
  1. //Task2
  2. static portTASK_FUNCTION( vTask2FunctionTask, pvParameters )
  3. {
  4. portTickType xLastWakeTime;
  5. /* Just to stop compiler warnings. */
  6. ( void ) pvParameters;
  7. xLastWakeTime = xTaskGetTickCount();
  8. for( ;; )
  9. {
  10. Task2Task_Counter++;
  11. STM_EVAL_LEDToggle(LED6);
  12.  
  13. #ifdef HIDRAW
  14. for(int i=0;i<32;i++)
  15. HID_Buffer[i] = i;
  16. USBD_HID_SendReport (&USB_Device_dev, HID_Buffer, 32);
  17. PrevXferDone = 0;
  18. #endif
  19. #ifdef VirtualComPort
  20. memset(VCP_Buffer,0x00,sizeof(VCP_Buffer));
  21. sprintf(VCP_Buffer, "$,HelloWorld:%d\r\n", vcp_counter++);
  22. USBD_VCP_SendReport(&USB_Device_dev, CDC_IN_EP, (uint8_t*)&VCP_Buffer[0], strlen(VCP_Buffer));
  23. #endif
  24. vTaskDelayUntil( &xLastWakeTime, ( 200 / portTICK_RATE_MS ) );
  25. }
  26. }

3. Test Flow:  當我們利用usb_define.h來切換VCP/HID的時候, 程式會根據切換的結果來做不同
    的Init, 因此在裝置管理員上看到的裝置也不相同.
  1.  
  2. #ifdef HIDRAW
  3. #define USBD_VID 0x0483
  4. #define USBD_PID 0x5750
  5.  
  6. #define USBD_LANGID_STRING 0x409
  7. #define USBD_MANUFACTURER_STRING "STMicroelectronics"
  8.  
  9. #define USBD_PRODUCT_FS_STRING "Custome HID"
  10.  
  11. #define USBD_CONFIGURATION_FS_STRING "HID Config"
  12. #define USBD_INTERFACE_FS_STRING "HID Interface"
  13. #endif
  14.  
  15. #ifdef VirtualComPort
  16. #define USBD_VID 0x0483
  17. #define USBD_PID 0x5740
  18.  
  19. /** @defgroup USB_String_Descriptors
  20. * @{
  21. */
  22. #define USBD_LANGID_STRING 0x409
  23. #define USBD_MANUFACTURER_STRING "STMicroelectronics"
  24.  
  25. #define USBD_PRODUCT_FS_STRING "STM32 Virtual ComPort in FS Mode"
  26.  
  27. #define USBD_CONFIGURATION_FS_STRING "VCP Config"
  28. #define USBD_INTERFACE_FS_STRING "VCP Interface"
  29. #endif
  30.  


  • 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:

1 則留言:

  1. 你好,請教一下,我目前在做CustomHID雙向傳輸+MSC的複合設備,CustomHID的部分已經做好,但是加進MSC就會安裝驅動程式不成功,bNumInterfaces、Configuration Descriptor size都改了,可能哪裡還會有問題呢?

    回覆刪除