本帖最后由 icevel 于 2015-8-20 12:50 编辑
简单的用HID通信,本人不懂USB协议,只是想在一个项目中用HID代替串口,在网上找了一些例子,都需要搞懂USB协议,于是尝试用STM32Cube实现,适合拿过来就用。
0、开发环境:
自己做的STM32F072RB的板子
STM32CubeMX4.9.0+STM32CubeF0 Firmware Package V1.3.0
IAR 7.2
1、建立、配置工程:
打开STM32Cube,选择好器件
打开USB Device(FS)
选择要使用的其它功能,我打开了USART1用于输出数据
在Middlewares里面选择Custom HID
配置好时钟,我选择的时钟源是HSI48
配置USB: 设备描述页默认即可,需要修改"Parameter Settings",将USBD_CUSTOM_HID_REPORT_DESC_SIZE 设置为33(此处33和程序中设备描述符对应)
USBD_CUSTOMHID_OUTREPORT_BUF_SIZE 修改为64 ,输出节点的buffer大小,也就是每次发送数据的最大字节数。
2、生成代码
用STM32Cube生成代码。
3、修改代码实现发送
修改usbd_custom_hid_if.c:
在__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END = 下面输入报告描述符:
设置中的“USBD_CUSTOM_HID_REPORT_DESC_SIZE” 与此处对应。
- __ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
- {
- /* USER CODE BEGIN 0 */
- //#ifdef 0
- 0x05, 0x8c, /* USAGE_PAGE (ST Page) */
- 0x09, 0x01, /* USAGE (Demo Kit) */
- 0xa1, 0x01, /* COLLECTION (Application) */
- /* 6 */
- // The Input report
- 0x09,0x03, // USAGE ID - Vendor defined
- 0x15,0x00, // LOGICAL_MINIMUM (0)
- 0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255)
- 0x75,0x08, // REPORT_SIZE (8)
- 0x95,0x40, // REPORT_COUNT (40)
- 0x81,0x02, // INPUT (Data,Var,Abs)
- //19
- // The Output report
- 0x09,0x04, // USAGE ID - Vendor defined
- 0x15,0x00, // LOGICAL_MINIMUM (0)
- 0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255)
- 0x75,0x08, // REPORT_SIZE (8)
- 0x95,0x40, // REPORT_COUNT (40)
- 0x91,0x02, // OUTPUT (Data,Var,Abs)
- //32
- /* USER CODE END 0 */
- 0xC0 /* END_COLLECTION */
- };
[color=rgb(51, 102, 153) !important]复制代码
Stm32CUBE提供的API函数为“USBD_CUSTOM_HID_SendReport” ,直接调用即可:
- int main(void)
- {
- /* USER CODE BEGIN 1 */
- uint8_t HID_Buffer[]={"Hello,HID!~"};
- /* USER CODE END 1 */
- /* MCU Configuration----------------------------------------------------------*/
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- /* Configure the system clock */
- SystemClock_Config();
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- MX_USART1_UART_Init();
- MX_USB_DEVICE_Init();
- /* USER CODE BEGIN 2 */
- printf("init_OK!\r\n");
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, HID_Buffer,65);
- HAL_Delay(500);
- }
- /* USER CODE END 3 */
- }
[color=rgb(51, 102, 153) !important]复制代码
下载、调试:
已经有输出了。
4、修改代码实现接收:
修改文件“usbd_custom_hid_if.c”,在函数“CUSTOM_HID_OutEvent_FS” 内加入数据处理代码即可:
- static int8_t CUSTOM_HID_OutEvent_FS (uint8_t event_idx, uint8_t state)
- {
- /* USER CODE BEGIN 6 */
- USBD_CUSTOM_HID_HandleTypeDef *hhid;
- hhid = (USBD_CUSTOM_HID_HandleTypeDef*) hUsbDeviceFS.pClassData;
- uint8_t rx_buf[65];
- printf("%s",hhid->Report_buf);
- switch(event_idx)
- {
- case 1: /* LED1 */
- (state == 1) ? LED(1) : LED_off(1);
- break;
- case 2: /* LED2 */
- (state == 1) ? LED(2) : LED_off(2);
- break;
- case 3: /* LED3 */
- (state == 1) ? LED(3) : LED_off(3);
- break;
- case 4: /* LED4 */
- (state == 1) ? LED(4) : LED_off(4);
- break;
- default:
- LED_all(0x00);
- break;
- }
[color=rgb(51, 102, 153) !important]复制代码
下载、调试:
可以用BusHound查看数据:
不是专职开发软件的,有时候玩玩,STM32Cube还是很方便的,只是有时候资料和文档不全,需要自己慢慢摸索。 |
大哥你转贴也不说一下的。。。。