OpenEdv-开源电子网

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

关于void usb_port_set(u8 enable)这个函数

[复制链接]

4

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2015-7-16
在线时间
29 小时
发表于 2015-7-25 16:46:38 | 显示全部楼层 |阅读模式
背景:最近做原子哥的USB例程的时候都会发现用到这个函数,目的是复位后也可以检测到设备。但我发现模拟鼠标这个源码下载到板子后99%不会枚举成功,但USB大容量存储又可以。
现况:我根据八度空间大大的DFU例程自己建了一个工程,只要引用void usb_port_set(u8 enable)这个函数,程序就会跑的特别慢,近乎死机,并且不会枚举成功(因为程序跑太慢达不到协议要求)。但删除后就能正常运行,并且枚举成功。
猜想:可能是这个函数不够完善,在关闭USB模块后,重启USB模块前,PA11,PA12只做了“软断电”处理,没有进行复位,导致在打开USB模块后系统出现异常。
修改:我在打开USB模块前将PA11 PA12进行复位。具体修改如下。

原函数:
[mw_shl_code=c,true]void usb_port_set(u8 enable) { RCC->APB2ENR|=1<<2; //????PORTA?±?? if(enable)_SetCNTR(_GetCNTR()&(~(1<<1)));//???????????? else { _SetCNTR(_GetCNTR()|(1<<1)); // ???????? GPIOA->CRH&=0XFFF00FFF; GPIOA->CRH|=0X00033000; PAout(12)=0; } } [/mw_shl_code]

修改后:
[mw_shl_code=c,true]void usb_port_set(u8 enable) { RCC->APB2ENR|=1<<2; //????PORTA?±?? if(enable) { GPIOA->CRH&=0XFFF00FFF; GPIOA->CRH|=0X00044000; _SetCNTR(_GetCNTR()&(~(1<<1)));//???????????? } else { _SetCNTR(_GetCNTR()|(1<<1)); // ???????? GPIOA->CRH&=0XFFF00FFF; GPIOA->CRH|=0X00033000; PAout(12)=0; } } [/mw_shl_code]
结果:经过修改,原子哥的模拟鼠标例程百分百枚举成功。自己的程序也能正常运行。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-7-23
在线时间
9 小时
发表于 2015-7-27 14:46:10 | 显示全部楼层
你好,我的按你的方法试验,还是会进入硬件fault异常,不能枚举成功。不知道怎么回事啊
回复 支持 反对

使用道具 举报

4

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2015-7-16
在线时间
29 小时
 楼主| 发表于 2015-7-27 14:51:38 | 显示全部楼层
回复【2楼】longfeixue:
---------------------------------
是原子哥的源码么,我用的源码,一开始第一次枚举可能会成功,但以后就会白屏,我看了下原子哥的源码,并没有 HardFault_Handler函数,加了复位后,就百分百能枚举成功了,你会不会是哪里配置错了,方便把源码发上来么。PS,我用的是寄存器的源码,战舰板
回复 支持 反对

使用道具 举报

2

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-7-23
在线时间
9 小时
发表于 2015-7-27 16:32:09 | 显示全部楼层
是的,我把原子哥的程序复制过来,编译通过后下载进入战舰开发板测试的,我也用的寄存器版代码。
回复 支持 反对

使用道具 举报

4

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2015-7-16
在线时间
29 小时
 楼主| 发表于 2015-7-27 16:43:18 | 显示全部楼层
回复【4楼】longfeixue:
---------------------------------
我用的原子哥的代码,什么都没改,直接过编译啊,而且代码中没有HardFault_Handler函数,你会不会把战舰3.0的代码用在了2.0的板子上啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-7-27 22:46:24 | 显示全部楼层
谢谢分享....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-7-23
在线时间
9 小时
发表于 2015-7-28 08:27:53 | 显示全部楼层
回复【5楼】兜兜里缺钱:
---------------------------------
我不太清楚 3.0或2.0的版本,是进入启动文件的汇编语言的异常中了,不适C语言中的。
回复 支持 反对

使用道具 举报

2

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-7-23
在线时间
9 小时
发表于 2015-7-28 09:50:24 | 显示全部楼层
请问你移植过 虚拟串口的例程吗,我实际是想移植一个这样的功能,就先看看原子哥的 触控 USB 鼠标实验,想有个基础了解再做移植。但是现在我搞了一两天,枚举不成功,识别不了,不能安装驱动,不知道怎么回事
回复 支持 反对

使用道具 举报

4

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2015-7-16
在线时间
29 小时
 楼主| 发表于 2015-7-28 11:17:08 | 显示全部楼层
回复【8楼】longfeixue:
---------------------------------
不好意思,没有,我只做过原子哥的例程和DFU,USB虚拟串口在原子哥的V3.0例程里有,你可以参考一下,不过必须要用KEIL 5打开,工程格式改了,KEIL 5一下的版本打不开。

实验48 USB虚拟串口实验.zip

264.28 KB, 下载次数: 647

回复 支持 反对

使用道具 举报

2

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-7-23
在线时间
9 小时
发表于 2015-7-29 08:03:12 | 显示全部楼层
首先非常感谢楼上的帮助,不过我昨天已经解决问题了。经过上网查问题,发现安装不上驱动的原因是win7系统缺少两个文件造成的,按照网上介绍的补齐两个文件后,再插入usb线时 windows updata 就会自动更新驱动了。我原来一直以为是程序移植的有问题,实际程序已经修改正确了。
回复 支持 反对

使用道具 举报

2

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-7-23
在线时间
9 小时
发表于 2015-7-31 09:54:24 | 显示全部楼层
今天又测试了一下这个 触控 USB 鼠标的例程,发现了之前程序全速运行时不能枚举成功设备的原因,应该是主函数中,u8 keysta;  这个没有初始化为0,导致程序刚运行时,还没有枚举成功 USB 人体学设备类,就执行了 Joystick_Send(0,0,0,0);  语句,从而导致进入硬件 fault 异常中断。 
请原子哥 和  兜兜里缺钱  确认一下是不是这个问题?
回复 支持 反对

使用道具 举报

2

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-7-23
在线时间
9 小时
发表于 2015-7-31 09:56:14 | 显示全部楼层
我感觉应该不是 void usb_port_set(u8 enable) 这个函数的问题,原来的程序缺少两句端口默认配置语句,应该不至于导致总是进入硬件 fault 异常的严重问题。
回复 支持 反对

使用道具 举报

4

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2015-7-16
在线时间
29 小时
 楼主| 发表于 2015-7-31 10:22:41 | 显示全部楼层
回复【12楼】longfeixue:
---------------------------------
我是自己配置的寄存器,发现了如果在leave low power()里调用 systeminit(),加不加复位都一样,程序外部时钟不会停止,但我给注释掉了(原子哥的例程也是采用注释处理)。注释掉之后,不加复位处理,外部时钟就会停止,这一点我很不解,因为已经配置过STM32_SYSTEM_CLOCK()了啊。为什么外部时钟还是会停止,跟踪后发现,是在USB_INIT之后停止的。至今没找到更好的解决办法。
回复 支持 反对

使用道具 举报

2

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-7-23
在线时间
9 小时
发表于 2015-7-31 11:54:13 | 显示全部楼层
回复【13楼】兜兜里缺钱:
---------------------------------
Enter_LowPowerMode()  这个函数你是怎么处理的,是不是设置 芯片进入了低功耗模式,那么外部时钟大概会停止。
当未插入 USB 线,设备挂起时会调用此函数,则进入低功耗模式。当插入 USB 线时,设备退出低功耗模式,调用 Leave_LowPowerMode() 函数,此时应该重新设置 系统时钟,即调用 systeminit()函数。
如果程序中,Enter_LowPowerMode() 函数没有调用进入低功耗模式函数,则 Leave_LowPowerMode() 函数中也不用调用 systeminit()函数。
应该是这样的情况吧。
回复 支持 反对

使用道具 举报

4

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2015-7-16
在线时间
29 小时
 楼主| 发表于 2015-7-31 13:08:11 | 显示全部楼层
回复【14楼】longfeixue:
---------------------------------
就是这个情况,函数中没有调用过Enter_LowPowerMode(),所以我和原子哥一样把Leave_LowPowerMode()中的System_init()给注释掉了(因为我是操作寄存器,没用到System_stm32f10x.c),然后就出现了不复位PA11,PA12,外部时钟就会停止,追踪程序发现是在 USB_INIT之后停止的,但这部分代码我没有改过。所以很郁闷。更郁闷的是根据参考手册描述,当使能USB后PA11,P12就只能给USB使用了,根本不需要后续操作,但为什么我只有复位后才能正常使用。
回复 支持 反对

使用道具 举报

2

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-7-23
在线时间
9 小时
发表于 2015-7-31 14:07:38 | 显示全部楼层
回复【15楼】兜兜里缺钱:
---------------------------------
是有些奇怪啊
回复 支持 反对

使用道具 举报

13

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
306
金钱
306
注册时间
2018-3-5
在线时间
70 小时
发表于 2019-8-18 11:26:29 | 显示全部楼层
longfeixue 发表于 2015-7-29 08:03
首先非常感谢楼上的帮助,不过我昨天已经解决问题了。经过上网查问题,发现安装不上驱动的原因是win7系统缺 ...

哪两个文件,方便提供吗
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2020-3-13
在线时间
13 小时
发表于 2020-5-9 09:46:05 | 显示全部楼层
楼主,我按照八度大神的方法在103ZET6上移植了Dfu程序,发现将APP程序第一次烧进去后正常,第二次我想换个app程序,DfuseDemo提示成功,但复位后运行的还是第一次烧进去的APP程序,而不是本次更新的APP程序,麻烦您提示下我可能是哪里的问题’
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-30 13:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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