STM32F0实战:基于HAL库开发【4.7】
21.3.8 同步传输USB标准定义了一种全速的需要保持固定和精确数据传输率的传输方式同步传输。同步传输一般用于传输音频流、压缩的视频流等对数据传输率有严格要求的数据。一个端点如果在枚举时被定义为“同步端点”USB主机则会为每个帧分配固定的带宽并且保证每个帧正好传送一个IN分组或者OUT分组。为了满足带宽需求同步传输中没有出错重传在发送或接收数据分组之后无握手协议即不会发送ACK分组。同样同步传输只传送PID为DATA0的数据包而不会使用数据翻转机制。通过设置USB_EpnR寄存器EP_TYPE为“10”可以将端点设置为同步端点。同步端点没有握手机制USB_EpnR寄存器的STAT_RX位和STAT_TX位分别只能设成“00”禁止和“11”有效。同步传输通过实现双缓冲机制来简化软件应用程序开发它同样使用两个缓冲区以确保在USB模块使用其中一块缓冲区时应用程序可以访问另外一块缓冲区。USB模块使用的缓冲区根据不同的传输方向由不同的DTOG位来标识。同一寄存器中的DTOG_RX位用来标识接收同步端点DTOG_TX位用来标识发送同步端点具体详见表21-8。表21-8 同步端点的缓冲区使用标识与双缓冲批量端点一样一个USB_EpnR寄存器只能处理同步端点单方向的数据传输如果要求同步端点在两个传输方向上都有效则需要使用两个USB_EpnR寄存器。应用程序需要根据首次传输的数据分组来初始化DTOG位它的取值还需要考虑到DTOG_RX或DTOG_TX两位的数据翻转特性。每次传输完成时USB_EpnR寄存器的CTR_RX位或CTR_TX位置位。与此同时相关的DTOG位由硬件翻转从而使得交换缓冲区的操作完全独立于应用程序。传输结束时STAT_RX或STAT_TX位不会发生变化因为同步传输没有握手机制所以不需要任何流量控制而一直设为“11”有效。同步传输中即使OUT分组发生CRC错误或者缓冲区溢出本次传输仍被看作正确的并且可以触发CTR_RX中断事件但是发生CRC错误时硬件会设置USB_ISTR寄存器的ERR位提醒应用程序数据可能损坏。21.3.9 挂起/恢复事件USB标准中定义了一种特殊的设备状态即挂起状态在这种状态下USB总线上的平均电流消耗不超过500μA。这种电流限制对于由总线供电的USB设备至关重要而自供电的设备则不需要严格遵守这样的电流消耗限制。USB主机以3ms内不发送任何信号作为标志进入挂起状态。通常情况下USB主机每毫秒会发送一个SOF当USB模块检测到3个连续的SOF分组丢失事件时即可判定主机发出了挂起请求接着它会置位USB_ISTR寄存器的SUSP位以触发挂起中断。编程向导 USB模块进入挂起状态1将USB_CNTR寄存器的FSUSP置位这将使USB模块进入挂起状态USB模块一旦进入挂起状态对SOF的检测立刻停止以避免在USB挂起时又发生新的SUSP事件。2将USB_CNTR寄存器的LP_MODE位置位这将消除模拟USB收发器的静态电流消耗但仍能检测到唤醒信号。3消除或减少USB模块以外的其他模块的静态电流消耗。4可以选择关闭外部振荡器和设备的PLL以停止设备内部的任何活动。USB设备进入挂起状态之后将由唤醒序列唤醒。唤醒序列可以由USB主机发起也可以由USB设备本身触发。当设备被唤醒时需要调用唤醒例程来恢复系统时钟和USB数据传输。编程向导 处理USB唤醒事件1启动外部振荡器和设备的PLL。2清零USB_CNTR寄存器的FSUSP位。3查询USB_FNR寄存器的RXDP和RXDM位可以判断唤醒事件的类型具体详见表21-9。21.4 USB函数21.4.1 USB类型定义21.4 USB函数21.4.1 USB类型定义21.4.2 USB常量定义21.4.3 USB函数定义21.5 USB编程实例目前市场上USB设备的种类繁多但是这些设备会有一些共同的特性根据这些特性可以把USB设备划分为不同的类如音频设备类、显示设备类、通信设备CDC类、大容量存储设备类、人机接口设备HID类。其中USB通信设备类Communication Device ClassCDC是USB组织定义的一类专门给各种通信设备电信通信设备和中速网络通信设备使用的USB子类。CDC规范定义了包含USB接口、数据结构和服务请求的框架使围绕在该框架下种类繁多的通信设备能够被定义和使用。USB CDC通信应用本例通过使用STM32CubeMX软件提供的中间件Middleware组件可以将STM32F072VBT6微控制器的USB模块配置成CDC类通信设备。通过该设备可以将连接至PC的USB模块模拟成串行口以实现与PC之间的数据通信。程序运行后每隔约1s微控制器会通过USB接口向PC发送一个数据同时PC向微控制器发送的信息会显示在数码管上。在将USB模块配置为CDC设备时对于引脚放外设的配置如图21-9所示。在配置引脚时将数码管的驱动端PE0PE11和PF2设置为输出状态同时将PC13引脚也一并设置为输出用于驱动与之连接的LED指示灯在配置外设Peripherals时使能了USB外设并将功能设置为“DeviceFS”这时PA11/USB_DM和PA12/USB_DP引脚的USB复用功能将被自动使能在中间件组件MiddleWares的设置上将其功能类别设置为“Communication Device ClassVirtual Port Com”也就是本章提及的CDC功能。在时钟的配置上同样是将外部晶体振荡器作为PLL的输入时钟源。值得注意的是在使能了USB外设时USB模块的专用时钟源也会一并使能。具体的时钟配置如图21-10所示。在“Configuration”视图下单击“Connectivity”项下的“USB”按钮可以配置USB外设属性。这里我们使用默认的配置具体参数如图21-11和图21-12所示。同样在“Configuration”视图下单击“MiddleWares”项下的“USB_DEVICE”按钮可以配置USB中间件功能参数。这里我们使用默认的参数即可具体配置如图21-13和图21-14所示。CDC程序生成后使用KEILμVision5集成开发环境将生成的开发项目打开在“Application/User”组和“Middlewares/USB_Device_Library”组中的文件如图21-15所示。在“Application/User”组中各文件的功能详见表21-10。在这些文件中对USB外设初始化是通过中间件组件中的usbd_conf.c文件执行的对USB堆栈的初始化则是通过usb_device.c实现的USB的VID、PID和标准配置描述符保存在usbd_desc.c文件中当使用USB设备中间件时用户负责执行的函数位于usbd_名称_if.c文件如usbd_CDC_if.c中。以下需要重点关注的是“usbd_cdc_if.c”这个文件其内容详见代码清单21-1为了便于理解对部分代码加入了注释。代码清单21-1 usbd_cdc_if.c文件内容释义在附录J中指定的网站链接下载源代码在使用中间件组件生成的CDC类应用程序中在数据发送时必须先将生成的数据保存到一个数据缓冲区中也就是上述代码中的“UserRxBufferFS[APP_RX_DATA_SIZE]”数组中然后将发送缓冲区的地址通知CDC应用程序CDC应用程序会在合适的时机自动将缓冲区的数据经由USB接口发送到主机。在“CDC_Transmit_FS()”函数中使用了两个子函数一个是“USBD_CDC_SetTxBuffer()”另一个是“USBD_CDC_TransmitPacket()”其中前者是设置发送缓冲区地址后者是将暂存的数据位置和大小通知USB发送器一旦总线空闲USB就会自动发送这些数据。同样对于数据接收来说使用的函数是“CDC_Receive_FS()”当经由端点接收到数据并产生中断后CDC应用程序会调用这个函数对接收的数据进行处理在该函数内部允许用户自行添加处理代码另外其函数内部通过USBD_CDC_SetRxBuffer()子函数给CDC应用程序指定一个接收缓冲区该接收缓冲区被定义为“UserRxBufferFS[APP_RX_DATA_SIZE]”数组让USB控制器接收到数据以后将其保存至该数组中。而“USBD_CDC_ReceivePacket()”函数的作用是复位OUT端点和接收缓冲区。在“Middlewares/USB_Device_Library”组我们重点关注的文件是“usbd_cdc.c”其中保存有不同种类的USB设备描述符。具体内容详见代码清单21-2。代码清单21-2 usbd_cdc.c文件内容在附录J中指定的网站链接下载源代码CDC类通信的测试代码详见代码清单21-3、代码清单21-4和代码清单21-5。代码清单21-3 CDC类通信main.c在附录J中指定的网站链接下载源代码代码清单21-4 CDC类通信stm32f0xx_it.c在附录J中指定的网站链接下载源代码代码清单21-5 CDC类通信usbd_cdc_if.c在附录J中指定的网站链接下载源代码在开始运行本上述代码之前还需要安装意法公司的VCPVirtual COM Port driver驱动程序。该驱动可以从意法公司的官方网站下载获得VCP驱动程序压缩包如图21-16所示。安装好VCP驱动程序后如果STM32F072VBT6的USB模块得到正确的配置则在设备管理器中可以查看到“STMicroelectronics Virtual COM PortCOM4”设备具体如图21-17所示。当设备被成功识别为串行口后我们可以打开串口调试助手让PC向微控制器循环发送“0xAA”、“0x55”和“0x11”数据在串口调试助手的接收区会同步接收到上述数据同时数码管会显示从PC接收到的数据连接至PC13端口的LED也会有相应的动作串口调试助手的相关设置如图21-18所示。图21-18 CDC类通信的串口调试助手设置附录附录A STM32F072VBT6系统板电路原理图附录A STM32F072VBT6系统板电路原理图2除非另有说明指定所有I/O在复位期间和复位之后都会设置为浮空输入。3引脚的备用功能需要通过GPIOx_AFR寄存器选择而引脚的附加功能直接通过外设寄存器来选择/启用。4PC13、PC14、PC15通过电源开关供电的因为电源开关只能承受有限的电流3mA所以在GPIO状态下使用PC13、PC14和PC15作为输出模式时速度不应超过2MHz最大负载30pF而且这些GPIO引脚不得作为电流源例如驱动LED使用。5首次RTC域供电后PC13、PC14和PC15是作为GPIO使用的其功能就取决于RTC寄存器的内容并且不会因为系统复位而重置。6复位后PA13和PA14引脚被配置为SWDIO和SWCLK备用功能SWDIO引脚内部上拉和SWCLK引脚内部下拉电阻被激活。附录F STM32F072VBT6微控制器端口复用功能映射表