无奈F407的USB搞迅雷下到99.9不动了了,到这里来求助

STM32 USB Audio疑问 - *USB* - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 892|回复: 3
STM32 USB Audio疑问
在线时间23 小时
该用户从未签到主题帖子精华
中级会员, 积分 386, 距离下一级还需 114 积分
这几天在搞USB的声卡,用的是STM32F103ZET6,用的是Hal库生成的代码,I2S2 DMA方式输出,有以下问题,声音有,但是噪声很大,而且USB数据暂停后,I2S2上还是有数据在不停的发,感觉是USB库哪里有问题,接收看过了应该是没有问题的,就是这个同步传输的问题,红色部分,为什么每次都是从haudio-&buffer[0]开始,而且长度还是固定,haudio-&rd_ptr这个指针没什么作用嘛。。搞来搞去的,理论上应该是USB循环队列的读指针,但是没有起到作用,下面的函数是DMA传输完回调调用的,感觉只要这样调下去,数据永远都停止不了,I2S上肯定永远都有数据,而且只能取到前半个Buffer的长度,后半部分,永远都取不到。。不知道有没有兄弟对下面函数有什么想法?还是我应用错了?
void&&USBD_AUDIO_Sync (USBD_HandleTypeDef *pdev, AUDIO_OffsetTypeDef offset)
&&int8_t shift = 0;
&&USBD_AUDIO_HandleTypeDef& &*
&&haudio = (USBD_AUDIO_HandleTypeDef*) pdev-&pClassD
&&haudio-&offset =&&
&&if(haudio-&rd_enable == 1)
& & haudio-&rd_ptr += AUDIO_TOTAL_BUF_SIZE/2;
& & if (haudio-&rd_ptr == AUDIO_TOTAL_BUF_SIZE)
& && &/* roll back */
& && &haudio-&rd_ptr = 0;
&&if(haudio-&rd_ptr & haudio-&wr_ptr)
& & if((haudio-&rd_ptr - haudio-&wr_ptr) & AUDIO_OUT_PACKET)
& && &shift = -4;
& & else if((haudio-&rd_ptr - haudio-&wr_ptr) & (AUDIO_TOTAL_BUF_SIZE - AUDIO_OUT_PACKET))
& && &shift = 4;
& & if((haudio-&wr_ptr - haudio-&rd_ptr) & AUDIO_OUT_PACKET)
& && &shift = 4;
& & else if((haudio-&wr_ptr - haudio-&rd_ptr) & (AUDIO_TOTAL_BUF_SIZE - AUDIO_OUT_PACKET))
& && &shift = -4;
&&if(haudio-&offset == AUDIO_OFFSET_FULL)
& & ((USBD_AUDIO_ItfTypeDef *)pdev-&pUserData)-&AudioCmd(&haudio-&buffer[0],
& && && && && && && && && && && && && && && && && && && &AUDIO_TOTAL_BUF_SIZE/2 - shift,
& && && && && && && && && && && && && && && && && && && &AUDIO_CMD_PLAY);
& && &haudio-&offset = AUDIO_OFFSET_NONE;& && && &&&
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间23 小时
该用户从未签到主题帖子精华
中级会员, 积分 386, 距离下一级还需 114 积分
没人知道?
在线时间9 小时
该用户从未签到主题帖子精华
初级会员, 积分 121, 距离下一级还需 79 积分
你的问题解决了吗 我的出现播放速度加快和噪音
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间23 小时
该用户从未签到主题帖子精华
中级会员, 积分 386, 距离下一级还需 114 积分
你的问题解决了吗 我的出现播放速度加快和噪音
没有。。没搞了。。。
站长推荐 /2
Tel: 3-8064
备案号: 苏ICP备号-2
|||意法半导体STM32/STM8技术社区
Powered by豆丁微信公众号
君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
基于STM32的USB简易鼠标毕业设计论文
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口查看: 25850|回复: 28
官方DFU固件更新软件实现对STM32的USB方式代码升级简易说明(STM32-V5开发板)
主题帖子积分
做人第一,工作第二
软件下载:
(12.11 MB, 下载次数: 18743)
16:02 上传
点击文件名下载附件
(特别说明,此软件含有官方的VS平台的源码文件)
开发平台:STM32-V5开发板
前几天在论坛发布了使用串口ISP进行代码下载,这次再讲解下使用USB接口进行代码下载.
DFU的全称是Device Firmware Upgrade,即设备固件升级。
============================================================
第一步:下载了官方DFU软件后,安装软件包,安装完毕后代开这个软件的安装路径
需要再安装下STM32的USB驱动。路径如下(根据电脑系统选择安装X86还行x64):
1.png (25 KB, 下载次数: 6)
16:08 上传
第二步:USB驱动安装上以后,用USB线将电脑和开发板连接,USB线接到开发板的这个USB口上:
1.png (201 KB, 下载次数: 6)
16:12 上传
第三步:让开发板进入ISP模式,在电脑的资源管理器里面可以看到已经识别出USB
2.png (58 KB, 下载次数: 3)
16:18 上传
第4步:打开此路径下的这个软件:
4.png (30 KB, 下载次数: 5)
16:20 上传
选择这个选项
5.png (11 KB, 下载次数: 3)
16:24 上传
打开后后效果如下:
5.png (19 KB, 下载次数: 3)
16:25 上传
通过这个软件将bin文件,hex文件或者S19文件转换成DFU文件格式。实际测试添加hex
文件的时候老是无法识别,弹出如何错误。
6.png (57 KB, 下载次数: 3)
16:27 上传
第5步:DfuFileMgr小软件里面有几个参数需要大家填好。
(1)Vendor ID,Product ID,和Version ID需要通过如下小软件进行获取:
7.png (30 KB, 下载次数: 3)
16:30 上传
打开软件后,参数在这里:
8.png (27 KB, 下载次数: 3)
16:31 上传
将其填写到DfuFileMgr里面:
9.png (15 KB, 下载次数: 3)
16:32 上传
(2)填写Target ID,这里填写0即可(填写其它数值的用途还没有研究)
10.png (15 KB, 下载次数: 3)
16:33 上传
(3)Target Name选项里面添写个名字即可,这里填写了个LED
11.png (15 KB, 下载次数: 3)
16:34 上传
(4)点击此选项,添加bin文件
12.png (15 KB, 下载次数: 3)
16:35 上传
(5)IAR和MDK工程生产bin文件的方法看这个帖子:
http://forum.armfly.com/forum.php?mod=viewthread&tid=7097
(6)添加bin文件:
13.png (23 KB, 下载次数: 3)
16:40 上传
(7)点击生产即可
14.png (32 KB, 下载次数: 3)
16:43 上传
特别注意,这个软件似乎有bug,不管你将生成的dfu文件保存到哪里,最终一定在安装目录的这个文件里面:
15.png (32 KB, 下载次数: 3)
16:44 上传
第6步:再次打开小软件DfuSeDemo,加载刚才的led.dfu。
16.png (28 KB, 下载次数: 3)
16:47 上传
第7步:提示加载完毕,并选择这个选项:
16.png (35 KB, 下载次数: 3)
16:48 上传
最后一步,点击Upgrade按钮:
17.png (42 KB, 下载次数: 4)
16:49 上传
18.png (27 KB, 下载次数: 3)
16:49 上传
重启开发板就可以运行了。
开启补充查克拉模式
主题帖子积分
新手上路, 积分 0, 距离下一级还需 49 积分
新手上路, 积分 0, 距离下一级还需 49 积分
老大,我运行到第七步了,但是生成的dfu文件不知道保存到哪里了?
主题帖子积分
做人第一,工作第二
回 casy99 的帖子
:老大,我运行到第七步了,但是生成的dfu文件不知道保存到哪里了? ( 10:05) 第6步上面有写。
开启补充查克拉模式
主题帖子积分
这个可以支持F103吗?
需要在自己的应用代码中加入USB的相关代码吗?
主题帖子积分
做人第一,工作第二
回 caicaptain2 的帖子
:这个可以支持F103吗?
需要在自己的应用代码中加入USB的相关代码吗? ( 11:35) 可以的。
DFU跟ISP下载模式一样,都是用芯片memory flash区自带的bootloader。
开启补充查克拉模式
主题帖子积分
高级会员, 积分 210, 距离下一级还需 289 积分
高级会员, 积分 210, 距离下一级还需 289 积分
既然可以用USB来升级固件,那使用USB的时候,用的时钟是内部HSI吗?也就是说,可以利用HSI来做USB的应用,里面的8MHz可以认为足够精确?
主题帖子积分
做人第一,工作第二
回 lvehe 的帖子
:既然可以用USB来升级固件,那使用USB的时候,用的时钟是内部HSI吗?也就是说,可以利用HSI来做USB的应用,里面的8MHz可以认为足够精确? ( 18:22) HSI也可通过PLL倍频。
开启补充查克拉模式
主题帖子积分
高级会员, 积分 210, 距离下一级还需 289 积分
高级会员, 积分 210, 距离下一级还需 289 积分
回 eric2013 的帖子
:HSI也可通过PLL倍频。 ( 22:10) 倍频,我知道,只是不清楚用内部晶振是否可以达到USB时钟要求的精度要求,这样可以省了外部HSE。
主题帖子积分
新手上路, 积分 1, 距离下一级还需 48 积分
新手上路, 积分 1, 距离下一级还需 48 积分
感恩分享,点击Upgrade后,出现,“bad state machine in firmware”错误提示,如何解决?
主题帖子积分
做人第一,工作第二
回 calming 的帖子
:感恩分享,点击Upgrade后,出现,“bad state machine in firmware”错误提示,如何解决? ( 11:32) 没有遇到过这种情况,多折腾几次试试看,有时候的确不太好用。
开启补充查克拉模式
主题帖子积分
新手上路, 积分 1, 距离下一级还需 48 积分
新手上路, 积分 1, 距离下一级还需 48 积分
感恩分享,给楼主挑个刺,&&[s:116] ,第六步:添加bin文件,Address不应该是0x,应该是user application的地址,也就是要下载的程序的地址,比如0x,或者其他用户定义的地址,不知道楼主如何看?我用0x,感觉不对,改成0x,下载的程序就运行成功了
主题帖子积分
新手上路, 积分 1, 距离下一级还需 48 积分
新手上路, 积分 1, 距离下一级还需 48 积分
回 calming 的帖子
:感恩分享,点击Upgrade后,出现,“bad state machine in firmware”错误提示,如何解决? ( 11:32) 这个问题终于解决了,感觉是DfuSeDemo的问题,还没有彻底搞清楚,我在USB IAP程序中,把要刷新的程序地址,改为大于0x,然后用DfuSeDemo下载程序,就出现错误提示,如果把USB IAP程序里的 ApplicationAddress 改为0x,就可以正常下载,但不知道原因。楼主怎么看?
主题帖子积分
做人第一,工作第二
回 calming 的帖子
:感恩分享,给楼主挑个刺,&&[s:116] ,第六步:添加bin文件,Address不应该是0x,应该是user application的地址,也就是要下载的程序的地址,比如0x,或者其他用户定义的地址,不知道楼主如何看?我用0x,感觉不对,改成0x,下载的程序 .. ( 08:52) 你用的这种方式跟我们的有区别,我们的是用的STM32芯片内部自带的bootloader,这个bootloader是固化在系统存储区的,就是往0x里面下载的。
类似与串口ISP下载,有用过没有,一样的。
开启补充查克拉模式
主题帖子积分
新手上路, 积分 1, 距离下一级还需 48 积分
新手上路, 积分 1, 距离下一级还需 48 积分
回 eric2013 的帖子
:你用的这种方式跟我们的有区别,我们的是用的STM32芯片内部自带的bootloader,这个bootloader是固化在系统存储区的,就是往0x里面下载的。
类似与串口ISP下载,有用过没有,一样的。
 ( 11:58) 谢谢楼主的回复,明白您的意思,应该是我们的下载方式有差异。
