OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 20142|回复: 19

分享最近 STM32USB学习经验

[复制链接]

5

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2014-1-29
在线时间
0 小时
发表于 2014-1-30 17:19:36 | 显示全部楼层 |阅读模式
由于毕业设计要用到STM32的高级外外设USB,前前后后研究了半个月,也算小有成效吧,主要是分析了官方的Custom_HID 例程,强烈建议大家结合USB2.0协议第九章按照本论坛的帖子http://www.openedv.com/posts/list/411.htm去分析源代码。特别不错,分析完之后就可以修改移植了。另外,有个叫源享科技的出了一套80集的关于STM32的整套视频,对USB等高级外设讲的非常透彻,结合原子的开发板学习,效果也很好的。那视频在源享科技官网上挺贵的,哈哈,最后我在淘宝上发现那些新开的店最便宜的才10块钱。http://jwmqrs.taobao.com    这个店铺还行。老板是个挺厉害的研究生,在学USB的时候帮了我不少。。废话不说了,关于修改官方例程的步骤::附件USB程序

一、usb_desc.c文件
根据你程序使用的通信方式修改。usb_desc.h文件中定义要根据usb_desc.c文件中的数组的大小;ConfigDescriptor[SIZ_CONFIG_DESC]下添加需要处理的端点;根据需要添加或删除报告描述符(主要用于HID)和CDC接口描述符(主要用于实现USB转串口)等。具体方法可以下载电脑圈圈使用D12编写的例子。

二、Usb_conf.h文件:
1
、修改需要处理那些中断
CNTR_CTRM

处理数据正确传输后控制,比如说响应主机
CNTR_DOVRM
/* DMA OVeR/underrun Mask */
CNTR_ERRM

/* ERRor Mask */
CNTR_WKUPM 0
 
/* WaKe UP Mask */
CNTR_SUSPM

/* SUSPend Mask */
CNTR_RESETM

主要处理USB复位后进行一些初始化任务
CNTR_SOFM

/* Start Of Frame Mask */
CNTR_ESOFM

/* Expected Start Of Frame Mask */
如:
usb_conf.h
中的#define IMR_MSK (CNTR_CTRM | CNTR_SOFM | CNTR_RESETM )是决定USB_CNTR寄存器中的那个USB相关中断启动还是屏蔽。

2
、根据需要增加端点缓存地址,要根据缓存区的地址修改,防止数据重叠
如下为根据每个缓冲区的大小为64字节修改:
#define ENDP1_TXADDR
(0xC0)
#define ENDP1_RXADDR
(0xD0)
#define ENDP2_TXADDR
(0x100)
#define ENDP2_RXADDR
(0x140)
#define ENDP3_TXADDR
(0x180)
#define ENDP3_RXADDR
(0x1C0)

3
、修改/* CTR service routines */下的EPX_IN_CallbackEPX_OUT_Callback。注释掉需要处理的函数。NOP_Process表示不处理。

