我正在做一个USB MSC项目,它需要不同的USB记忆棒才能连接到stm32f429.我正在使用HAL库.

有些U盘需要重新启动或重新枚举才能进行文件读写操作.

我想重新启动USB进程,比如断开和连接USB闪存盘,但只使用软件.

我已经try 使用下面的函数重置USB端口,但它没有导致USB枚举.

    static uint8_t  USBMNG_ResetUsbPort(void)
    {
      uint32_t curState = ((USBx_HPRT0 ) & 0x01UL);
      
      if(curState != 0)
      {
        USBx_HPRT0 &= ~(1UL << 12);
      }
      else
      {
        USBx_HPRT0 &= ~(1UL << 12);
        USBx_HPRT0 |= (1UL << 12);
      }
      return 1;
    }


    uint8_t  USBMNG_USBDevDisconnect(void)
    {
      
      /* In case phy is stopped, ensure to ungate and restore the phy CLK */
      USBx_PCGCCTL &= ~(USB_OTG_PCGCCTL_STOPCLK | USB_OTG_PCGCCTL_GATECLK);

      USBx_DEVICE->DCTL |= USB_OTG_DCTL_SDIS;
      return 1;
    }

    uint8_t  USBMNG_USBDevConnect(void)
    {
      /* In case phy is stopped, ensure to ungate and restore the phy CLK */
      USBx_PCGCCTL &= ~(USB_OTG_PCGCCTL_STOPCLK | USB_OTG_PCGCCTL_GATECLK);

      USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_SDIS;
      return 1;
    }

推荐答案

我发现了如何重新计算USB.

Usbh_core.c中的USBH_ReEnumerate函数执行以下工作:

C++相关问答推荐

CC crate 示例不会与C函数链接

单指针和空参数列表之间的函数指针兼容性

标准的C17标准是用括号将参数包装在函数声明中吗

将 typewriter LF打印到Windows终端,而不是隐含的CR+LF

当execvp在C函数中失败时杀死子进程

S将C语言宏定义为自身的目的是什么?(在glibc标题中看到)

为什么双精度d=flt_max+flt_max;在c语言中得到inf的结果

在C语言中,指针指向一个数组

如何在C++中安全地进行浮点运算

使用Open62541向OPCUA服务器发送读请求时内存泄漏

如何将两个uint32_t值交织成一个uint64_t?

带有数组指针的 struct 在print_stack()函数中打印随机数

赋值两侧的后置增量,字符指针

如何解释数组中的*(ptr)和*(ptr+2)?

为什么argc和argv即使在主函数之外也能工作?

函数的typedef是标准 C 语法吗?它与函数指针的typedef有何不同?

Struct 内的数组赋值

使用 _Atomic float 时,MSVC 编译的代码会命中调试断言

无法在线程内用 C 打印?

我该如何处理这个 C 90 代码中的内存泄漏?