A comunicação USB permite rápida troca de dados. O MCU possui uma porta USB On The Go (OTG) micro AB para aplicações e permitindo controlar outros dispositivos como impressoras e pendrives ou implementar uma porta serial virtual por exemplo.
Este tutorial relata a implementação de uma porta serial virtual que é classificada como Communication Device Class (CDC) para a porta HS.
Para este exemplo os pinos utilizados são PB14 e PB15, como visto na Figura 1.
Figura 1. Configuração da porta USB.
Fonte: Adaptado pelo autor.
No menu Connectivity, na caixa de seleção do Internal FS Phy deve ser selecionada a opção Device_only. Em seguida, como visto na Figura 2, no menu Middleware, deve-se selecionar o tipo de implementação do dispositivo USB, que neste exemplo é o CDC
Figura 2. Configuração para o módulo USB.
Fonte: Adaptado pelo autor.
A ferramenta inclui arquivos necessários para o processamento das rotinas da USB e se encontram no arquivo usbd_cdc_if.c como visto na Figura 3. No arquivo em destaque a função CDC_Transmit_HS é usada para transmitir dados pela porta USB do MCU.
Figura 3. Arquivos para comunicação USB.
Fonte: adaptado pelo autor.
O trecho de código abaixo mostra como transmitir dados através da porta USB. Os resultados podem ser visualizados através de um programa terminal instalado em um PC, como visto na Figura 4.
Figura 4. Transmissão de dados para o PC.
Fonte: adaptado pelo autor.
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t i_buf[] = "hello world \r\n";
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USB_DEVICE_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1) {
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
CDC_Transmit_HS(i_buf, sizeof(i_buf));
HAL_Delay(500);
}
/* USER CODE END 3 */
}