stm32f429discovery的USB_HID应用笔记

先上个移植完的工程下载地址:

http://download.csdn.net/detail/u013352158/8212365


刚开始打算在discovery板子上移植USB官方库时候是想用全速模式的,折腾了半天没反应,后来看原理图时发现全速模式的两引脚接到仿真器上去了,没办法只能采用在高速口下配置成全速模式的方法,不过移植起来也算方便,总的来说就三点吧:时钟,IO最后就是把该删的都删了。

文件结构可以看下面这一篇文章,讲的很清楚了,毕竟f4和f1系列USB库差别挺大的,一开始可能无从下手

http://blog.csdn.net/xbl1986/article/details/17577685#comments


首先是预编译指令,有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);

你可能感兴趣的:(stm32f429discovery的USB_HID应用笔记)