STM32F10x-USB调试记录
STM32F10x系列USB初学调试
——by xiaohuolong1827
关于STM32F10x系列USB调试,网上各大神已进行了相关详解,现对整体流程进行大概梳理。
1. 官方例程下载
从ST下载USB示例程序,《STM32_USB-FS-Device_Lib_V4.1.0》,资源包编号“en.stsw-stm32121”。有如下示例工程:
2. 辅助工具/资料下载
为了后续能愉快的调试示例程序,观察试验现象,可根据需要额外下载如下工具/资料:
(1)Bus Hound。此工具可以看到电脑上所有的device,并且选则相应的device时,点击capture,可以进行设备通信数据的捕获。
(2)单片机多功能调试助手-温子祺。该助手具备查USB设备功能(同时其他的功能也基本上是嵌入式开发者的必备工具。)
(3)HID调试助手。进行USB设备的数据收、发。
(4)ST的HIDDemo_V1.0.工具(资源包编号en.stsw-stm32084)。该工具是与Custom_HID示例程序配套的。
(5) ST的DfuSe_Demo_V3.0.工具(资源包编号en.stsw-stm32080)。该工具是与DeviceFirmwareUpgrade示例程序配套的。
(6 USB的HID Descriptor Tool(我下载的是dt2_4.zip版本)。该工具可用来辅助生产HID设备的描述符。
(7) USB基本协议,可参考网友的《STM32-USB学习笔记》、网友的《STM32 USB HID详解》、USB设备类别码、HID描述《Device Class Definition for Human Interface Devices (HID)》。建议先读一下《STM32-USB学习笔记》
3. 目标板
从官方的文件包里来看,示例程序包含如下开发板:
如果你没有上述开发板,也没有关系,只要你的试验板是上述型号的CPU并且引出了相关USB接口,就可以进行USB调试了(我就没有)。
4. 示例程序的修改编译
示例工程打开后,未必与手头上的目标板相符,这就需要对示例程序进行相关修改、调试。
我手头上的STM32F103RE的目标板,以Custoum_Hid工程为例,做了如下修改:
4.1 包含/去除编译
因为我的开发板是103RE,所以准备使用SMT32F10E_EVAL。将工程里相关的文件夹包含/去除编译。
4.2 宏定义
同时在工程配置里,进行宏定义:
4.3 include路径
添加相应的include路径(原先的其它目标板的、非公用的include路径最好删除,有个例程因为未删除,在编译件时就出错了)
这样基本上就没问题了,可以编译通过了 。
PS:如果出现与Flash相关的宏定义未定义(例如FLASH_KEY1),原因是包含的头文件不对,默认使用的是keil安装路径里面的那个stm32f1xx.h了,使用USB示例工程里的那个头文件,需要包含以下。或者,去除flash.c文件,该工程暂时不需要操作flash。
4.4 必要的程序修改
3个GPIO口必须得配置。
(1)USB的DP、DM,
这2个引脚基本上都是PA11和PA12,所以不需要修改示例程序。
(2)USB的disconnect引脚
和谐家庭演讲稿根据网络资料,USB主机为了检测到从机设备,需要从机设备在DP、DM上做相应的上拉。
示例程序中的disconnect引脚,就是起这个作用。
在platform_config.件中修改这个引脚的定义,并根据电路结构,修改程序USB_Cable_Config中对该引脚的置高或置低,来达到使能或禁止的功能。
其它的配置程序,除非影响到你板子的必要功能,否则在调试USB程序时,可以不用管,无非就是无法使用该示例程序中的按键、指示灯等功能,但不影响USB的数据收发。
4.4 程序文件简介
编译无错后,可以大概看下工程的文件结构。
与USB相关的,就2个文件夹。一个是USB-FS-Device-Driver,里面是lib文件,不用修改;
另一个是USB-USER文件夹,用户与USB相关的代码都在这里。
注:为描述方便,以下将文件名的前缀“usb”略去。
i3 2120(1)endp.c,存放的是中断服务程序callback。用户比较关心的是接收、发送中断。
(2)desc.c是设备描述文件,里面包含对设备的各项描述,例如设备的类型、接口、端口、字符描述等等,是个很重要有的文件,PC主机通过对该类描述的访问,识别从机,并按其描述的方式进行通讯。
(3)stm32_it.c。STM32的中断函数定义,整个工程的中断入口函数都在此文件定义。与USB相关的,一般是USB_LP_CAN1_RX0_IRQHandler(有时会用高优先级HP中断)、USBWakeUp_IRQHandler。
(4)istr.c。专门处理USB中断的文件。
(5)pwr.c。暂时没关注,说是与功耗有关的。
(6)prop.c。是USB设备进行各项操作时,对具体的callback函数定义的文件,例如设备的初始化、复位、配置等等,该文件中的callback会有其它函数指针引用。
梦幻西游怎么赚钱最快>玫瑰与月季的区别(7)hw_config.c。硬件配置,设置系统、时钟、中断、返回设备序列号等。
5. 示例程序的调试运行
5.1 custom_hid示例程序的调试
异地医保如何报销
运行程序,插上USB接口,可以在PC端的设备管理里,可以看到已经识别了该设备。
(1)打开BusHound,可以看到该设备。
可以核对一下,下方的设备ID是否与dec.c文件中的描述相符。
(2)打开多功能单片机调试助手。
查USB设备,可以看到查到了该STM32设备。可以核对一下,该描述符是否与dec.c文件中的定义相符。
不知什么原因,该单片机调试助手在调试USB设备的数据收发时,显示不正常,特别是发送时,会死机,可能是我使用的方式不对。
(3)打开HID调试助手。
输入bushound中的设备ID,打开设备。注意:使用该助手时,需要先打开程序,再插上USB设备,然后点击“打开设备”按钮。这个步骤环节让本来不知道的我一度怀疑该助手的可用性。
(4)数据的收与发。
可以看到示例程序里,在stm32_it.c文件里,DMA中断,使用到了USB的发送:
所以大概猜到了,要是想使用USB发数据,需要调用USB_SIL_Write函数,并且设置相应端口的TX为Valid状态;再加上一个传送完成的软件变量。
同时在在endp.c中,接受完成中断函数内(OUT),发现如下代码:
园艺师考试
所以,当接收到数据时,使用USB_SIL_Read函数,读取相应端点的数据。注意:该函数有返回值,返回的是数据字节数。
PS: IN的数据流向为设备到主机;OUT的数据流向为主机到设备。
用户可以使用这一段代码发送数据至PC机了,如发送十六进制的0774,共计2字节。
留个问题:用户使用这段代码,无论发什么数据类容,PC机都能接收到吗??
使用HID助手发送。
这里发送十六进制数据0100,共计2个字节。
留个问题:用户使用这段代码,无论发什么数据类容,PC机都能接收到吗?
使用BusHound,可以清楚的看到设备与主机之间的通信
如果发送其它数据,不管是设备至PC,还是使用HID助手从PC至设备,都出现了发送失败的现象。原因是:该HID设备的数据协议格式,在desc.c文件中做了定义。
在report描述符中,对数据协议做了定义,例如:
以此揣测,LED1为OUT型设备,数据只能从PC发送至设备,且数据总计2字节,第一字节固定为reportID,第二字节的最小值为0,最大值为1。
同理,看一个输入型的ADC采样的report描述:
所以ADC为IN型设备,数据只能从设备发送至PC主机,数据总计2字节,第一字节固定为reportID,第二字节为采样值。
只有定义了的reportID,才能进行发送,且发送的数据必须按照report描述的格式。
(5)PC机怎么识别设备
在desc.c中,描述了该设备为HID设备。
关于设备的定义类别,需要查阅USB设备类代码表、HID类表《Device Class Definition for Human Interface Devices (HID)》。
PS:ST的HIDDemo_V1.0.和BusHound相结合来调试hid示例工程,会很方便的查看到数据的通信。
5.2 joystick示例程序的调试
按照第4章节修改程序,编译,下载到目标板。运行程序,插上USB接口,发现PC机多了一个mouse设备。这是因为的desc.c文件的配置描述中,将设备描述为鼠标了,如下图:
所以,该程序中,设备需要按照鼠标的协议格式,向PC发送数据,PC收到后会按照鼠标来处理,可以看到鼠标的移动、选中等。可查询相关鼠标协议格式的资料。
PS:注意下,发送前,检测设备是否处于CONFIGURED,且上次发送完成preXferComplete,这是比较标准的做法。
5.3 VirtualComPort示例程序调试
按第4章节修改、编译,配置好相应的USART口(例程中,中转的USART口为USART1),程序下载到目标板。
可以看到PC机的设备里多了一个COM口,这是因为在desc.中,将设备描述为CDC设备。
使用串口调试助手,可以将该串口打开、发送/接收数据。
该程序实现的功能是:设备将USB接口收到的数据,通过USART1口发送出去;同时将USART1接口收到的数据,通过USB接口发送出去。
我的调试板中,已经将USART1通过USB转换芯片转换为USB口引出,故PC机使用两个串
口调试助手,可以实现“PC端USB发送->设备USB接收->设备USART1发送->PC串口接收”以及“PC串口发送->设备USART1接收->设备USB发送->PC端USB接收”。
(1)USB接收USART发送
在endp.c文件中,有USB端口接收中断函数。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。