STM32 STM32CubeF4 USB CDC操作

STM32 STM32CubeF4 USB CDC operation

我从 STM32CubeF4 为 USB CDC 示例构建了代码。我在 usbd_cdc_if.c 中添加了缺少的 CDC_Receive_FS() 接收代码。 我将它加载到我的 STM32F4 Discovery 中并且它可以工作。在 Tera Term returns 上输入并显示在 Tera Term 上的字符。

我希望这里有人能给我一些关于这个 USB CDC 固件如何工作的知识,具体来说,这是由 USB -D 上的电压发生电平变化时产生的中断驱动的吗和 +D 引脚,或者是否有一个在某处启动的无限 while 循环,它只是在轮询等待一些数据出现? 促使我提出问题的是,我看到可以通过在 main.c 的无限循环中切换 GPIO 引脚的状态来使该板上的 LED 闪烁。但是,对于 USB,main.c 中的 while 循环中根本没有任何内容。那么这个USB CDC固件是如何获取和发送一个字符from/to Tera Term.

这个问题对于这个论坛来说是广泛的,而不是针对特定问题的实际问题。但是,根据一些提示,您可能

  • 阅读 USB 规范,至少了解一些基本概述(从维基百科开始)。 USB 无法通过在软件中设置 GPIO 来工作(请参阅下一点)
  • 阅读STM32F4xx参考手册。这个比较全面。
  • 阅读演示的源代码。这应该可以回答所有问题。
  • 要跟踪执行路径,您应该记住 C 总是从 main() 函数开始,所以这是了解发生了什么的良好开端。 (免责声明:我很清楚,它从启动开始,但这可能会使初学者更加困惑)。

如果你想使用 USB,无论如何你都必须这样做,所以你现在也可以开始使用它。是的,这需要一些时间;毫不奇怪,工程师在开始更大的项目之前已经了解了所有这些。

所有信息均合法且可在网络上免费获得。

是的,USB 很可能是中断驱动的,也可能使用 DMA 传输数据。

我会花2分钟来回答你,而不是教训你。接收是通过中断完成的。非常非常简单,硬件会看到 D+/D- 上的电压变化,并根据初始化函数标记中断。中断调用 HAL_PCD_IRQHandler,它调用 usbd_conf.c 文件中的 USBD_LL_DataInStage。这最终会调用 usbd_cdc.c 文件中的函数 USBD_CDC_DataIn。有你的出发点,但并不简单。要执行您想要的操作,您可能必须停止输出到 UART 并在主循环中处理它。