打印
[STM32F1]

开启USB功能后,如何彻底关闭以恢复引脚为普通IO口

[复制链接]
1923|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hh312|  楼主 | 2017-1-9 11:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用USB做IAP功能,做了这么个花样:开机时开启USB模块,如果检测到有电脑连接,就进入烧录状态,否则进入APP。也就是说,不管如何,USB模块一定会开启。然后问题来了,进入APP后,USB引脚无法作为普通IO使用。就算关掉USB时钟也不行(我只是根据例子中开启时钟的代码将对应的位设置为0,也不知是否真的关闭了),看例子中的USB初始化代码,一头雾水,没看到什么明显的开启USB功能的代码,也没提供什么特别的函数可供关闭的。用的例子是ST官方的虚拟COM口例子。
沙发
3htech| | 2017-1-9 11:27 | 只看该作者
IO端口需要重新初始化IO功能吧。

使用特权

评论回复
板凳
mmuuss586| | 2017-1-9 13:18 | 只看该作者
IO也初始化下;

USB我没试过,PWM我试过改回普通IO模式就可以了

使用特权

评论回复
地板
hh312|  楼主 | 2017-1-9 15:16 | 只看该作者
已经解决了。关闭USB模块不是常见的“使能”、“禁用”之类的说法,而是“上电”“断电”,例子里有提供断电和上电的函数,但是很奇怪他的初始化过程似乎没有使用到上电的函数。另外,要断电的话,必须先保持USB时钟是开着的,断电后才能关时钟,否则断电仍然失败。
至于IO口的初始化问题,我原来的APP代码中就有这样的初始化语句,应该这两句就足够了吧。反正现在可以了。

        GPIOA->CRH&=0XFFF00FFF;
        GPIOA->CRH|=0X00033000;//PA11 12 推挽输出

使用特权

评论回复
5
yeah200032| | 2017-1-10 09:21 | 只看该作者
这个问题可以换一个思路:
原因:我目前在ST芯片使用网络、USB、串口、做IAP升级。也会遇到这样的问题,曾经网络升级导致APP网络无法使用。
解决:无法恢复普通IO,但是可以重启后自动恢复。我使用的办法是使用备份寄存器保存当前状态,第一次执行为bootloader状态,需要跳转的时候改成重启。然后再次对比备份寄存器状态,因为备份寄存器内容不会丢失。根据内容决定启动时进入应用还是进入bootloader来解决。
结果:很完美解决问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

42

帖子

1

粉丝