USB学习-虚拟串口

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yongwenn163/article/details/68947335

今天看到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个双向端点、

没有更多推荐了,返回首页