打印
[STM32F4]

【转】stm32f429discovery的USB_HID应用笔记

[复制链接]
717|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主


刚开始打算在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);  

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

81

帖子

1

粉丝