用STM32Cube简单实现自定义USB HID通信(实现步骤,无理论。)
本帖最后由 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 __ALIGN_END = 下面输入报告描述符:
设置中的“USBD_CUSTOM_HID_REPORT_DESC_SIZE”与此处对应。
[*]__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS __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 */
[*]
[*]};
复制代码
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 */
[*]
[*]}
复制代码
下载、调试:
已经有输出了。
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;
[*]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;
[*]}
复制代码
下载、调试:
可以用BusHound查看数据:
不是专职开发软件的,有时候玩玩,STM32Cube还是很方便的,只是有时候资料和文档不全,需要自己慢慢摸索。
你这配色简直丧心病狂 :lol:lol 颜色配的不友好,灰色看不清 签到,签到 配色感人:( 是不是患有异常三色视觉? 大哥你转贴也不说一下的。。。。
页:
[1]