今天看到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 位清零)PA11和PA12 将不再作为其他功能使用,仅供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个双向端点、