STM32 STM32CubeF4 USB CDC操作

5
我从STM32CubeF4的USB CDC示例代码中构建了代码。我在usbd_cdc_if.c中添加了CDC_Receive_FS()的缺失接收代码。我将它加载到我的STM32F4发现板上,它能够工作。在Tera Term上键入一个字符后,该字符会返回并显示在Tera Term上。
我希望这里有人能够给我一些关于USB CDC固件如何工作的知识,具体地说,这是否是由在USB -D和+D引脚上电压变化时产生的中断驱动的,还是在某个地方启动了一个无限循环,并且正在轮询等待出现一些数据?
我提出这个问题的原因是,我看到可以通过在main.c中的无限循环内切换GPIO引脚的状态来闪烁此板上的LED。然而,在main.c中这个无限循环中没有任何关于USB的内容。那么,USB CDC固件如何从/向Tera Term获取和发送字符呢?
2个回答

7

我将花2分钟回答你,而不是讲课。接收是通过中断完成的。非常简单地说,硬件看到D+/D-上的电压变化并根据初始化函数标志中断。中断调用HAL_PCD_IRQHandler,后者调用usbd_conf.c文件中的USBD_LL_DataInStage。这最终会调用usbd_cdc.c文件中的USBD_CDC_DataIn函数。这是你的起点,但并不简单。为了实现你想要的功能,你可能需要停止向UART输出并在主循环中处理它。


非常棒,非常感谢,这正是我一直在寻找的起点。由于USB的复杂性,我无法看到或找到这个起点。顺便说一下,RS-232是我成长过程中接触的。 - Richard
这显然不仅仅是在线路上进行“电压变化”那么简单。整个串行传输栈都涉及到了。虽然如此,你得到了你所要求的,并且有些人可能更喜欢对于复杂系统的简单答案。建议阅读文档并逐步深入软件堆栈绝对不是辅导,但总体而言是一个很好的回应。对于一个复杂的系统来说,更是如此。 - too honest for this site

2
这个问题对于这个论坛来说过于宽泛,也不是一个具体问题。然而,作为一些提示,你可能需要:
  • 阅读USB规范,至少要有一些基本概述(可以从维基百科开始)。USB不是通过在软件中切换GPIO来工作的(见下一点)。
  • 阅读STM32F4xx参考手册。这是相当全面的。
  • 阅读演示源代码。这应该能回答所有问题。
  • 要跟踪执行路径,您应该记住C始终从main()函数开始,所以这是一个很好的起点,看看发生了什么。(免责声明:我知道它实际上是从启动开始的,但这可能会更加困惑初学者)。

如果你想使用USB,你将不得不做所有这些事情,所以你现在可以开始。是的,这需要一些时间;毫不奇怪,工程师在开始大型项目之前已经学习了多年。

所有信息都可以在网上合法免费获取。

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


1
我只是想让有经验的人把手指放在开始的那个特定代码上。在main.c中,我看到MX_USB_DEVICE_Init,然后我跟随它看到USBD_Start,继而我看到USBD_LL_Start,然后我跟随它看到HAL_PCD_Start,最后我看到USB_DevConnect,并注释说它启动了USB OTG设备。 - Richard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接