USB学习-虚拟串口

今天看到USB虚拟串口的例子,有一段这样的语句:

USB的配置通过三个函数完成:
USB_Interrupts_Config()Set_USBClock()USB_Init(),第一个函数用于设置USB 唤醒中断和
USB 低优先级数据处理中断, Set_USBClock 函数用于 配置 USB 时钟,也就是从 72M的主频
得到
48M USB时钟(1.5 分频)。最后USB_Init()函数用于初始化USB,最主要的就是调用
Virtual_Com_Port_init 函数,开启了USB部分的电源等。这里需要特别说明的是,USB配置
并没有对
PA11 PA12 这两个 IO口进行设置,是因为,一旦开启了USB电源( USB_CNTR
PDWN 位清零)PA11PA12 将不再作为其他功能使用,仅供USB使用,所以在开启了 USB
电源之后不论你怎么配置这两个 IO口,都是无效的。要在此获取这两个IO口的配置权,则需
要关闭
USB 电源,也就是置位 USB_CNTR PDWN位,我们通过USB_Port_Set函数来禁止/
允许 USB 连接,在复位的时候,先禁止,再允许,这样每次我们按复位电脑都可以识别到USB
鼠标,而不需要我们每次都拔 USB线。

 
里面说通过使用USB_Port_Set 函数禁止允许就可以不需要每次复位都拔USB线,不太理解,查了下寄存器。

函数: 
void USB_Port_Set(u8 enable)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);     
if(enable)_SetCNTR(_GetCNTR()&(~(1<<1)));//退出断电模式
else
{  
SetCNTR(_GetCNTR()|(1<<1));  // 断电模式
GPIOA->CRH&=0XFFF00FFF;
GPIOA->CRH|=0X00033000;
PAout(12)=0;      
}
}  

enable非零时,GetCNTR()&(~(1<<1))其实也就是将USB_CNTR 寄存器的1位置0;如下图为寄存器


0时为对出断电模式,1时进入断电模式。根据这个就可以时USB进入退出断电模式,而且解决了复位重新插拔的问题唉。(退出后最好稍微延时一段时间,让寄存器清除一些标志)


USB功能概述:数据缓冲区、每个端点最大512字节,最多16个单向或8个双向端点、

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值