高级会员

- 积分
- 550
- 金钱
- 550
- 注册时间
- 2017-10-17
- 在线时间
- 119 小时
|
本帖最后由 冯必兴 于 2022-8-25 09:22 编辑
硬件描述:使用的是STM32F429IGT6 的MCU
软件描述:使用的是HAL库
直接在原子哥所提供的f429参考例程进行修改即可。
//USB OTG 底层IO初始化
//pdev:USB OTG内核结构体指针
void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOB_CLK_ENABLE(); //使能GPIOB时钟
__HAL_RCC_USB_OTG_HS_CLK_ENABLE(); //使能OTG HS时钟
//配置PB14 15
GPIO_InitStruct.Pin=GPIO_PIN_14|GPIO_PIN_15; //PB14 PB15
GPIO_InitStruct.Mode=GPIO_MODE_AF_PP; //复用
GPIO_InitStruct.Pull=GPIO_NOPULL; //无上下拉
GPIO_InitStruct.Speed=GPIO_SPEED_HIGH; //高速
GPIO_InitStruct.Alternate=GPIO_AF12_OTG_HS_FS; //复用为OTG_HS_FS
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); //初始化
//GPIO_AF_OTG_FS改成GPIO_AF_OTG_HS_FS
PCF8574_WriteBit(USB_PWR_IO,1); //开启USB HOST电源供电C
}
//USB OTG 中断设置,开启USB FS中断
//pdev:USB OTG内核结构体指针
void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev)
{
HAL_NVIC_SetPriority(OTG_HS_IRQn,0,3); //抢占优先级0,子优先级3
HAL_NVIC_EnableIRQ(OTG_HS_IRQn); //使能OTG USB FS中断
}
还有中断要改的不要忘记:
//USB OTG 中断服务函数
//处理所有USB中断
void OTG_HS_IRQHandler(void)
{
USBD_OTG_ISR_Handler(&USB_OTG_dev);
}
硬件描述:使用的是STM32F429IGT6 的MCU
软件描述:使用的是标准库
void USB_FS_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev)
{
// GPIO_InitTypeDef GPIO_InitStructure;
// RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
// RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, ENABLE);//使能USB OTG时钟 钟
// //GPIOA11,A12设置
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;//PA11/12复用功能输出
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
// GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
// GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
//
// GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_OTG_FS);//PA11,AF10(USB)
// GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_OTG_FS);//PA12,AF10(USB)
/************************标准库*****************************/
GPIO_InitTypeDef GPIO_InitStructure;
//开启按键GPIO口的时钟
RCC_USB_FS_GPIO_CLK_ENABLE(); //使能GPIOA时钟
RCC_USB_OTG_FS_CLK_ENABLE(); //使能OTG FS时钟
GPIO_InitStructure.GPIO_Pin = USB_FS_DM_GPIO_PIN | USB_FS_DP_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; //无上下拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //50Mhz
GPIO_Init(USB_FS_GPIO_PORT, &GPIO_InitStructure); //初始化
//复用为OTG FS
GPIO_PinAFConfig(USB_FS_GPIO_PORT,USB_FS_AF_DM_GPIO_PIN ,GPIO_AF_OTG_FS);
GPIO_PinAFConfig(USB_FS_GPIO_PORT,USB_FS_AF_DP_GPIO_PIN,GPIO_AF_OTG_FS);
/************************HAL库初始化*****************************/
//配置PA11 12
// __HAL_RCC_USB_FS_GPIO_CLK_ENABLE(); //使能GPIOA时钟
// __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); //使能OTG FS时钟
// GPIO_InitStruct.Pin=USB_FS_DM_GPIO_PIN | USB_FS_DP_GPIO_PIN; //PA11 12
// GPIO_InitStruct.Mode=GPIO_MODE_AF_PP; //复用
// GPIO_InitStruct.Pull=GPIO_NOPULL; //无上下拉
// GPIO_InitStruct.Speed=GPIO_SPEED_HIGH; //高速
// GPIO_InitStruct.Alternate=GPIO_AF10_OTG_FS; //复用为OTG FS
// HAL_GPIO_Init(USB_FS_GPIO_PORT, &GPIO_InitStruct); //初始化
}
//配置USB_HS 底层IO初始化
//pdev:USB OTG内核结构体指针
void USB_HS_OTG_BSP_Init(USB_DEV_OTG_CORE_HANDLE *pdev)
{
// GPIO_InitTypeDef GPIO_InitStructure;
// RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOA时钟
// RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_OTG_HS, ENABLE);//使能USB OTG时钟 钟
// //GPIOA11,A12设置
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15;//PA11/12复用功能输出
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
// GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
// GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
//
// GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_OTG_HS_FS);//PA11,AF10(USB)
// GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_OTG_HS_FS);//PA12,AF10(USB)
/************************标准库*****************************/
GPIO_InitTypeDef GPIO_InitStructure;
//开启按键GPIO口的时钟
RCC_USB_HS_GPIO_CLK_ENABLE(); //使能GPIOA时钟
RCC_USB_OTG_HS_CLK_ENABLE(); //使能OTG FS时钟
GPIO_InitStructure.GPIO_Pin = USB_HS_DM_GPIO_PIN | USB_HS_DP_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; //无上下拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //高速
GPIO_Init(USB_HS_GPIO_PORT, &GPIO_InitStructure); //初始化
//复用为OTG FS
GPIO_PinAFConfig(USB_HS_GPIO_PORT,USB_HS_AF_DM_GPIO_PIN ,GPIO_AF_OTG_HS_FS);
GPIO_PinAFConfig(USB_HS_GPIO_PORT,USB_HS_AF_DP_GPIO_PIN,GPIO_AF_OTG_HS_FS);
/************************HAL库初始化*****************************/
// GPIO_InitTypeDef GPIO_InitStruct;
// __HAL_RCC_USB_HS_GPIO_CLK_ENABLE(); //使能GPIOB时钟
// __HAL_RCC_USB_OTG_HS_CLK_ENABLE(); //使能OTG HS时钟
// GPIO_InitStruct.Pin=USB_HS_DM_GPIO_PIN | USB_HS_DP_GPIO_PIN; //PB14 PB15
// GPIO_InitStruct.Mode=GPIO_MODE_AF_PP; //复用
// GPIO_InitStruct.Pull=GPIO_NOPULL; //无上下拉
// GPIO_InitStruct.Speed=GPIO_SPEED_HIGH; //高速
// GPIO_InitStruct.Alternate=GPIO_AF12_OTG_HS_FS; //复用为OTG_HS_FS
// HAL_GPIO_Init(USB_HS_GPIO_PORT, &GPIO_InitStruct); //初始化
// USB_HS_OTG_IO_RESET();
}
/**
* @brief USB_HS_OTG_IO_RESET
* //用于USB热插拔处理,目的是切换模式的时候自动更新驱动扫描
* @param 当USB D+ 的电平从低到高这一个过程会使pc端自动重新跟新驱动
上面由于配置的是GPIO_MODE_AF_PP模式无法实现对IO口电平的控制
故此重新配置一次初始化
* @retval 无
*/
void USB_HS_OTG_IO_RESET()
{
/************************标准库*****************************/
GPIO_InitTypeDef GPIO_InitStructure;
//开启按键GPIO口的时钟
RCC_USB_HS_GPIO_CLK_ENABLE();
//初始化引脚
GPIO_InitStructure.GPIO_Pin= USB_HS_DP_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(USB_HS_GPIO_PORT, &GPIO_InitStructure);
GPIO_WriteBit(USB_HS_GPIO_PORT, USB_HS_DP_GPIO_PIN,Bit_RESET);
delay_ms(20);
GPIO_WriteBit(USB_HS_GPIO_PORT, USB_HS_DP_GPIO_PIN,Bit_SET);
delay_ms(20);
/************************HAL库初始化*****************************/
// GPIO_InitTypeDef GPIO_Initure;
// __HAL_RCC_USB_HS_GPIO_CLK_ENABLE(); //开启GPIOB时钟
// GPIO_Initure.Pin=USB_HS_DP_GPIO_PIN;
// GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
// GPIO_Initure.Pull=GPIO_PULLUP; //上拉
// GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
// HAL_GPIO_Init(USB_HS_GPIO_PORT,&GPIO_Initure);
// HAL_GPIO_WritePin(USB_HS_GPIO_PORT,USB_HS_DM_GPIO_PIN,GPIO_PIN_RESET); //
// delay_ms(20);
// HAL_GPIO_WritePin(USB_HS_GPIO_PORT,USB_HS_DP_GPIO_PIN,GPIO_PIN_SET); //
// delay_ms(20);
}
//USB_FS OTG 中断设置,开启USB FS中断
//pdev:USB OTG内核结构体指针
void USB_FS_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = OTG_FS_IRQn; //FS改成HS
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道
NVIC_Init(&NVIC_InitStructure);//配置
/************************HAL库*****************************/
// HAL_NVIC_SetPriority(OTG_FS_IRQn,0,3); //抢占优先级0,子优先级3
// HAL_NVIC_EnableIRQ(OTG_FS_IRQn); //使能OTG USB FS中断
}
//USB_HS OTG 中断设置,开启USB FS中断
//pdev:USB OTG内核结构体指针
void USB_HS_OTG_BSP_EnableInterrupt(USB_DEV_OTG_CORE_HANDLE *pdev)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_IRQn; //FS改成HS
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;//子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道
NVIC_Init(&NVIC_InitStructure);//配置
/************************HAL库*****************************/
// HAL_NVIC_SetPriority(OTG_HS_IRQn,0,2); //抢占优先级0,子优先级3
// HAL_NVIC_EnableIRQ(OTG_HS_IRQn); //使能OTG USB FS中断
}
头文件定义
/******************HAL库***********************/
//#define __HAL_RCC_USB_FS_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE();
//#define USB_FS_GPIO_PORT GPIOA
//#define USB_FS_DM_GPIO_PIN GPIO_PIN_11 //USB_FS_D-
//#define USB_FS_DP_GPIO_PIN GPIO_PIN_12 //USB_FS_D+
/*****************标准库***********************/
#define RCC_USB_FS_GPIO_CLK_ENABLE() RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE) //使能GPIOA时钟
#define RCC_USB_OTG_FS_CLK_ENABLE() RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, ENABLE)//使能USB HS OTG时钟
#define USB_FS_GPIO_PORT GPIOA
#define USB_FS_DM_GPIO_PIN GPIO_Pin_11 //USB_FS_D-
#define USB_FS_DP_GPIO_PIN GPIO_Pin_12 //USB_FS_D+
#define USB_FS_AF_DM_GPIO_PIN GPIO_PinSource11 //USB_FS_D- 引脚的复用配置
#define USB_FS_AF_DP_GPIO_PIN GPIO_PinSource12 //USB_FS_D+ 引脚的复用配置
/******************HAL库***********************/
//#define __HAL_RCC_USB_HS_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE();
//#define USB_HS_GPIO_PORT GPIOB
//#define USB_HS_DM_GPIO_PIN GPIO_PIN_14 //USB_HS_D-
//#define USB_HS_DP_GPIO_PIN GPIO_PIN_15 //USB_HS_D+
/*****************标准库***********************/
#define RCC_USB_HS_GPIO_CLK_ENABLE() RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE) //使能GPIOB时钟
#define RCC_USB_OTG_HS_CLK_ENABLE() RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_OTG_HS, ENABLE)//使能USB HS OTG时钟
#define USB_HS_GPIO_PORT GPIOB
#define USB_HS_DM_GPIO_PIN GPIO_Pin_14 //USB_HS_D-
#define USB_HS_DP_GPIO_PIN GPIO_Pin_15 //USB_HS_D+
#define USB_HS_AF_DM_GPIO_PIN GPIO_PinSource14 //USB_HS_D- 引脚的复用配置
#define USB_HS_AF_DP_GPIO_PIN GPIO_PinSource15 //USB_HS_D+ 引脚的复用配置
|
|