usb_prop.c文件
1
、修改void XX_Reset(void)(如:void Joystick_Reset(void)
一般/* Initialize Endpoint 0 */的不用修改,如下为举例说明端点1的初始化,其他端口原理一样。
SetEPType(ENDP1, EP_INTERRUPT);//
设置端点1类型
/*EP_BULK
批量端点
EP_CONTROL
 控制端点
EP_ISOCHRNOUS
 同步端点
EP_INTERRUPT
 中断端点*/
SetEPTxAddr(ENDP1, ENDP1_TXADDR); //
设置端点1缓冲区基地址
SetEPTxCount(ENDP1, 64);//
 配置Tx 缓冲计数器
SetEPRxStatus(ENDP1, EP_RX_DIS);// //
设置端点接收关闭
SetEPTxStatus(ENDP1, EP_TX_NAK);// //
设置端点1发送不应答
/*
#define EP_RX_DIS
(0x0000) // EndPoint RX DISabled
 端点接收关闭
#define EP_RX_STALL
(0x1000) // EndPoint RX STALLed
 端点接收延迟
#define EP_RX_NAK
(0x2000) // EndPoint RX NAKed
 端点接收不应答
#define EP_RX_VALID
(0x3000) // EndPoint RX VALID
端点接收有效
 
#define EP_TX_DIS
(0x0000) //EndPoint TX DISabled
 
#define EP_TX_STALL
(0x0010) // EndPoint TX STALLed
 
#define EP_TX_NAK
(0x0020) // EndPoint TX NAKed
 
#define EP_TX_VALID
(0x0030) // EndPoint TX VALID */

2
、删除不相干的描述符等。
如自定义的USB设备就不需要以下结构体初始化:
ONE_DESCRIPTOR Joystick_Report_Descriptor
ONE_DESCRIPTOR Mouse_Hid_Descriptor

3
、修改RESULT XX_Data_Setup(u8 RequestNo)的数据类请求处理。
Custom_HID例程修改为自定义USB设备例程时可以将以下
代码删除
if ((RequestNo == GET_DESCRIPTOR)

&& (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))

&& (pInformation->USBwIndex0 == 0))

