163 lines
8.7 KiB
Plaintext
163 lines
8.7 KiB
Plaintext
/**
|
||
@page CDC_Standalone USB Device Communication (CDC) example
|
||
|
||
@verbatim
|
||
******************************************************************************
|
||
* @file USB_Device/CDC_Standalone/readme.txt
|
||
* @author MCD Application Team
|
||
* @brief Description of the USB Device CDC example.
|
||
******************************************************************************
|
||
* @attention
|
||
*
|
||
* Copyright (c) 2016 STMicroelectronics.
|
||
* All rights reserved.
|
||
*
|
||
* This software is licensed under terms that can be found in the LICENSE file
|
||
* in the root directory of this software component.
|
||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||
*
|
||
******************************************************************************
|
||
@endverbatim
|
||
|
||
@par Application Description
|
||
|
||
Use of the USB device application based on the Device Communication Class (CDC) and
|
||
following the PSTN subprotocol. This application uses the USB Device and UART peripherals.
|
||
|
||
This is a typical example on how to use the STM32F0xx USB Device peripheral where the STM32 MCU
|
||
behaves as a USB-to-RS232 bridge following the Virtual COM Port (VCP) implementation.
|
||
- On one side, the STM32 exchanges data with a PC host through USB interface in Device mode.
|
||
- On the other side, the STM32 exchanges data with other devices (same host, other host,
|
||
other devices…) through the UART interface (RS232).
|
||
|
||
At the beginning of the main program the HAL_Init() function is called to reset all the peripherals,
|
||
initialize the Flash interface and the systick. The user is provided with the SystemClock_Config()
|
||
function to configure the system clock (SYSCLK) to run at 48 MHz.
|
||
|
||
The 48 MHz clock for the USB can be derived from one of the two following sources:
|
||
– PLL clock(clocked by the HSE): If the USB uses the PLL as clock source.
|
||
– RC48 Clock (HSI48): The HSI48 clock is generated from an internal 48 MHz RC oscillator, coupled with
|
||
the clock recovery system (CRS).
|
||
The CRS allows automatic trimming of the internal HSI48, synchronized with USB SOF signal at 1KHz rate,
|
||
to guarantee its optimal accuracy over the whole device operational range.
|
||
User can select USB clock from HSI48 or PLL through macro defined in main.h
|
||
(USE_USB_CLKSOURCE_CRSHSI48 and USE_USB_CLKSOURCE_PLL).
|
||
|
||
When the VCP application is started, the STM32 MCU is enumerated as serial communication port and is
|
||
configured in the same way (baudrate, data format, parity, stop bit) as it would configure a standard
|
||
COM port. The 7-bit data length with no parity control is NOT supported.
|
||
|
||
During enumeration phase, three communication pipes "endpoints" are declared in the CDC class
|
||
implementation (PSTN sub-class):
|
||
- 1 x Bulk IN endpoint for receiving data from STM32 device to PC host:
|
||
When data are received over UART they are saved in the buffer "UserTxBuffer". Periodically, in a
|
||
timer callback the state of the buffer "UserTxBuffer" is checked. If there are available data, they
|
||
are transmitted in response to IN token otherwise it is NAKed.
|
||
The polling period depends on "CDC_POLLING_INTERVAL" value.
|
||
|
||
- 1 x Bulk OUT endpoint for transmitting data from PC host to STM32 device:
|
||
When data are received through this endpoint they are saved in the buffer "UserRxBuffer" then they
|
||
are transmitted over UART using interrupt mode and in meanwhile the OUT endpoint is NAKed.
|
||
Once the transmission is over, the OUT endpoint is prepared to receive next packet in
|
||
HAL_UART_TxCpltCallback().
|
||
|
||
- 1 x Interrupt IN endpoint for setting and getting serial-port parameters:
|
||
When control setup is received, the corresponding request is executed in CDC_Itf_Control().
|
||
In this application, two requests are implemented:
|
||
- Set line: Set the bit rate, number of Stop bits, parity, and number of data bits
|
||
- Get line: Get the bit rate, number of Stop bits, parity, and number of data bits
|
||
The other requests (send break, control line state) are not implemented.
|
||
|
||
@note Receiving data over UART is handled by interrupt while transmitting is handled by DMA allowing
|
||
hence the application to receive data at the same time it is transmitting another data (full-
|
||
duplex feature).
|
||
|
||
The support of the VCP interface is managed through the ST Virtual COM Port driver available for
|
||
download from www.st.com.
|
||
|
||
@note The user has to check the list of the COM ports in Device Manager to find out the number of the
|
||
COM ports that have been assigned (by OS) to the VCP interface.
|
||
|
||
This application uses UART as a communication interface. The UART instance and associated resources
|
||
(GPIO, NVIC) can be tailored in "usbd_cdc_interface.h" header file according to your hardware
|
||
configuration. Moreover, this application can be customized to communicate with interfaces other than UART.
|
||
For that purpose a template CDC interface is provided in:
|
||
Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src directory.
|
||
|
||
To run this application, the user can use one of the following configurations:
|
||
|
||
- Configuration 1:
|
||
Connect USB cable to host and UART (RS232) to a different host (PC or other device) or to same host.
|
||
In this case, you can open two hyperterminals to send/receive data to/from host to/from device.
|
||
|
||
- Configuration 2:
|
||
Connect USB cable to Host and connect UART TX pin to UART RX pin on the STM32072B-EVAL board
|
||
(Loopback mode). In this case, you can open one terminal (relative to USB com port or UART com port)
|
||
and all data sent from this terminal will be received by the same terminal in loopback mode.
|
||
This mode is useful for test and performance measurements.
|
||
|
||
Set Hyperterminal configuration as follows :
|
||
- Baudrate : 115200
|
||
- Data : 8 bits
|
||
- Parity: None
|
||
- Stop bits : 1
|
||
- Flow Control : None
|
||
|
||
@note Care must be taken when using HAL_Delay(), this function provides accurate delay (in milliseconds)
|
||
based on variable incremented in SysTick ISR. This implies that if HAL_Delay() is called from
|
||
a peripheral ISR process, then the SysTick interrupt must have higher priority (numerically lower)
|
||
than the peripheral interrupt. Otherwise the caller ISR process will be blocked.
|
||
To change the SysTick interrupt priority you have to use HAL_NVIC_SetPriority() function.
|
||
|
||
@note The application need to ensure that the SysTick time base is always set to 1 millisecond
|
||
to have correct HAL operation.
|
||
|
||
@note To reduce the example footprint, the toolchain dynamic allocation is replaced by a static allocation
|
||
by returning the address of a pre-defined static buffer with the CDC class structure size.
|
||
|
||
@par Directory contents
|
||
|
||
- USB_Device/CDC_Standalone/Src/main.c Main program
|
||
- USB_Device/CDC_Standalone/Src/system_stm32f0xx.c STM32F0xx system clock configuration file
|
||
- USB_Device/CDC_Standalone/Src/stm32f0xx_it.c Interrupt handlers
|
||
- USB_Device/CDC_Standalone/Src/stm32f0xx_hal_msp.c HAL MSP module
|
||
- USB_Device/CDC_Standalone/Src/usbd_cdc_interface.c USBD CDC interface
|
||
- USB_Device/CDC_Standalone/Src/usbd_conf.c General low level driver configuration
|
||
- USB_Device/CDC_Standalone/Src/usbd_desc.c USB device CDC descriptor
|
||
- USB_Device/CDC_Standalone/Inc/main.h Main program header file
|
||
- USB_Device/CDC_Standalone/Inc/stm32f0xx_it.h Interrupt handlers header file
|
||
- USB_Device/CDC_Standalone/Inc/stm32f0xx_hal_conf.h HAL configuration file
|
||
- USB_Device/CDC_Standalone/Inc/usbd_conf.h USB device driver Configuration file
|
||
- USB_Device/CDC_Standalone/Inc/usbd_desc.h USB device MSC descriptor header file
|
||
- USB_Device/CDC_Standalone/Inc/usbd_cdc_interface.h USBD CDC interface header file
|
||
|
||
|
||
@par Hardware and Software environment
|
||
|
||
- This example runs on STM32F072VB devices.
|
||
|
||
- This example has been tested with STMicroelectronics STM32072B-EVAL RevB board and can be easily tailored
|
||
to any other supported device and development board.
|
||
|
||
- STM32072B-EVAL Set-up
|
||
- Connect the STM32072B-EVAL board to the PC through 'USB Type A-Male
|
||
to A-Male'
|
||
- Connect the STM32072B-EVAL board to the PC (or to another evaluation board) through RS232 (USART)
|
||
serial cable CN10 connector. Please ensure that jumper JP7 is fitted in RS232_RX position and
|
||
jumper JP10 in TX position.
|
||
- For loopback mode test: remove RS232 cable on CN10 and connect directly USART TX and RX pins:
|
||
PD5 and PD6 (with a cable or a jumper).
|
||
|
||
@par How to use it ?
|
||
|
||
In order to make the program work, you must do the following:
|
||
- Open your preferred toolchain
|
||
- Rebuild all files and load your image into target memory
|
||
- Run the example
|
||
- Install the USB virtual COM port driver
|
||
- Find out the number of the COM port assigned to the STM32 CDC device
|
||
- Open a serial terminal application and start the communication
|
||
|
||
|
||
*/
|