完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
根据使用的OTG模块来选择PHY
比如F4里有两个OTG,一个是高速(HS,左边),一个是全速(FS,右边),当使用高速(HS)的时候,如果没有外接高速芯片而使用内部PHY时,实际上需要在HS中配置为FS。若使用OTG_FS则直接配置为FS即可。 (1)在HS中使用FS,首先在Keil“魔术棒”的“C/C++”中“define”一栏添加宏定义 (2)直接使用OTG_FS的话只添加“USE_USB_OTG_FS”即可。 3.更改USB_bsp.c文件 (1)初始化函数 void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE); /* Configure SOF ID DM DP Pins */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_OTG2_FS) ; GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_OTG2_FS) ; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_OTG_HS, ENABLE) ; } 这里使用的HS+内置PHY,所以使用GPIO_AF_OTG2_FS的复用,这个AF复用就代表在HS配置FS,固件库里的描述: #define GPIO_AF_OTG2_FS GPIO_AF_OTG_HS_FS #define GPIO_AF_OTG_HS_FS ((uint8_t)0xC) /* OTG HS configured in FS, Alternate Function mapping */ 另外,由于没有使用VBUS,所以初始化函数里没有配置,并且还有同时去u***_conf.h把使能VBUS的宏注释掉 u***_conf.h: /****************** USB OTG MISC CONFIGURATION ********************************/ //没用到VBUS,所以禁止检测VBUS上面的电压 //#define VBUS_SENSING_ENABLED (2)中断向量配置 void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); #ifdef USE_USB_OTG_HS NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_IRQn; #else NVIC_InitStructure.NVIC_IRQChannel = OTG_FS_IRQn; #endif NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 10; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); #ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_EP1_OUT_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 11; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_EP1_IN_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 11; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); #endif } 这里根据不同PHY的选择定义了不同的中断 4.usdb_usr.c 根据u***_bsp.c配置的中断来定义中断回调函数即可 5.其他 //声明全局变量 __ALIGN_BEGIN USB_OTG_CORE_HANDLE USB_OTG_dev __ALIGN_END ; //初始化函数 USBD_Init(&USB_OTG_dev, USB_OTG_HS_CORE_ID,//根据PHY来设置 &USR_desc, &USBD_CDC_cb, &USR_cb); 遇到的坑:USBOTG要求使用48m的主频,但是单片机的主频分频率不符合要求,一直显示无法识别设备标识符,因此在system_f4xx.c那个文件里把主频改成96MHz,然后再进行2分频: uint32_t SystemCoreClock = 96000000; #define PLL_N 192 /* 96*2 */ /* SYSCLK = PLL_VCO / PLL_P */ #define PLL_P 2 /* PLLP = 2, 4, 6, or 8 */ |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 22:55 , Processed in 0.982848 second(s), Total 50, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号