基于STM32CubeMX生成HID双向通讯工程的说明
时间:09-21
来源:互联网
点击:
数据发送
就类似串口通讯,我们首先做一个数据的发送工作。
在Main.c文件中,我们在while(1)的主循环中增加我们的发送函数,主要就是调用发送报文的
API:USBD_CUSTOM_HID_SendReport()
/* USER CODE BEGIN 2 */
uint8_t i=0;
sendbuffer[0]=0x07; //这个是report ID,每次发送报文都需要以这个为开始,这样主机才能正确//解析后边的数据含义
sendbuffer[1]=0x01; //这个是实际发送的数据,可以自由定义,只要不超过报文描述符的限制
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_Delay(100); //延迟100ms
sendbuffer[1]++; //每次发送都将变量自加1
USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS,sendbuffer,2);//发送报文
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
编译后下载到MCU内,连接上位机软件即可看到如下所示的进度条在不断的增长。
这个就是我们上传到的数据在上位机的图形显示,你也可以看Input/outputtransfer里的数据变化。
这样看起来是不是更像是串口调试助手了?嘿嘿本来机制就差不多的。
数据接收
MCU的USB数据是如何接收的呢?是不是调用一个类似于串口接收的API呢?
不是的!USB的数据接收都是在中断中完成的,在新建的工程中,我们在函数CUSTOM_HID_OutEvent_FS内增加如下代码。
static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state)
{
/* USER CODE BEGIN 6 */switch(event_idx)
{
case 1: /* LED3 */
(state == 1) ?HAL_GPIO_WritePin(LD3_GPIO_Port,LD3_Pin,GPIO_PIN_SET) :
HAL_GPIO_WritePin(LD3_GPIO_Port,LD3_Pin,GPIO_PIN_RESET);
break;
case 2: /* LED4 */
(state == 1) ?HAL_GPIO_WritePin(LD4_GPIO_Port,LD4_Pin,GPIO_PIN_SET) :
HAL_GPIO_WritePin(LD4_GPIO_Port,LD4_Pin,GPIO_PIN_RESET);
break;
case 3: /* LED5 */
(state == 1) ?HAL_GPIO_WritePin(LD5_GPIO_Port,LD5_Pin,GPIO_PIN_SET) :
HAL_GPIO_WritePin(LD5_GPIO_Port,LD5_Pin,GPIO_PIN_RESET);
break;
case 4: /* LED6 */
(state == 1) ?HAL_GPIO_WritePin(LD6_GPIO_Port,LD6_Pin,GPIO_PIN_SET) :
HAL_GPIO_WritePin(LD6_GPIO_Port,LD6_Pin,GPIO_PIN_RESET);
break;
default:
break;
}
return (0);
/* USER CODE END 6 */
}
编译之后下载到MCU内,通过USB USER连接到PC端,打开Usb HidDemonstrator,我们可以通过勾选右下角的图形界面来实现控制开发板上的LED电量或者关闭。
当然,这个是通过图像化的界面来进行控制,你也可以通过Input/outputtransfer中的写入对话框来完成这个操作。注意,写入的第一个字节是ID,表示你想控制的是哪个LED;第二个字节是0或者是1,表示你想让这个LDE的状态变成灭还是亮。
总结:
本范例程序是为了快速实现USB 从机设备与主句设备双向通讯目的,其初始化代码是用STM32CubeMX来生成的,大大降低了工程师开发USB设备的难度(尤其是是入门阶段的难度)。从这个工程的基础上,工程师可以比较方便的建立好框架工程并,对其中的代码进行研究,进而移植或增加自己的应用代码。
就类似串口通讯,我们首先做一个数据的发送工作。
在Main.c文件中,我们在while(1)的主循环中增加我们的发送函数,主要就是调用发送报文的
API:USBD_CUSTOM_HID_SendReport()
/* USER CODE BEGIN 2 */
uint8_t i=0;
sendbuffer[0]=0x07; //这个是report ID,每次发送报文都需要以这个为开始,这样主机才能正确//解析后边的数据含义
sendbuffer[1]=0x01; //这个是实际发送的数据,可以自由定义,只要不超过报文描述符的限制
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_Delay(100); //延迟100ms
sendbuffer[1]++; //每次发送都将变量自加1
USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS,sendbuffer,2);//发送报文
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
编译后下载到MCU内,连接上位机软件即可看到如下所示的进度条在不断的增长。
这个就是我们上传到的数据在上位机的图形显示,你也可以看Input/outputtransfer里的数据变化。
这样看起来是不是更像是串口调试助手了?嘿嘿本来机制就差不多的。
数据接收
MCU的USB数据是如何接收的呢?是不是调用一个类似于串口接收的API呢?
不是的!USB的数据接收都是在中断中完成的,在新建的工程中,我们在函数CUSTOM_HID_OutEvent_FS内增加如下代码。
static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state)
{
/* USER CODE BEGIN 6 */switch(event_idx)
{
case 1: /* LED3 */
(state == 1) ?HAL_GPIO_WritePin(LD3_GPIO_Port,LD3_Pin,GPIO_PIN_SET) :
HAL_GPIO_WritePin(LD3_GPIO_Port,LD3_Pin,GPIO_PIN_RESET);
break;
case 2: /* LED4 */
(state == 1) ?HAL_GPIO_WritePin(LD4_GPIO_Port,LD4_Pin,GPIO_PIN_SET) :
HAL_GPIO_WritePin(LD4_GPIO_Port,LD4_Pin,GPIO_PIN_RESET);
break;
case 3: /* LED5 */
(state == 1) ?HAL_GPIO_WritePin(LD5_GPIO_Port,LD5_Pin,GPIO_PIN_SET) :
HAL_GPIO_WritePin(LD5_GPIO_Port,LD5_Pin,GPIO_PIN_RESET);
break;
case 4: /* LED6 */
(state == 1) ?HAL_GPIO_WritePin(LD6_GPIO_Port,LD6_Pin,GPIO_PIN_SET) :
HAL_GPIO_WritePin(LD6_GPIO_Port,LD6_Pin,GPIO_PIN_RESET);
break;
default:
break;
}
return (0);
/* USER CODE END 6 */
}
编译之后下载到MCU内,通过USB USER连接到PC端,打开Usb HidDemonstrator,我们可以通过勾选右下角的图形界面来实现控制开发板上的LED电量或者关闭。
当然,这个是通过图像化的界面来进行控制,你也可以通过Input/outputtransfer中的写入对话框来完成这个操作。注意,写入的第一个字节是ID,表示你想控制的是哪个LED;第二个字节是0或者是1,表示你想让这个LDE的状态变成灭还是亮。
总结:
本范例程序是为了快速实现USB 从机设备与主句设备双向通讯目的,其初始化代码是用STM32CubeMX来生成的,大大降低了工程师开发USB设备的难度(尤其是是入门阶段的难度)。从这个工程的基础上,工程师可以比较方便的建立好框架工程并,对其中的代码进行研究,进而移植或增加自己的应用代码。
- 实现WUSB设备控制器的设计考虑因素(09-12)
- 基于USB2.0的高速无线数传接收设备的数据接收存储方法(09-09)
- 四种短距离无线监控解决方案的性能对比(09-16)
- Wibree:一个可供选择的新无线联网技术(11-07)
- TI 单芯片手机多媒体电话解决方案(12-01)
- 蓝牙技术硬件实现模式分析(01-11)