STM32 系列芯片的USB类型问题

STM32 系列芯片的USB类型问题

最近STM32芯片自带的USB接口有不同类型的型号,有一个有点问题没有搞懂。
STM32F411CEU6 USB接口是USB_OTG_FS

img

STM32L412KBT6 USB接口是USB_Device

img

我现在需求是 单片机USB接口做从机,有其他主机进行供电;主机是手机等安卓移动端,软件是安卓APP。

这两种USB类型是否都可以做从机, 都可以和主机进行双向USB通讯?

前面那个既可以是USB主机,也可以是USB从机,后面的只能作为USB从机。从你的需求大致分析,应该是两个都可以用。

【以下回答由 GPT 生成】

答案:

对于您的需求,STM32系列芯片的USB接口可以实现单片机和主机之间的双向USB通讯。不过,由于STM32F411CEU6和STM32L412KBT6使用的是不同的USB接口类型,具体实现方式会有所不同。

  1. 对于STM32F411CEU6的USB接口(USB_OTG_FS),您可以通过配置为USB Device来实现单片机作为从机与主机通信。首先,需要在代码中使能USB和相关的引脚,例如PA11和PA12。然后,使用库函数配置USB设备模式,并实现回调函数处理USB传输的数据。

以下是一个示例代码段:

#include "stm32f4xx.h"
#include "usb_device.h"

int main(void)
{
  // 使能USB时钟和引脚
  RCC->AHB2ENR |= RCC_AHB2ENR_OTGFSEN;
  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;

  // 配置引脚为USB功能
  GPIOA->MODER &= ~(GPIO_MODER_MODE11_Msk | GPIO_MODER_MODE12_Msk);
  GPIOA->MODER |= (GPIO_MODER_MODE11_1 | GPIO_MODER_MODE12_1);
  GPIOA->AFR[1] |= (10 << GPIO_AFRH_AFSEL11_Pos) | (10 << GPIO_AFRH_AFSEL12_Pos);

  // 配置为USB Device模式
  MX_USB_DEVICE_Init();

  // 在这里实现USB数据的处理逻辑

  while (1)
  {
    // 执行其他任务
  }
}
  1. 对于STM32L412KBT6的USB接口(USB_Device),您可以通过配置为USB设备模式来实现单片机作为从机与主机通信。同样需要使能USB和相应引脚,例如PA11和PA12,并使用库函数配置USB设备模式和处理USB传输的数据。

以下是一个示例代码段:

#include "stm32l4xx.h"
#include "usbd_desc.h"
#include "usbd_hid.h"

int main(void)
{
  // 使能USB时钟和引脚
  RCC->APB1ENR1 |= RCC_APB1ENR1_USBEN;
  RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN;

  // 配置引脚为USB功能
  GPIOA->MODER &= ~(GPIO_MODER_MODE11_Msk | GPIO_MODER_MODE12_Msk);
  GPIOA->MODER |= (GPIO_MODER_MODE11_1 | GPIO_MODER_MODE12_1);
  GPIOA->AFR[1] |= (10 << GPIO_AFRH_AFSEL11_Pos) | (10 << GPIO_AFRH_AFSEL12_Pos);

  // 配置为USB设备模式
  USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS);
  USBD_RegisterClass(&hUsbDeviceFS, &USBD_HID);
  USBD_Start(&hUsbDeviceFS);

  // 在这里实现USB数据的处理逻辑

  while (1)
  {
    // 执行其他任务
  }
}

需要注意的是,在以上的示例代码中,仅仅是USB接口的部分配置,您还需要根据具体的需求和通信协议来实现USB数据的处理逻辑。

希望以上解决方案能对您有所帮助,如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^