历史上的今天
返回首页

历史上的今天

今天是:2025年03月24日(星期一)

正在发生

2019年03月24日 | STM32高级教程之USB HID双向数据传输

2019-03-24 来源:eefocus

程序功能:

1,将STM32的USB枚举为HID设备。
2,STM32使用3个端点,端点0用于枚举用,端点1和2用于数据的发送和接收。

3,端点长度为64,也就是单次最多可以传输64个字节数据。

4,STM32获取上位机下发的数据并将该数据通过USB原样返回,同时将数据打印输出。
5,上位机程序通过调用windows的API实现对HID设备的读写控制。

原理图:

 

说明:实际测试的时候不用这么复杂的电路,接好PA11和PA12即可,当然在PA12引脚上需要一个上拉电阻,其他电路都可以省略。

HID枚举成功:

 

说明:枚举成功后会自动安装HID驱动,无需单独安装。

上位机程序运行效果图:

 

说明:上位机程序是在VS2010环境下写的,不过可以根据自己需求移植到其他环境中。

单片机运行输出:

 

说明:单片机端采用超级终端输出相关信息,使用的USART1串口,也就是PA9和PA10两个引脚。

Bus Hound抓取数据截图:

 

说明:Bus Hound是一个很不错的数据抓包工具,调试USB程序相当有用。

部分程序源码:
STM32的报告描述符:


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

constuint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =

{

        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,0x40, // 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,0x40, // REPORT_COUNT (64Byte)

        0x91,0x02, // OUTPUT (Data,Var,Abs)

 

        0xc0 /* END_COLLECTION */

}; /* CustomHID_ReportDescriptor */



上位机测试程序:


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

/**

  * @brief  发送数据后读取数据

  * @param  None

  * @retval None

  */

voidHIDSampleFunc(void)  

{      

        HANDLE      hDev;      

        BYTE        recvDataBuf[1024],reportBuf[1024];;                  

        DWORD       bytes;      

        hDev = OpenMyHIDDevice(0); // 打开设备,不使用重叠(异步)方式 ;     

        if(hDev == INVALID_HANDLE_VALUE){          

                printf("INVALID_HANDLE_VALUE\n");

                return; 

        }

        reportBuf[0] = 0; // 输出报告的报告 ID 是 0     

        for(inti=0;i

                reportBuf[i+1]=i+1;//将数据存放在数据缓冲区

        }

        printf("开始写数据到设备...\n");

        // 写入数据到设备,注意,第三个参数值必须为REPORT_COUNT+1,否则会返回1784错误

        if(!WriteFile(hDev, reportBuf, REPORT_COUNT+1, &bytes, NULL)){          

                printf("write data error! %d\n",GetLastError());

                return;   

        }else{

                printf("成功向设备写出%d个数据... \n",bytes);

        }

        printf("开始从设备读取数据...\n");

        // 从设备读取数据,注意,第三个参数值必须大于等于REPORT_COUNT+1,否则会返回1784错误

        if(!ReadFile(hDev, recvDataBuf, REPORT_COUNT+1, &bytes, NULL)){ // 读取设备发给主机的数据 

                printf("read data error! %d\n",GetLastError());

                return;   

        }else{

                printf("成功向设备读出%d个数据... \n",bytes);

        }

        printf("设备返回的数据为:\n");

        //显示读取回来的数据

        for(inti=0;i

                printf("0x%02X ",recvDataBuf[i+1]);

        }

        printf("\n\r");

}



推荐阅读

史海拾趣

ASPEED Technology公司的发展小趣事

ASPEED的AST2600 BMC与瑞萨电子的I3C器件相结合,为客户提供了设计便捷、带宽增强且系统成本优化的解决方案。这一合作不仅展示了ASPEED在服务器管理领域的实力,还进一步推动了DDR5解决方案对I3C标准的推广使用。通过双方的努力,共同客户在实现向全新高速总线接口飞跃发展的过程中,获得了更加信心满满的设计体验。

AF International公司的发展小趣事

随着公司业务规模的不断扩大,AF International意识到建立完善的质量管理体系至关重要。公司引进了先进的质量管理理念和方法,建立了严格的质量控制流程,确保从原材料采购到产品生产的每一个环节都符合质量标准。同时,AF International还加强了对员工的培训和教育,提高员工的质量意识和操作技能。这些措施使得公司的产品质量得到了有效保障,赢得了客户的广泛赞誉。

Forge Europa Ltd公司的发展小趣事