主题帖子积分
新手上路, 积分 30, 距离下一级还需 19 积分
新手上路, 积分 30, 距离下一级还需 19 积分
很详细,有用
主题帖子积分
新手上路, 积分 0, 距离下一级还需 49 积分
新手上路, 积分 0, 距离下一级还需 49 积分
为什么我打开那个DFU升级软件 最上面 DFU Deivce&&里面没有东西的
主题帖子积分
做人第一,工作第二
:为什么我打开那个DFU升级软件 最上面 DFU Deivce&&里面没有东西的 ( 13:58) 多试试,重启下电脑啥的,熟悉这个软件得稍少花点时间折腾下,这个软件比较难用。
开启补充查克拉模式
主题帖子积分
新手上路, 积分 0, 距离下一级还需 49 积分
新手上路, 积分 0, 距离下一级还需 49 积分
如果能够一拖几同时进行下载呢
主题帖子积分
做人第一,工作第二
回 congcong245 的帖子
:如果能够一拖几同时进行下载呢 ( 11:03) 这个不支持哦。
开启补充查克拉模式
主题帖子积分
金牌会员, 积分 824, 距离下一级还需 176 积分
金牌会员, 积分 824, 距离下一级还需 176 积分
一定要WIN7 WIN8吗,XP下能用吗
主题帖子积分
做人第一,工作第二
回 zerone 的帖子
:一定要WIN7 WIN8吗,XP下能用吗 ( 14:44) 这个得试试了,或者从官网搜索下stsw-stm32080 ,看看是不是有升级版本,看看加入XP了没。
开启补充查克拉模式
主题帖子积分
金牌会员, 积分 824, 距离下一级还需 176 积分
金牌会员, 积分 824, 距离下一级还需 176 积分
需要改BOOT0,BOOT1的引脚电平吗
主题帖子积分
做人第一,工作第二
需要改BOOT0,BOOT1的引脚电平吗
是的,要进入ISP下载模式。
开启补充查克拉模式
主题帖子积分
金牌会员, 积分 824, 距离下一级还需 176 积分
金牌会员, 积分 824, 距离下一级还需 176 积分
那是不方便,实际产品可能都装在里面拆开麻烦。还是自己写BOOTLODER,用IAP实现方便
主题帖子积分
做人第一,工作第二
那是不方便,实际产品可能都装在里面拆开麻烦。还是自己写BOOTLODER,用IAP实现方便
也可以不设置的,要升级程序时,直接往系统bootloader跳转,之前有群友测试过,可行。
开启补充查克拉模式
主题帖子积分
新手上路, 积分 14, 距离下一级还需 35 积分
新手上路, 积分 14, 距离下一级还需 35 积分
有没有&&F4 DFU的源码?
主题帖子积分
做人第一,工作第二
有没有&&F4 DFU的源码?
这个没有源码,这个是用的F4的系统存储区自带的。
开启补充查克拉模式
主题帖子积分
初级会员, 积分 67, 距离下一级还需 132 积分
初级会员, 积分 67, 距离下一级还需 132 积分
楼主,点击Upgrade后,出现,“bad state machine in firmware”错误提示,如何解决?
主题帖子积分
做人第一,工作第二
楼主,点击Upgrade后,出现,“bad state machine in firmware”错误提示,如何解决?
多试试,这个软件还是比较难用的,只能多试试了。
开启补充查克拉模式
Powered by查看: 24824|回复: 250
入门级详细USB移植教程——致正在为USB烦恼的朋友
本帖最后由 10xjzheng 于
12:23 编辑
同上一篇MPU6050一样,我还是写一篇关于USB的帖子,在圈圈等玩USB的大神面前,我掌握的USB知识实在是九牛一毛,所以这篇帖子加上了入门级的修饰语。写这篇帖子主要是为了那些想快速开发USB的人,至于想深入了解USB协议,可以先学完我这个再去看看别的高级教程可能会好点,虽然我强调自己掌握的USB知识不多,但是对于一般的应用已经足够,我这里主要是学会怎么去用USB做自己的东西,而且我觉得刚学完一个东西就来教下别人实在是一个一举两得的做法,因为我更清楚学习时的心理和一些小问题,而且我也可以进一步总结。我有个观点不知道其他大神中不中听,好像圈圈大神就搞了USB几年达到了精通的水平,可能一些几个月达到了很懂的水平,但是这个过程实在是很漫长,对于很多人也没有必要对USB进行彻底的研究,只要会用就好,就像你可能不懂车的高级原理,但是你会开车就好了,^_^。其他大神不同意的话,写个高级的USB教程让我们学习下吧。这里其实也是个人学习笔记。
记得一个月前,我想做无线鼠标,开始在网上查找资料,从那个时候开始学习USB,找了圈圈的书将前面足足看了3、4遍,还只是瞎子摸象,不过瞎子摸象很正常啦,学什么东西一开始哪里可能能够弄清全局。看了3、4编,实在是很煎熬,一直没有什么进展,没有搞出点成果。就开始上网找资料,让瞎子摸象来得更彻底一点。
如果学过I2C的话,可能对USB理解会更透彻点,两者在某些方面还是有共通之处的,某种意义上来说,STM32的USB跟硬件I2C有点像,89C52的USB介于软件I2C和硬件I2C之间,89C52有了USB芯片的协助后,很多时序不用自己模拟,但是编程使用芯片搞USB这过程就跟软件I2C一样的蛋疼。首先STM32是有USB的两个数据端口的,首先看上面的这张图,是野火ISO板子USB原理图部分,一个VCC,一个GND连接到USB设备,充电的时候就是这两个起作用,供电的作用。D+和D-就是差分数据线,ID我们一般没有用到,是用来设备和主机之间的识别用到,有时候两台机器可以做设备和主机就靠这根线来区别。主要是三极管这部分,由电路图可以知道PD3口要给低电平上拉电阻才能接到D+,应该这里在D-还要有一个三极管和上拉电路,不然这里默认了所接的设备一定是全速设备和高速设备,不是低速设备,不知道接低速设备有没有事。USB运行的前提是要上拉电阻接通才行喔,这里不直接接上拉的原因就是可以自己控制,你可以再程序中控制这里来断开USB连接然后再接上去,选择较多,当然也有直接接上去的。除了STM32,89c52和STC12等单片机也可以搞USB,圈圈就是用89C52来搞的,但是89C52是没有像STM32那样子内置USB外设的,那么就需要加多1块USB芯片,还有相应的外围电路,但是STM32就不用,好方便的说。”主机在检测到设备接入后,会执行设备识别,这个过程比较麻烦,它的枚举过程包含了设备的一些相关信息与通信方式。 “这个过程我觉得如果不是要真正研究USB的话,也没有必要看,看了搞不好神经错乱。加上ST官方库的USB例程后,STM32搞USB难度降低了几个等级。ST官方有个JoyStickMouse的例程,就是通过摇杆来控制鼠标。我们接下来是用按键来控制鼠标。
官方的源文件地址:
原子的触控USB鼠标实验就是其中一个很好的教程,很通俗,很符合初学者心理,可惜讲解得太简短了,不懂触摸屏的可以直接忽略它的触摸屏部分,
教程地址:& &
工程地址:
USB2.0协议中文版:
关于 STM32F102/103 的USB模块和USB库函数:这是官方对库的说明:
USB英文文档:
USB描述符:
圈圈教你玩USB----PDF:
基于STM32 的USB程序开发笔记(看不懂,不过好像很牛逼):
USB源代码分析(很详细的)
USB鼠标工程(网上找的)圈圈USB资料合集:
首先说明的是你在过程里面看到很多的类似usmart,如果这些都是个人调试程序用的,如果你想进一步了解就看下我这个贴子,不想就直接忽略好了。
记住,在网上找到一些USB例程无法直接使用在你的板子上面的原因之一就是硬件的原因,所以才需要稍微了解下原理才能根据自己的板子改装。本帖子会包括:STM32鼠标移植,STM32键盘移植,89C52鼠标移植,89C52键盘移植,可能后续还会有其他的USB作品的移植。
STM32-USB鼠标移植1.首先你需要按照原子教程下面说的添加文件
这里顺便说下几个文件,大致了解下就好啦
上传一个USB的讲解文档,写得不错。这里面首先是讲解了USB的一些基本知识,如果全部懂了的话,那么USB已经算是学得很好了。鼠标改键盘也有,还有关于具体库函数的详解,看完觉得很赞!!!下面有些内容引用自这个文件!!
文件地址:
usb_desc.c: 提供了设备、端点、接口、字符串、群组、制造商描述符(本来想在这里讲解下描述符的,但是描述符在这里的作用不大明显,到USB键盘那块的时候再讲解吧)
问题八:在标准的 USB 请求命令中,经常会看到 Descriptor,这是什么来的呢?
回答八:Descriptor 即描述符,是一个完整的数据结构,可以通过 C 语言等编程实现,并存
储在 USB 设备中,用于描述一个 USB 设备的所有属性,USB 主机是通过一系列命令来要
求设备发送这些信息的。它的作用就是通过如问答节中的命令***作来给主机传递信息,从
而让主机知道设备具有什么功能、属于哪一类设备、要占用多少带宽、使用哪类传输方式及
数据量的大小,只有主机确定了这些信息之后,设备才能真正开始工作,所以描述符也是十
分重要的部分,要好好掌握。标准的描述符有 5 种,USB 为这些描述符定义了编号:
1——设备描述符
2——配置描述符
3——字符描述符
4——接口描述符
5——端点描述符
上面的描述符之间有一定的关系,一个设备只有一个设备描述符,而一个设备描述符可以包
含多个配置描述符,而一个配置描述符可以包含多个接口描述符,一个接口使用了几个端点,
就有几个端点描述符。这间描述符是用一定的字段构成的,详细说明见上面文档的10页。
简单理解里面就是USB设备的一些描述,像档案。
usb_prop.c: 提供了 Device_Property(性能),Device_Table &USER_STANDARD_REQUEST(请求)结构描述,这 3 个东西定义于 usb_core.c,摇杆鼠标的一些处理过程
hw_config.c: 提供了实际硬件需要的操作函数,Joystick_Send()通过函数UserToPMABufferCopy 和&&SetEPTxValid 将坐标值发给了 USB 端口。
STM32f10x_it.c:里面有中断处理函数,千万别忽略里面的内容。
usb_core.c:USB 总线数据处理的核心文件,标准协议。
usb_init.c,usb_int.c:用于端点数据输入输入中断处理
usb_mem.c:用于缓冲区操作
usb_regs.c:用于寄存器操作
2.接下来要在main里面配置USB
详细步骤如下:
1.官方例函数Set_System(); 用途:配置好系统时钟等,按键IO口,以及上面我们提到的接通上拉电阻的那个管脚,USB管脚等等,
这个函数根据作用分为以下几个部分:
系统时钟配置部分(可以省略)
开启上拉时钟管脚的时钟,然后配置该管脚,这个管脚(USB_DISCONNECT_PIN)应该找到它定义的地方,将它改为你板子上面对应的管脚,可以用Ctrl+F找,我们找到它所在的地方如下图,因为这里涉及条件编译,所以你需要找到你对应编译部分的全部改掉。我需要将它改成PD3.
如果你的板子上面没有对应的管脚,只有类似下面的一个跳帽,就需要接上跳帽,接上去之后不要管这部分了,跟你都已经没有关系了。
&&/* Enable the USB disconnect GPIO clock */
&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_DISCONNECT, ENABLE);
&&/* USB_DISCONNECT used as USB pull-up */
&&GPIO_InitStructure.GPIO_Pin = USB_DISCONNECT_PIN;
&&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
&&GPIO_Init(USB_DISCONNECT, &GPIO_InitStructure);复制代码配置USB管脚,不知道为什么没有设置USB还是可以工作。
/*Set PA11,12 as IN - USB_DM,DP*/
&&RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
&&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
&&GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
&&GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
&&GPIO_Init(GPIOA, &GPIO_InitStructure);
& &
&&/*SET PA11,12 for USB: USB_DM,DP*/
&&GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_14);
&&GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_14);复制代码配置按键等端口,官方的库是配置摇杆的4个管脚。
&&/*Enable Joystick GPIOs clock*/
&&RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);
&&RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
&&RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE, ENABLE);
&&/*Configure the JoyStick IOs as input floating*/
&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_4 |
& && && && && && && && && && &&&GPIO_Pin_9 | GPIO_Pin_10;
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
&&GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; /*PullDown is mandatory for Joystick pins*/
&&GPIO_Init(GPIOF, &GPIO_InitStructure);
&&/*Configure the JoyStick IOs as input floating*/
&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_5;& && && && && && &
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
&&GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; /*PullDown is mandatory for Joystick pins*/
&&GPIO_Init(GPIOB, &GPIO_InitStructure);
&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;&&
&&GPIO_Init(GPIOF, &GPIO_InitStructure);
&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;&&
&&GPIO_Init(GPIOE, &GPIO_InitStructure);
复制代码配置USB中断向量,USB传输数据过程需要中断,这个是重中之重,你可以不设置上面其他的东西,但是这个必须设置,别人就会出现,后面自己设置这个,可能多次出现这个,很大原因是中断设置的问题。
&&EXTI_ClearITPendingBit(EXTI_Line18);
&&EXTI_InitStructure.EXTI_Line = EXTI_Line18;
&&EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_R
&&EXTI_InitStructure.EXTI_LineCmd = ENABLE;
&&EXTI_Init(&EXTI_InitStructure);复制代码
上面几个步骤直接简化USB中断向量的设置,所以我在我的程序屏蔽了这个官方函数,直接自己写个,然后放在配置的最前面。
EXTI_InitTypeDef EXTI_InitS
void USB_IT_Config(void)
{
& && &&&EXTI_ClearITPendingBit(EXTI_Line18);
&&EXTI_InitStructure.EXTI_Line = EXTI_Line18;
&&EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_R
&&EXTI_InitStructure.EXTI_LineCmd = ENABLE;
&&EXTI_Init(&EXTI_InitStructure);
}复制代码2.官方例函数USB_Interrupts_Config();&&作用:初始化USB中断,更准确的解释是:开启USB唤醒中断和USB低优先级数据处理中断
3.官方例函数Set_USBClock()& && & 作用:开启USB时钟,更准确的解释是:配置USB 时钟,也就是从72M 的主频得到48M的USB 时钟(1.5 分频)
4.官方例函数USB_Init();& && && &作用:USB硬件初始化,更准确的解释是:用于初始化USB,最主要的就是调用了Joystick_init函数,开启了USB部分的电源等
这里面有个很重要的东西要说下
void USB_Init(void)
{
&&pInformation = &Device_I
&&pInformation-&ControlState = 2;
&&pProperty = &Device_P
&&pUser_Standard_Requests = &User_Standard_R
&&/* Initialize devices one by one */
&&pProperty-&Init();
}复制代码&Device_Property是跟pProperty 一样的类型的结构体指针,结构体类型定义如下,不看也可以
typedef struct _DEVICE_PROP
{
&&void (*Init)(void);& && &&&/* Initialize the device */
&&void (*Reset)(void);& && & /* Reset routine of this device */
&&/* Device dependent process after the status stage */
&&void (*Process_Status_IN)(void);
&&void (*Process_Status_OUT)(void);
&&/* Procedure of process on setup stage of a class specified request with data stage */
&&/* All class specified requests with data stage are processed in Class_Data_Setup
& &Class_Data_Setup()
& & responses to check all special requests and fills ENDPOINT_INFO
& & according to the request
& & If IN tokens are expected, then wLength & wOffset will be filled
& & with the total transferring bytes and the starting position
& & If OUT tokens are expected, then rLength & rOffset will be filled
& & with the total expected bytes and the starting position in the buffer
& & If the request is valid, Class_Data_Setup returns SUCCESS, else UNSUPPORT
& &CAUTION:
& & Since GET_CONFIGURATION & GET_INTERFACE are highly related to
& & the individual classes, they will be checked and processed here.
&&*/
&&RESULT (*Class_Data_Setup)(uint8_t RequestNo);
&&/* Procedure of process on setup stage of a class specified request without data stage */
&&/* All class specified requests without data stage are processed in Class_NoData_Setup
& &Class_NoData_Setup
& & responses to check all special requests and perform the request
& &CAUTION:
& & Since SET_CONFIGURATION & SET_INTERFACE are highly related to
& & the individual classes, they will be checked and processed here.
&&*/
&&RESULT (*Class_NoData_Setup)(uint8_t RequestNo);
&&/*Class_Get_Interface_Setting
& &This function is used by the file usb_core.c to test if the selected Interface
& &and Alternate Setting (uint8_t Interface, uint8_t AlternateSetting) are supported by
& &the application.
& &This function is writing by user. It should return &SUCCESS& if the Interface
& &and Alternate Setting are supported by the application or &UNSUPPORT& if they
& &are not supported. */
&&RESULT&&(*Class_Get_Interface_Setting)(uint8_t Interface, uint8_t AlternateSetting);
&&uint8_t* (*GetDeviceDescriptor)(uint16_t Length);
&&uint8_t* (*GetConfigDescriptor)(uint16_t Length);
&&uint8_t* (*GetStringDescriptor)(uint16_t Length);
&&/* This field is not used in current library version. It is kept only for
& &compatibility with previous versions */
&&void* RxEP_
& &
&&uint8_t MaxPacketS
}DEVICE_PROP;
复制代码Device_Property这个结构体里面有多个我们已经定义好的函数,如下:
DEVICE_PROP Device_Property =
&&{
& & Joystick_init,
& & Joystick_Reset,
& & Joystick_Status_In,
& & Joystick_Status_Out,
& & Joystick_Data_Setup,
& & Joystick_NoData_Setup,
& & Joystick_Get_Interface_Setting,
& & Joystick_GetDeviceDescriptor,
& & Joystick_GetConfigDescriptor,
& & Joystick_GetStringDescriptor,
& & 0,
& & 0x40 /*MAX PACKET SIZE*/
&&};复制代码在语句pProperty = &Device_P 和 pProperty-&Init();之后,就运行了这个函数Joystick_init,里面有再看PowerOn,里面又有USB_Cable_Config(ENABLE);好不容易找到我们想要的函数。这个就是断开和连接上拉电阻的函数,前面我们只是打开时钟和配置这个管脚而已,同样的他对应的管脚是USB_DISCONNECT和USB_DISCONNECT_PIN,前面如果将这两个改了,就不要改了。
/*******************************************************************************
* Function Name&&: USB_Cable_Config.
* Description& & : Software Connection/Disconnection of USB Cable.
* Input& && && & : NewState: new state.
* Output& && && &: None.
* Return& && && &: None
*******************************************************************************/
void USB_Cable_Config (FunctionalState NewState)
{
#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS)
&&if (NewState != DISABLE)
&&{
& & STM32L15_USB_CONNECT;
&&}
&&else
&&{
& & STM32L15_USB_DISCONNECT;
&&}&&
& &
#else
&&if (NewState != DISABLE)
&&{
& & GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);
&&}
&&else
&&{
& & GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);
&&}
#endif /* STM32L1XX_MD */
}复制代码这样子很麻烦,我就自己写了个函数USB_Power_On();//给上拉电阻的三极管导通,我觉得这个是最重要的,如果你上拉电阻都没有连接上去,那还谈什么其他的。
要让你的电脑识别这是个鼠标的话,还需要配置中端函数,官方函数写在stm32_it.c这个文件里面,这个也是重点,我找了很久才知道在中断函数里面还有这样子的东西,相关代码如下:
/******************************************************************************/
/*& && && && &STM32 Peripherals Interrupt Handlers& && && && && && && && && & */
/*******************************************************************************
* Function Name&&: USB_IRQHandler
* Description& & : This function handles USB Low Priority interrupts
*& && && && && && &requests.
* Input& && && & : None
* Output& && && &: None
* Return& && && &: None
*******************************************************************************/
#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS) || defined(STM32F37X)
void USB_LP_IRQHandler(void)
#else
void USB_LP_CAN1_RX0_IRQHandler(void)
#endif
{
&&USB_Istr();
}
#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS)
/*******************************************************************************
* Function Name&&: USB_FS_WKUP_IRQHandler
* Description& & : This function handles USB WakeUp interrupt request.
* Input& && && & : None
* Output& && && &: None
* Return& && && &: None
*******************************************************************************/
void USB_FS_WKUP_IRQHandler(void)
{
&&EXTI_ClearITPendingBit(EXTI_Line18);
}
#endif
/*******************************************************************************
* Function Name&&: EXTI_IRQHandler
* Description& & : This function handles External lines&&interrupt request.
* Input& && && & : None
* Output& && && &: None
* Return& && && &: None
*******************************************************************************/
#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS)
void EXTI0_IRQHandler(void)
#elif defined (STM32F37X)
void EXTI2_TS_IRQHandler(void)
#else
void EXTI9_5_IRQHandler(void)
#endif
{
&&if (EXTI_GetITStatus(KEY_BUTTON_EXTI_LINE) != RESET)
&&{
& & /* Check if the remote wakeup feature is enabled (it could be disabled
& && &&&by the host through ClearFeature request) */
& & if (pInformation-&Current_Feature & 0x20)
& & {& && &
& && &pInformation-&Current_Feature &= ~0x20;&&
& && &/* Exit low power mode and re-configure clocks */
& && &Resume(RESUME_INTERNAL);
& & }
&&
& & /* Clear the EXTI line pending bit */
& & EXTI_ClearITPendingBit(KEY_BUTTON_EXTI_LINE);
&&}
}
/*******************************************************************************
* Function Name&&: USBWakeUp_IRQHandler
* Description& & : This function handles USB WakeUp interrupt request.
* Input& && && & : None
* Output& && && &: None
* Return& && && &: None
*******************************************************************************/
void USBWakeUp_IRQHandler(void)
{
&&EXTI_ClearITPendingBit(EXTI_Line18);
}
复制代码我将他们移植到我的stm32f10x_it.c文件里面,实际代码如下:
/*******************************************************************************
* Function Name&&: USBWakeUp_IRQHandler
* Description& & : This function handles USB WakeUp interrupt request.
* Input& && && & : None
* Output& && && &: None
* Return& && && &: None
*******************************************************************************/
void USBWakeUp_IRQHandler(void)
{
&&EXTI_ClearITPendingBit(EXTI_Line18);
}
/*******************************************************************************
* Function Name&&: USB_IRQHandler
* Description& & : This function handles USB Low Priority interrupts
*& && && && && && &requests.
* Input& && && & : None
* Output& && && &: None
* Return& && && &: None
*******************************************************************************/
void USB_LP_CAN1_RX0_IRQHandler(void)
{
&&USB_Istr();
}复制代码上面的东西移植好了的话,成功的话你会发现在你的电脑上多了一个鼠标设备。其实这个过程远远没有我上面描述的那么简单,上面只是几个小问题而已,你会遇到很多文件编译的问题,慢慢解决吧。怎么说呢?编译的问题很多,我不想写出来,留给大家慢慢去学习下怎么移植程序吧,部分问题可以看下这个帖子:
3.真正控制鼠标
实际要控制鼠标还要看死循环里面的这些函数
& & if (bDeviceState == CONFIGURED)
& & {
& && &if ((JoyState() != 0) && (PrevXferComplete))
& && &{
& && &&&Joystick_Send(JoyState());
& && &}
& & }复制代码主要是Joystick_Send(JoyState());这个函数,JoyState获取摇杆的动作之后发给Joystick_Send进行处理,CURSOR_STEP是鼠标移动的距离,这个过程简单地说就是需要单片机要发送一些东西给电脑,什么东西呢?Mouse_Buffer[4] 里面的东西,这四个元素分别作用是:Mouse_Buffer[0]的D0就是左键,D1就是右键,D2是中键,Mouse_Buffer[1]为x轴,你发送个负数鼠标就左移相应的距离,正数右移,Mouse_Buffer[2]为y轴,Mouse_Buffer[3为滚轮。由这些解释我们可以知道Joystick_Send这个函数就是先判断遥感的方向,然后发送相应的键值过去罢了。左右按键可以看下我之前遇到的一个问题,你会对这部分有更深的理解,后面有我的解释。
请教在设计USB键盘的时候怎么才能达到一直按下的效果:
void Joystick_Send(uint8_t Keys)
{
&&uint8_t Mouse_Buffer[4] = {0, 0, 0, 0};
&&int8_t X = 0, Y = 0;
&&
&&switch (Keys)
&&{
& & case JOY_LEFT:
& && &X -= CURSOR_STEP;
& && &
& & case JOY_RIGHT:
& && &X += CURSOR_STEP;
& && &
& & case JOY_UP:
& && &Y -= CURSOR_STEP;
& && &
& & case JOY_DOWN:
& && &Y += CURSOR_STEP;
& && &
& & default:
& && &
&&}
&&/* prepare buffer to send */
&&Mouse_Buffer[1] = X;
&&Mouse_Buffer[2] = Y;
&&
&&/* Reset the control token to inform upper layer that a transfer is ongoing */
&&PrevXferComplete = 0;
&&
&&/* Copy mouse position info in ENDP1 Tx Packet Memory Area*/
&&USB_SIL_Write(EP1_IN, Mouse_Buffer, 4);
&&
&&/* Enable endpoint for transmission */
&&SetEPTxValid(ENDP1);
}
复制代码鼠标的移植到这里就结束了。如果你是野火ISO的板子,那么下载我的工程下去后,按下KEY1鼠标左移,KEY2鼠标右移。
工程地址:
STM32-USB键盘移植放上一个山寨的电脑遥感飞车的视频,使用的就是USB键盘的原理。
被山寨的作品的帖子:成本:
目前成本:100块
元件清单:STM32最小系统+MPU6050+几根杜邦线+USB线
成本最低可降至:40块。
最低成本元件清单:2元STC12单片机+25元USB模块(可能可以降至更低,自己做的话)+MPU6050(最低10块),可能企业生产的话会便宜很多。
涉及的软硬件知识:
1.USB通讯协议,用来模拟键盘用,这个最坑
2.I2C通讯协议,用来获取MPU6050数据用
3.MPU6050的使用
4.STM32单片机的使用
5.串口方面的东西,用来调试MPU6050输出数据
项目细节介绍:
1.下面这两句是精华,可以看一个文档,就知道这里面的奥秘,从获取的各轴加速度大概算出MPU6050的姿态。高中物理知识啊!!
& && &&&Roll =&&(((atan2(temp1[2],temp1[0])*180)/3.1416)-90); //x轴角度
& && &&&Pitch = (((atan2(temp1[2],temp1[1])*180)/3.1416)-90); //y轴角度复制代码
2.MPU6050可以看这个我发的帖子:
放上工程文件: ,板子是野火ISO。
怎么将上面的鼠标改成键盘呢?鼠标和键盘在程序上的区别是什么?总体上来说,两者都是HID设备,很大部分都是一样,所以程序很大部分一样。不一样就是鼠标是鼠标,键盘是键盘,细节的东西不一样。可以参见两篇帖子,一篇是上面的飞车
一篇是圈圈的:
有人将其内容整理成文档,地址如下:
不过一开始读他们的帖子感觉还是很难懂。设备描述符可以结合上面的那个USB基础知识去看,多少页?都说是10页那里了。^__^这些比较繁琐,而且都有这么多资料了,大就慢慢看吧
按下某个键就相当于在按照相应的格式发送相应键的值过去,这些键的值就在这个文档里面,HID键盘代码:
本帖子中包含更多资源
才可以下载或查看,没有帐号?
&USB源代码分析(很详细的)http://pan.baidu.com/s/1o6mbbyq&
这个链接已经挂掉了,楼主看到处理下? ...
在这里,云盘真烦!!
本帖子中包含更多资源
才可以下载或查看,没有帐号?
正需要,端午有要用到
正需要,端午有要用到
希望能对你们有帮助
大神来支持啦
大神来支持啦
我不是大神。。。。。。。。。。见笑了
感谢分享精神,这种精神带动每一个人乐于分享,造成论坛良好氛围,人人为我,我为人人。。。。
顶顶顶顶,学习了啊
感谢分享精神,这种精神带动每一个人乐于分享,造成论坛良好氛围,人人为我,我为人人。。。。 ...
那楼主是不是有空也发几个技术贴啊?
那楼主是不是有空也发几个技术贴啊?
我经常发的,你这帖子还没来得及细看呢
前排留名.....
不小心点了发表233
楼主造福大众啊
总结的挺好!
支持分享!
感谢分享& && && && &&&
好东西,谢谢
非常好的帖子,保存了。
写的很是详细尼!!学习中!!
最近正想上手stm32,感谢分享收藏了,
请教LZ一个问题。 我自定义HID 。 MCU 会收到主机IN信号。然后发送64个字节 00. 我想做到只有PC 软件发送数据的时候,MCU才可以使能IN信号。 有没有好办法解决这个问题。
请教LZ一个问题。 我自定义HID 。 MCU 会收到主机IN信号。然后发送64个字节 00. 我想做到只有PC 软件发送数 ...
不好意思 ,我都没有自定义过HID,我的USB水平还是很有限的。
顶顶,。& &
非常感谢,我要认真拜读啊。mark
学习了& && &
还是挺烦恼的,楼主的资料都是DEVICE的,没有HOST!
顶起,mark
关于USB的知识当然是果断标记了
没真正&&研究过& && && &&&
为LZ的热心叫好!
还是挺烦恼的,楼主的资料都是DEVICE的,没有HOST!
host没有研究过,host用来做什么用的?一般都只用设备就好啦。
一片M8加一片mpu6050应该成本更低。
写的很详细不错!
写的很详细不错!
不错,有空看看
已经收藏,慢慢研究
谢谢楼主分享,赶紧来学习一下!
如此好贴,楼主的精神很好,写的很棒。
谢谢楼主分享,总结的很出色,期待来飞思卡尔讨论区分享USB知识!
谢谢楼主分享,总结的很出色,期待来飞思卡尔讨论区分享USB知识!
没有用过,不过原理应该都是相通的。
路过支持一下
没有用过,不过原理应该都是相通的。
是的,通信过程遵循USB协议规定的步骤,只是落实具体MCU的处理过程有些差别。
期待楼主更多关于USB学习资料。
刚看完,欣赏楼主的态度,消化消化。
这个要顶一下以后学习用
正要用,MARK
MARK& && && && && && && && && && && && && && && && && && &
文章很棒,但往往过一段时间,百度盘的一下链接容易失效,到时帖子就不完整了。
文章很棒,但往往过一段时间,百度盘的一下链接容易失效,到时帖子就不完整了。 ...
没有办法啊,阿莫论坛上传东西太慢了,靠!!!!!!!!!!!!!!!!
一直在模仿,从未成功过& && && &&&
标记一下,
一直在模仿,从未成功过
本帖子中包含更多资源
才可以下载或查看,没有帐号?
收藏学习了
本帖最后由 yzb1019 于
19:11 编辑
刚刚开始学习USB,正好赶上了.哈哈,搞不懂车的原理,但是会开车就好,这句话周航慈的嵌入式那本书里有哦。
感谢楼主的无私奉献精神
mark& && && && && && && && && && && && && && && && && && && && && && && && &
good 学习学习!
很不错,学习学习。
没有办法啊,阿莫论坛上传东西太慢了,靠!!!!!!!!!!!!!!!! ...
&USB源代码分析(很详细的)&
这个链接已经挂掉了,楼主看到处理下?
好帖子, MARK
学习学习!可能会用到!!
楼主此乃用心良苦。非常感谢分享,暂时没用到。
mark ,顶一下
h很好的东西,顶!
以后可能用得上
很好,收藏回家慢慢看
很好,收藏回家慢慢看
好贴&&仔细学习中&&mark
这个是好贴,留名,谢谢!
很详细,谢谢!mark& && && && && && && && && && && && && && && && && && && &
mark,谢谢楼主分享
必须要写一个记号,此文档为初学而生。
usb 留个记号& && &&&
mark,标记。。。
好资料,谢谢分享
感谢楼主分享,谢谢
楼主费心了
mark下,想学USB,结果开头一半就停下了
这个一定要收藏好
收藏,准备要着手USB
额,同学也买了圈圈的开发板来学习USB,很不错
晚上回家看看
收藏一下!
顶顶顶顶,学习了啊
我擦,火速留名啊
mark mark and mark
很好很详细的资料~~~
学习一下,
这个必须得收藏啊
阿莫电子论坛, 原"中国电子开发网"
, 原www.ourdev.cn, 原www.ouravr.com

我要回帖

更多关于 无奈 车已到站 的文章

 

随机推荐