STM32F4的USB接口学习笔记-USB键盘

本人的第一篇博客
功能没有实现,仅记录练习过程。

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();
	。。。。。。
}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值