刚开始打算在discovery板子上移植USB官方库时候是想用全速模式的,折腾了半天没反应,后来看原理图时发现全速模式的两引脚接到仿真器上去了,没办法只能采用在高速口下配置成全速模式的方法,不过移植起来也算方便,总的来说就三点吧:时钟,IO最后就是把该删的都删了。 文件结构可以看下面这一篇**,讲的很清楚了,毕竟f4和f1系列USB库差别挺大的,一开始可能无从下手
首先是预编译指令,有4个:USE_STDPERIPH_DRIVER,STM32F4XX,USE_USB_OTG_HS,USE_EMBEDDED_PHY,前三个不说了应该都看的懂,第四个有两个指令可以选择,USE_ULPI_PHY是正常的高速模式,stm32要使用高速模式必须外扩个USB3300芯片作为高速USB的物理层,这里我们使用片上内置的物理层,所以用的是USE_EMBEDDED_PHY,在高速口下配置成全速模式。 接着是时钟,USB时钟必须为48M,不同板子外接的晶振不一样,官方库里用的是25M的外部晶振,而我们的discovery板子上用的是8M的晶振,需要去system_stm32f4xx.c文件里改下分频系数,下面就是配置成168M主频48M的USB时钟的分频系数,具体的时钟树可以去看数据手册。
- /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
- #define PLL_M 8
- #define PLL_N 336
-
- /* SYSCLK = PLL_VCO / PLL_P */
- #define PLL_P 2
-
- /* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */
- #define PLL_Q 7
之后去app.c里找主函数,主函数很简单,只调用了一个USBD_Init()初始化函数,跟着这个函数去usb_bsp.c文件里把底层IO配置改下,说白了就是配置下DM,DP,VBUS三个引脚,顺便把USB和GPIOB外设时钟打开。
- void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE) ;
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_OTG_HS, ENABLE) ;
-
- GPIO_InitStructure.GPIO_Pin = //GPIO_Pin_12 | //ID
- GPIO_Pin_14 | //DM
- GPIO_Pin_15; //DP
-
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- // GPIO_PinAFConfig(GPIOB,GPIO_PinSource12,GPIO_AF_OTG_HS_FS) ;
- GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_OTG_HS_FS) ;
- GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_OTG_HS_FS) ;
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- }
到这里就接近尾声了,编译一下开始删吧,中断文件里几个外部中断和唤醒中断都可以删了,usbd_usr.c里各种函数内容都删了吧,留着个接口当备胎以后再说,删的没错误了之后把usb_conf.h里下面两条注释掉就算完成了。
// #define USB_OTG_HS_DEDICATED_EP1_ENABLED
// #define USB_OTG_HS_LOW_PWR_MGMT_SUPPORT
最后贴个usb的软断开代码,以后应该会用到的吧:
- USB_OTG_DCTL_TypeDef dctl;
- /*软断开*/
- dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL);
- dctl.b.sftdiscon = 1; //0:正常工作;1:软断开
- USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32);
|