最近的工作进展非常不顺利,美标的离心式榨汁机真心不好做,还要做慢加载,Delay了好多天了。
加班回来,目睹STM32那令人相当凌乱的USB库,有种想哭的感觉。前些天跟踪代码在里面跳来跳去,令人头昏眼花。
最后我下定决心,我决定简化库中那些太过复杂的调用,保留主干部分,得到一些简化的函数,以方便理清脉络。
首先来的第一个函数是main()中第一个函数Set_System(),我将其真正重要的主干部分保留,得到Set_System _Mod(),得到的函数如下:
void Set_System_Mod(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能控制上拉电阻管脚的GPIO时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_DISCONNECT, ENABLE);
/* 配置控制上拉电阻管脚为开漏输出 */
GPIO_InitStructure.GPIO_Pin = USB_DISCONNECT_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(USB_DISCONNECT, &GPIO_InitStructure);
/* 配置EXTI18号线连接到USB IP,通过该线唤醒休眠中的USB */
EXTI_ClearITPendingBit(EXTI_Line18);
EXTI_InitStructure.EXTI_Line = EXTI_Line18;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
该函数的作用是初始化控制上拉电阻的管脚,配置EXTI18号线连接到USB IP核(必须配置该EXTI18,不然是无法枚举成功的,这是为什么?应该在于USB设备的唤醒功能。USB唤醒中断在中断向量表中的位置是42。这个中断是在USB设备从暂停模式唤醒时产生,唤醒事件由USB_ISTR寄存器的WKUP位标识。),在这个函数中去掉了PWR,GPIO配置成AIN,和Joystick按键初始化等函数。
现在将该函数代替main()中的Set_System()函数后,我们就可以成功枚举USB设备了。
用户403664 2013-9-12 11:33