OTG -- STM32F407 OTG ID/VBUS/SOF引脚说明(四)

目录

前沿

1 ID引脚

1.1 ID引脚作为普通GPIO使用

1.2 ID引脚作为OTG引脚使用

2 VBUS引脚

2.1 VBUS引脚作为普通GPIO使用

2.2 VBUS引脚作为OTG引脚使用

3 SOF引脚

3.1 SOF引脚作为普通GPIO使用

3.2 SOF引脚作为OTG引脚使用


前沿

前段时间在某宝购买了一块STM32F407 OTG所有引脚都引出来的板子,针对这块板子,测试了除了USBDP、USBDM和ULPI引脚之外的引脚,包括ID、SOF、VBUS引脚,这些引脚既可以空闲出来作为其他GPIO使用,也可以通过这些引脚来控制OTG的状态,下面就讲讲如何使用ID、SOF、VBUS这些引脚。

这里只针对OTG FS模块Device进行讲解,OTG HS模块类似。

1 ID引脚

OTG ID引脚可以作为区分主机或者从机的标志,当ID引脚拉高或者悬空的时候,OTG被识别为设备模式,当ID引脚拉低的时候,OTG被识别为主机模式。

当然STM32F407 OTG模块也能把ID引脚空闲出来,使ID引脚可以作为普通的GPIO使用。

1.1 ID引脚作为普通GPIO使用

查看用户手册,OTG_FS_GUSBCFG寄存器的FDMOD位置1,OTG_ID引脚就可以用作普通的GPIO了。

反应到代码的处,如下图所示:

1.2 ID引脚作为OTG引脚使用

OTG_FS_GUSBCFG寄存器的FDMOD位清零,OTG_ID引脚必须用作OTG信号引脚,并且OTG_ID拉高或悬空,为设备模式,OTG_ID拉低,为主机模式

<
### STM32F405 OTG USB On-The-Go Implementation and Configuration STM32F405 微控制器具备强大的USB OTG (On-The-Go) 功能,允许设备既作为主机又可以作为外设工作。为了实现这一特性,在硬件设计上,PA9 被连接到 USB OTG 芯片的 OUT 端,并且有一个 4.7 μF 的电容与此线路并联[^1]。 对于软件配置方面,初始化过程涉及到多个层次的支持库调用以及中断处理函数设置。具体来说: #### 初始化 MSP 支持包 ```c void HAL_MspInit(void) { /* Enable SYSCFG Clock */ __HAL_RCC_SYSCFG_CLK_ENABLE(); /* Enable Power Interface Clock */ __HAL_RCC_PWR_CLK_ENABLE(); } ``` 这段代码展示了如何通过启用必要的时钟来准备系统级服务,这是任何外设操作前的基础步骤之一[^2]。 #### 配置 USB_OTG_FS 外设 针对 USB OTG 接口的具体配置通常会在 `MX_USB_OTG_FS_Init()` 函数中完成。此部分会涉及如下几个重要环节: - **使能相应的 APB 或 AHB 总线时钟** - **重置 USB_OTG 控制器** - **配置 GPIO 引脚用于 D+ 和 D- 数据传输线** - **设定 VBUS 检测机制** - **注册回调函数以便响应不同事件** 下面是一个简化版的例子展示这些概念的应用方式: ```c static void MX_USB_OTG_FS_PCD_Init(void) { RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; GPIO_InitTypeDef GPIO_InitStruct = {0}; // 设置 USB OTG FS 时钟源为 PLLSAI PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART; PeriphClkInitStruct.PLLSAI.PLLSAIN = 192; PeriphClkInitStruct.PLLSAIR = 5; // 48 MHz for USB clock if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct)!= HAL_OK){ Error_Handler(); } // 启用 USB OTG FS 时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); // 配置 PA11/PA12 为 USB_DM/DP GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化 PCD 结构体 hpcd_USB_OTG_FS.Instance = USB_OTG_FS; hpcd_USB_OTG_FS.Init.dev_endpoints = 6; hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL; hpcd_USB_OTG_FS.Init.dma_enable = DISABLE; hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED; hpcd_USB_OTG_FS.Init.Sof_enable = ENABLE; hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE; hpcd_USB_OTG_FS.Init.lpm_enable = DISABLE; if (HAL_PCD_Init(&hpcd_USB_OTG_FS) != HAL_OK) { Error_Handler(); } } ``` 上述代码片段说明了如何正确地启动和配置 STM32F405 上的 USB OTG 功能,确保其能够正常运作于全速模式下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖葫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值