本人的第一篇博客
功能没有实现,仅记录练习过程。
1 STM32CubeMX配置
1.1 USB接口配置
因为单片机要做Host连接键盘,USB模式要选择为Host:
使能USB接口的中断:
IP选择HID,其它设置保持默认即可
此处随便选择一个不使用的输出端口
1.2 时钟配置
USB接口使用的时钟频率为48MHz
至此,配置完成,生成代码
2 编写测试程序
2.1 修改<usb_host.c>中的USBH_UserProcess函数,添加USB设备状态变化的信息打印,也可以不修改
static void USBH_UserProcess (USBH_HandleTypeDef *phost, uint8_t id)
{
/* USER CODE BEGIN CALL_BACK_1 */
switch(id)
{
case HOST_USER_SELECT_CONFIGURATION:
printf("configuration\r\n");
break;
case HOST_USER_DISCONNECTION:
Appli_state = APPLICATION_DISCONNECT;
printf("disconnect\r\n");
break;
case HOST_USER_CLASS_ACTIVE:
Appli_state = APPLICATION_READY;
printf("ready\r\n");
break;
case HOST_USER_CONNECTION:
Appli_state = APPLICATION_START;
printf("connect\r\n");
break;
default:
break;
}
/* USER CODE END CALL_BACK_1 */
}
2.2 修改<usb_host.c>中的MX_USB_HOST_Process函数,用于读取USB设备信息
void MX_USB_HOST_Process(void)
{
/* USB Host Background task */
USBH_Process(&hUsbHostFS);
HID_TypeTypeDef Hid_dev = USBH_HID_GetDeviceType(&hUsbHostFS);
if (Hid_dev == HID_KEYBOARD)
{
HID_KEYBD_Info_TypeDef *keyboard_info;
keyboard_info = USBH_HID_GetKeybdInfo(&hUsbHostFS);
if (keyboard_info != NULL)
{
printf("keyboard\r\n");
uint8_t ascii = USBH_HID_GetASCIICode(keyboard_info);
if (ascii != 0)
{
printf("%c", ascii);
}
}
}
else if (Hid_dev == HID_MOUSE)
{
HID_MOUSE_Info_TypeDef *Mouse_Info;
Mouse_Info = USBH_HID_GetMouseInfo(&hUsbHostFS);
if (Mouse_Info != NULL)
{
printf("mouse\r\n");
}
}
}
2.3 在主程序中定时调用MX_USB_HOST_Process();
if (Tmr_Heart->TimeOutFlag) //心跳脉冲
{
extern void MX_USB_HOST_Process(void);
MX_USB_HOST_Process();
}
3 总结
利用CubeMX,配置起来非常方便,也几乎没有什么代码量(原因可能是目前的功能没有实现吧,如果能哆读键值了,可能键盘事件处理起来也很麻烦吧)。
鼠标也测试过,和键盘一样,都是只能成功读取到一次设备信息,敲任何按键都没有反应
有测试成功的朋友,欢迎指导,感谢!
4 2014年11月8日补充
前面讲功能没有实现,现在来填坑
MX_USB_HOST_Process()函数的调用频率要小于键盘HID设备描述符中规定的通讯间隔时间,我查了键盘的端点描述中时间间隔为10ms,将此函数的调用频率改到9ms以内就可以正常使用了
Tmr_Heart = NewMyTimer(9, NULL, 0); //创建心跳定时器
if (Tmr_Heart == NULL)
{
Error_Handle(0, "Creat Heart Timer failed!\r\n");
}
if (Tmr_Heart->TimeOutFlag) //心跳脉冲
{
Tmr_Heart->TimeOutFlag = 0;
MX_USB_HOST_Process();
。。。。。。
}