{

if (pInformation->USBwValue1 == REPORT_DESCRIPTOR)
{
CopyRoutine = Joystick_GetReportDescriptor;
}
else if (pInformation->USBwValue1 == HID_DESCRIPTOR_TYPE)

{
CopyRoutine = Joystick_GetHIDDescriptor;

4
、删除不相干的获得描述符返回函数
如自定义的USB设备就不需要以下函数:
Joystick_GetReportDescriptor
Joystick_GetHIDDescriptor

四、usb_endp.c文件
1
、增加之前定义的中断数据处理函数
如:
void EP1_OUT_Callback(void)
{

这些写接收代码

五、数据发送和接收,举例说明
1
、数据接收
u8 DataLen;

DataLen = GetEPRxCount(ENDP1);

PMAToUserBufferCopy(TX1_buffer, ENDP1_RXADDR, DataLen);

SetEPRxValid(ENDP1);

USART1_Send(DataLen);

count_out = 1;
2
、数据发送
UserToPMABufferCopy(InBuffer, GetEPTxAddr(ENDP1), 64);
SetEPTxCount(ENDP1, 64);
SetEPTxValid(ENDP1);

如果你发送数据较为频繁,每次发送前应使用GetEPTxStatus(ENDP1)检测上次发送是否完成。如果端点状态处于EP_TX_VALID,说明发送未结束,如果端点状态处于EP_TX_NAK,说明发送结束。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2014-1-29
在线时间
0 小时
 楼主| 发表于 2014-1-30 17:20:57 | 显示全部楼层
网速太卡了,,附件发不上去,,,,,,
回复 支持 反对

使用道具 举报

6

主题

123

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1281
金钱
1281
注册时间
2012-5-27
在线时间
200 小时
发表于 2014-1-30 18:33:15 | 显示全部楼层
附上刘凯老师网络视频的链接  本人也没有下载过  不知道有没有加密
http://pan.baidu.com/s/1hqJYNMs
回复 支持 反对

使用道具 举报

5

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2011-7-17
在线时间
4 小时
发表于 2014-2-23 11:43:33 | 显示全部楼层
谢谢分享,希望继续完善。 顶起! 论坛里分享USB的资料太少了。 建议这个帖子应该置顶!
回复 支持 反对

使用道具 举报

32

主题

300

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2012-3-30
在线时间
321 小时
发表于 2014-2-26 04:32:52 | 显示全部楼层
附件呢,还没有上传?
回复 支持 反对

使用道具 举报

33

主题

253

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
412
金钱
412
注册时间
2012-8-16
在线时间
0 小时
发表于 2014-6-14 14:27:09 | 显示全部楼层
说好的附件呢!!!
开源的世界,你可以做主!!
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2014-6-14 15:07:32 | 显示全部楼层
顶一个!好样的
坚持学习!就能成功!
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2014-11-17
在线时间
0 小时
发表于 2014-12-26 16:01:44 | 显示全部楼层
mark!!!
回复 支持 反对

使用道具 举报

9

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
165
金钱
165
注册时间
2013-2-5
在线时间
18 小时
发表于 2014-12-26 19:10:44 | 显示全部楼层
楼主你的ep1的缓冲区设定我怎么感觉有问题呢,你确定设定Tx设定64不会影响到Rx吗
#define ENDP1_TXADDR
(0xC0)
#define ENDP1_RXADDR
(0xD0)
ep1缓冲区设定
SetEPTxAddr(ENDP1, ENDP1_TXADDR); //设置端点1缓冲区基地址
SetEPTxCount(ENDP1, 64);// 配置Tx 缓冲计数器
话说我有严重的拖延症,怎样才能不做事不拖拖拉拉的呢...
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
发表于 2014-12-26 21:48:31 | 显示全部楼层
USB 我是啃到报告描述符就啃不下去了,还有就是又没时间了,客户又拍门了............................
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

28

主题

187

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
381
金钱
381
注册时间
2014-10-9
在线时间
6 小时
发表于 2014-12-26 22:16:43 | 显示全部楼层
我直接用的是ST官方例程做的,USB HOST V2.1的库,跟着程序走,然后再看书,现在卡到解码无线游戏手柄(RF2.4G)。。。卡了好久,最近也没时间。。
拿什么让你自己信服 自己
回复 支持 反对

使用道具 举报

16

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2013-6-7
在线时间
6 小时
发表于 2015-2-24 17:02:13 | 显示全部楼层
回复【11楼】真的好多巧合:
---------------------------------
请问有什么好的书籍介绍
回复 支持 反对

使用道具 举报

28

主题

187

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
381
金钱
381
注册时间
2014-10-9
在线时间
6 小时
发表于 2015-2-26 14:39:15 | 显示全部楼层
回复【12楼】insect50:
---------------------------------
我发过一个《圈圈教你玩USB》的电子档,其他的书籍也没看过。。入门阶段
拿什么让你自己信服 自己
回复 支持 反对

使用道具 举报

16

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2013-6-7
在线时间
6 小时
发表于 2015-2-26 22:11:49 | 显示全部楼层
回复【13楼】真的好多巧合:
---------------------------------
恩,谢谢
回复 支持 反对

使用道具 举报

6

主题

92

帖子

0

精华

高级会员

Rank: 4

积分
577
金钱
577
注册时间
2014-10-6
在线时间
38 小时
发表于 2015-4-1 20:58:21 | 显示全部楼层
很好,支持,我此刻也正在研究USB,感觉好难啊
回复 支持 反对

使用道具 举报

6

主题

92

帖子

0

精华

高级会员

Rank: 4

积分
577
金钱
577
注册时间
2014-10-6
在线时间
38 小时
发表于 2015-4-1 21:17:47 | 显示全部楼层
你好,USB接口图中,D+和D-不接上拉电阻行不行啊?原子哥的板子都有,好像是不接不行,我不敢肯定!求大神解答:这是我的板子USB部分图


图中没有接上拉电阻,是不是不行?求解答????
回复 支持 反对

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2778
金钱
2778
注册时间
2015-6-1
在线时间
394 小时
发表于 2015-7-28 08:31:12 | 显示全部楼层
mark<>
自在随心
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2015-7-28
在线时间
0 小时
发表于 2015-7-28 10:33:26 | 显示全部楼层
谢谢楼主分享,过短时间等我调试好了,也分享给大家,我是用USB传输图像到PC上显示的。
回复 支持 反对

使用道具 举报

9

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2012-2-16
在线时间
11 小时
发表于 2015-10-14 16:24:52 | 显示全部楼层
回复【18楼】百易嵌入式:
---------------------------------
你好
USB传输图像到PC上显示做的怎么样了?能共享下不?
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2015-10-7
在线时间
0 小时
发表于 2015-11-7 11:10:27 | 显示全部楼层
要是楼主把附件上传了就更好了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-17 18:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表