资讯详情

STM32F103系列之USB HID接口实现

STM32F103芯片集成了USB2.0 Full-Speed接口,可用与计算机等外部设备的通信。基本连接如下:其中,V3P3是USB接口VBUS通过LDO转换为3.3V。

因为STM32F103内部没有集成USB2.0 Full-Speed因此,外部拉电阻(详见上一篇文章USB2.0系列—HID然后将设备)MCU_DM和MCU_DP分别接MCU的DM和DP,即可实现USB2.0Full-speed硬件配置。

关于STM32F103的Firmware,本文采用了STM32CubeIDE配置信息如下:

相应的参考代码可以通过配置上述参数生成。注:本生产的参考代码不完整,不能直接使用。还需要填写Report Descriptor数据(详见上一篇文章USB2.0系列—HID设备”)。打开USB_Device-->App-->usbd_custom_hid_if.c文件,找到以下定义,并将其定义大学内容完整。如下图所示:(数下面的数组Byte数为38,上述配置Report Descriptor数目改为38,OUT Report Bytes设置为64)

__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =

{

/* USER CODE BEGIN 0 */

0x05, 0x8c, //0x05:USAGE PAGE

0x09, 0x00, //0x09:USAGE

0xA1, 0x00, //0xA1:COLLECTION

///下面开始数据配置

0x09, 0x00, //0x09:USAGE

0xA1, 0x00, //0xA1:COLLECTION

0x09, 0x00, //0x09:USAGE

0x15, 0x00, //0x15:LOGICAL MIN 最小数为0x00

0x26, 0xFF, 0x00, //0x26:LOGICAL MAX 最大数为0XFF

0x75, 0x08, //0x75:REPORT SIZE;0x08:8位bit

0x95, 0x40, //0x95:REPORT COUNT;0x40:最大64 bytes传输

0x91, 0x02, //0x91:OUTPUT;0x02:Var(可变量)

//上面OUT格式

0x09, 0x00, //0x09:USAGE

0x15, 0x00, //0x15:LOGICAL MIN

0x26, 0xFF, 0x00, //0x26:LOGICAL MAX

0x75, 0x08, //0x75:REPORT SIZE

0x95, 0x40, //0x95:REPORT COUNT

0x81, 0x02, //0x81:INPUT; 0x02:Var(可变量)

//上面IN格式

//有两个 COLLECTION,就需要两个END COLLECTION

0xC0, //END COLLECTION

/* USER CODE END 0 */

0xC0 /* END_COLLECTION */

};

然后设置USB根据不同的需要调整接收中断优先级。

另外,USB时钟只能设置为48M,因此在设置Clock特别注意,见下图:

这样,我们的STM32下位机插入电脑后,电脑会认为是HID在电脑上打开设备USBTreeView.exe。我们可以看到我们的设置是否正确。如果是上述配置设置,计算机端应显示如下:

然后,设备可以识别,然后Firmware如何获得中通信?调用两个函数:

uint8_t USBD_CUSTOM_HID_SendReport(USBD_HandleTypeDef *pdev,uint8_t *report,uint16_t len);

//上面为STM32向主机发送数据

static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state);

//上面为STM32接收到HOST的数据会执行的函数,这个函数需要自己完善,我自己完善的数据如下:

static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state)

{

/* USER CODE BEGIN 6 */

USBD_CUSTOM_HID_HandleTypeDef *hhid_temp=(USBD_CUSTOM_HID_HandleTypeDef*)hUsbDeviceFS.pClassData; //STM数据存储的位置将在32中存储

usb_status_t *usb_status_temp=get_usb_status();///自定义的数组存储位置

uint8_t temp=0;

for(;temp<64;temp )

{

usb_status_temp->usb_receive_data.usb_buffer[index]=hhid_temp->Report_buf[index];

}

//usb_status_temp->usb_receive_data.usb_buffer[index]用来存储你想要做的数据。

return (USBD_OK);

/* USER CODE END 6 */

}

另外提醒:

在USB上电初始化后,最好检查一下USB配置是否完成(即和)HOST是否建立初始通信,然后进行相关通信USB操作。hUsbDeviceFS.dev_config!=0并且hUsbDeviceFS.dev_address!=0。只要这两个参数不是0,就意味着USB已建立设备通信,否则会出现问题。

USB HID接口建立完成后,我们HOST端(也就是电脑怎么做?),下一篇文章将介绍使用情况C#实现简单的上位机软件和STM32进行通信。

标签: usb14集成电路

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台