在全球化布局的同时,Forge Europa Ltd公司也注重在中国市场的本土化深耕。公司在中国设立了研发中心和生产基地,以更好地服务中国市场并融入本土产业链。通过深入了解中国市场的需求和特点,Forge Europa不断调整产品策略,推出了一系列符合中国市场需求的LED灯带产品。此外,公司还积极与中国本土企业合作,共同推动LED照明技术的发展和应用。

Grand Halo Technology Co Ltd公司的发展小趣事

Forge Europa Ltd公司深知可持续发展对于企业和行业的重要性。因此,公司在生产过程中始终坚持绿色、环保的理念,致力于减少能源消耗和环境污染。公司采用了先进的生产技术和设备,提高了生产效率和资源利用率,同时加强了废弃物的处理和回收工作。此外,Forge Europa还积极参与各类环保活动,倡导绿色消费和低碳生活,为行业树立了可持续发展的典范。

上海如韵(CONSONANCE)公司的发展小趣事

随着电子行业的快速发展,市场竞争日益激烈。为了应对这一挑战,如韵不断调整和优化产品线,加强与国际知名企业的合作,引进先进的技术和设备。同时,公司加大了对研发团队的投入,鼓励员工进行创新实践和技术交流。

在面对行业内的价格战和恶性竞争时,如韵始终坚持产品质量和客户满意度为首要原则。通过不断提升产品质量和服务水平,如韵赢得了客户的信任和口碑。即使在行业面临困境的时期,如韵也凭借着强大的技术实力和良好的市场口碑保持了稳健的发展态势。

Ememory Technology Inc公司的发展小趣事

在2022年,eMemory宣布加入英特尔晶圆代工服务加速器(Intel Foundry Services Accelerator)计划。这一合作标志着eMemory的技术得到了国际半导体巨头的认可。通过这一计划,eMemory为使用英特尔晶圆代工服务的客户提供全球领先的安全IP解决方案,进一步提升了其产品在全球市场的竞争力。

问答坊 | AI 解惑

关于MAP文件的一点认识

本文来自于HELLODSP交流网 作者:huttu 近来有很多朋友问及MAP文件,下面我就对MAP文件的一点理解和大家分享。 MAP文件是CCS软件编译后产生的有关DSP用到所有程序、数据及IO空间的一种映射文件。 一、生成方法     MAP文件主要有两种 ...…

查看全部问答>

创建一个NIOS环境的视频教程

创建一个NIOS环境的视频教程,入门级的,好东西…

查看全部问答>

24cxx中文手册,要发就发实用帖

以前收藏的24cxx中文手册,颇有用。…

查看全部问答>

6个好习惯让你做一个优秀的DSP开发者

1.交谈 尽可能多地跟其他软件开发者交谈;培养个人关系;跟意见与你相左的人交流;跟经验更丰富的人交流;跟阅历丰富的人交流。多到Groups 中去,尤其是交谈自由随意的Groups——不约束主题,不约束交谈内容。   2. 选择更好的环境&nb ...…

查看全部问答>

Wince6.0 R3系统定制的问题

为什么Run-time image can be larger than 32MB(IMGRAM64=1)选中后还会出现如下信息,nk.bin生成不了 Pass 1... Warning: Unable to do imports from ppp.dll to RSAENH.dll - will late bind Warning: Unable to do imports from schannel.dll ...…

查看全部问答>

关于51单片机调试的问题

User command #1: C:WAVE6000\\BIN\\wave.exe /k ---Error:User Command terminated, Exit-Code = 1 \"Web51\" - 1 Error(s), 0 Warning(s). 这个错误很常见吧 哥哥姐姐请指教 …

查看全部问答>

谁用过ADS,怎么把PADS的PCB导入ADS?

谁用过ADS,怎么把PADS的PCB导入ADS?指点一下或者给些资料都欢迎,先谢谢了!…

查看全部问答>

ping返回时间长

请教个问题,我用107vc做一个网络控制的设备,在ping它的IP时返回的时间比较长,而且不一致,有时几百毫秒,最长达1000毫秒。 初始化完了之后    while (1)    {       timer_poll ();   ...…

查看全部问答>

招聘开发人员

本公司从事微电子自动化控制领域的高新技术企业,为了适应公司发展的需要现招聘以下方面人才,真诚欢迎你的加盟: 1)        程序员:VS2005 C++ FOR WINCE 要求有C++开发经验 2)        嵌入式开发人 ...…

查看全部问答>

EP2S30F484C4管脚图

网上找了好久,没有找到!!还望那位大侠给份!!非常感谢…

查看全部问答>