*STM32F103ZET6 - USB_HID -1 (USB发送和接收)
示例详解: (参考 : https://blog.csdn.net/zhanglifu3601881/article/details/89675307)
基于硬件平台: STM32F103ZET6正点原子的精英板, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。
STM32CubeMX生成代码过程如下:
1>. 打开SWD - debug调试模式, STM32CubeMX生成的代码默认是没打开debug调试模式的
2>. 外部时钟配置, HSE选择为外部晶振
3>. CLOCK Configuration 配置如下: 选择HSE,PLL倍频为9, USB分频为1.5=48M
4>. USB功能选中
5>. USB_DEVICE --> 选择HID功能 . 参数设置保持默认不变.
6>. 中断配置保持默认.
7>. 生成代码配置
点击生成代码,然后烧录默认代码,连上电脑可在电脑的设备管理器中可以看到人全学输入设备中可以看到USB输入设备,但是有个叹号:
二、接下来我们将要在生成的HID框架上修改代码, 主要有修改设备描述符,传输的字节,轮询的时间,中断回调函数接收( usbd_custom_hid_if.c,usbd_conf.h,usbd_customhid.h)
/** @defgroup USBD_CUSTOM_HID_Private_Variables USBD_CUSTOM_HID_Private_Variables
* @brief Private variables.
* @{
*/
/** Usb HID report descriptor. */
//设备描述符
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
/* USER CODE BEGIN 0 */
// 0x00,
0x05, 0x8c, /* USAGE_PAGE (ST Page) */
0x09, 0x01, /* USAGE (Demo Kit) */
0xa1, 0x01, /* COLLECTION (Application) */
// The Input report
0x09,0x03, // USAGE ID - Vendor defined
0x15,0x00, // LOGICAL_MINIMUM (0)
0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255)
0x75,0x08, // REPORT_SIZE (8bit)
0x95,CUSTOM_HID_EPIN_SIZE, // REPORT_COUNT (64Byte)
0x81,0x02, // INPUT (Data,Var,Abs)
// The Output report
0x09,0x04, // USAGE ID - Vendor defined
0x15,0x00, // LOGICAL_MINIMUM (0)
0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255)
0x75,0x08, // REPORT_SIZE (8bit)
0x95,CUSTOM_HID_EPOUT_SIZE, // REPORT_COUNT (64Byte)
0x91,0x02, // OUTPUT (Data,Var,Abs)
/* USER CODE END 0 */
0xC0 /* END_COLLECTION */
};
/** @defgroup USBD_CONF_Exported_Defines USBD_CONF_Exported_Defines
* @brief Defines for configuration of the Usb device.
* @{
*/
/*---------- -----------*/
#define USBD_MAX_NUM_INTERFACES 1
/*---------- -----------*/
#define USBD_MAX_NUM_CONFIGURATION 1
/*---------- -----------*/
#define USBD_MAX_STR_DESC_SIZ 512
/*---------- -----------*/
#define USBD_DEBUG_LEVEL 0
/*---------- -----------*/
#define USBD_SELF_POWERED 1
/*---------- -----------*/
#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE 64//2 /* 64字节 */
/*---------- -----------*/
#define USBD_CUSTOM_HID_REPORT_DESC_SIZE 33U//2 /* 设备描述符大小 */
/*---------- -----------*/
#define CUSTOM_HID_FS_BINTERVAL 0x5
/** @defgroup USBD_CUSTOM_HID_Exported_Defines
* @{
*/
#define CUSTOM_HID_EPIN_ADDR 0x81U
#define CUSTOM_HID_EPIN_SIZE 0x40U//0x02U /* 64字节 */
/*这个是USB的中断接收函数,根据USB设备的ID来接收字节,库生成的时候只能接收2个字节的,
当我们改成0x40,就能接收64个字节,USB HID一包只能64个字节*/
#define CUSTOM_HID_EPOUT_ADDR 0x01U
#define CUSTOM_HID_EPOUT_SIZE 0x40U//0x02U /* 64字节 */
#define USB_CUSTOM_HID_CONFIG_DESC_SIZ 41U
#define USB_CUSTOM_HID_DESC_SIZ 9U
#ifndef CUSTOM_HID_HS_BINTERVAL
#define CUSTOM_HID_HS_BINTERVAL 0x01U//0x05U //1ms轮询
#endif /* CUSTOM_HID_HS_BINTERVAL */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
uint32_t preticks;
uint8_t report[64] = {1,2,3,4,5,6,7,8};
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USB_DEVICE_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(HAL_GetTick() - preticks > 1000)
{
preticks = HAL_GetTick();
USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, report, 64);
}
}
/* USER CODE END 3 */
}
至些代码修改完成, 这时重新编译。 然后烧录代码后, 手上USB,电脑会正确识别为HID设备, 这时没有了感叹号。
三、测试代码, 借助PortHelper.exe/USB调试工具。
1. 查找USB后,会出现STM32 Custom Human interface 这个HID设备,然后我们选择它, 再打开USB。
2. 看到接收区在以1秒64字节的速度接收我们代码里发送的64字节数据。
3. 接下来测试接收数据 – 同时用工具给程序发送数据,仿真调试程序可以看到程序可以正功接收到正常的数据:。
致些USB-HID 发送和接收测试完成。