README.md

EasyUSBCOM-VG015

EasyUSBCOM-VG015 - это библиотека, которая позволяет легко добавить функциональность виртуального COM-порта в вашу программу на микроконтроллере К1921ВГ015, используя его встроенный USB. Преимущества:

  • передача данных между компьютером и микроконтроллером без внешнего USB-UART преобразователя
  • используется привычный способ работы с COM-портами
  • не требуется установки дополнительных драйверов на компьютере (используется стандартный драйвер операционной системы).

Хотя в Errata на К1921ВГ015 указано, что работает только одна конечная точка EP4, получилось, что в режиме OUT может работать любая из конечных точек, что и позволило реализовать две конечные точки.
Библиотека создана на основе примера USB_hid и примеров USB CDC других производителей.

Работа с библиотекой

Для работы с библиотекой нужно добавить файлы EasyUSBCOM.c и EasyUSBCOM.h в ваш проект.
Взаимодействие с библиотекой осуществляется с помощью четырёх функций:

  • EasyUSBCOM_init() - вызывается для инициализации EasyUSBCOM
  • EasyUSBCOM_WritePacket(uint8_t src[], uint32_t len) - вызывается для отправки массива src длиной len
  • EasyUSBCOM_Data_Received(uint8_t data[], uint32_t len) - выполняется при прерывании после приёма массива data длиной len. Может быть добавлен пользовательский код для обработки принятых данных.
  • EasyUSBCOM_Baud_Changed(uint32_t baud) - выполняется при прерывании после приёма нового значения скорости передачи COM-порта. Может быть добавлен пользовательский код для обработки принятой скорости.

Примеры использования

Для выполнения примеров в среде Syntacore IDE нужно скопировать проект Run_leds, как указано в Быстром старте с К1921ВГ015, и дать проекту любое название. Затем нужно скопировать файлы EasyUSBCOM.c и EasyUSBCOM.h в папку проекта.

Пример 1

В примере в ответ на приём одного байта данных отправляется сообщение со значением принятого байта. Если значение принятого байта 49, или “1” в ASCII, то инвертируется логический уровень на светодиоде, который на плате BlueBird-VG015 подключён к выводу РС0. Для другой платы нужно инвертировать другой вывод.
Для запуска примера в подготовленном как описано выше проекте нужно заменить код в main.c на следующий, скомпилировать проект и запустить на микроконтроллере.

#include <K1921VG015.h>
#include <system_k1921vg015.h>
#include "retarget.h"
#include "EasyUSBCOM.h"

void led_init()
{
	RCU->CGCFGAHB_bit.GPIOCEN = 1;
	RCU->RSTDISAHB_bit.GPIOCEN = 1;
	GPIOC->OUTENSET = 1;
	GPIOC->DATAOUTSET = 1;
}

void periph_init()
{
	led_init();
	SystemInit();
	SystemCoreClockUpdate();
}

void EasyUSBCOM_Data_Received(uint8_t data[], uint32_t len)
{
	uint8_t string[] = " Entered value is ";
	string[sizeof(string)-1] = data[0];
	EasyUSBCOM_WritePacket(string,sizeof(string));
	if (data[0]=='1') GPIOC->DATAOUTTGL = 1;
}

void EasyUSBCOM_Baud_Changed(uint32_t baud)
{
}

int main(void)
{
  periph_init();
  EasyUSBCOM_init();
  while(1)
  {
  }
  return 0;
}

Теперь после подключения USB-порта микроконтроллера к USB-порту компьютера наше устройство должно определиться как COM-порт. К нему можно подключиться с помощью любой программы Терминал, и после отправки данных мы будем видеть ответ от микроконтроллера.
Подробнее>>

Пример 2

В этом примере реализуем преобразователь USB-UART. Для запуска примера нужно заменить код в main.c на следующий, скомпилировать проект и запустить на микроконтроллере.

#include <K1921VG015.h>
#include <system_k1921vg015.h>
#include "retarget.h"
#include "EasyUSBCOM.h"

#define TX_BUF_SIZE 64

void UART3_IRQHandler()
{
	uint8_t rx_data [64];
	uint32_t i = 0;
	while (((UART3->FR & (1<<4))==0)&(i<64))
	{
		rx_data [i] = UART3->DR;
		i++;
	}
	UART3->ICR = 0xFFF; //Clear UART3 interrupt flag
	EasyUSBCOM_WritePacket(rx_data,i);    
}

void UART3_init()
{
    uint32_t baud_icoef = HSECLK_VAL / (16 * 9600);
    uint32_t baud_fcoef = ((HSECLK_VAL / (16.0f * 9600) - baud_icoef) * 64 + 0.5f);
    // Configure UART3 GPIO
    RCU->CGCFGAHB_bit.GPIOAEN = 1;
    RCU->RSTDISAHB_bit.GPIOAEN = 1;
    RCU->CGCFGAPB_bit.UART3EN = 1;
    RCU->RSTDISAPB_bit.UART3EN = 1;
    GPIOA->ALTFUNCNUM_bit.PIN14 = 3;
    GPIOA->ALTFUNCNUM_bit.PIN15 = 3;
    GPIOA->ALTFUNCSET = GPIO_ALTFUNCSET_PIN14_Msk | GPIO_ALTFUNCSET_PIN15_Msk;
    // Configure UART3
    RCU->UARTCLKCFG[3].UARTCLKCFG_bit.CLKSEL = RCU_UARTCLKCFG_CLKSEL_HSE;
    RCU->UARTCLKCFG[3].UARTCLKCFG_bit.DIVEN = 0;
    RCU->UARTCLKCFG[3].UARTCLKCFG_bit.RSTDIS = 1;
    RCU->UARTCLKCFG[3].UARTCLKCFG_bit.CLKEN = 1;
    UART3->IBRD = baud_icoef;
    UART3->FBRD = baud_fcoef;
    UART3->LCRH = (3 << UART_LCRH_WLEN_Pos);
    UART3->IFLS = 0;
    UART3->IMSC = UART_IMSC_RXIM_Msk; //Receive interrupt mask
    UART3->CR = UART_CR_TXE_Msk | UART_CR_RXE_Msk | UART_CR_UARTEN_Msk;
    // Configure interrupt handler for UART3
    PLIC_SetIrqHandler (Plic_Mach_Target, IsrVect_IRQ_UART3, UART3_IRQHandler);
    PLIC_SetPriority   (IsrVect_IRQ_UART3, 0x1);
    PLIC_IntEnable     (Plic_Mach_Target, IsrVect_IRQ_UART3);
}

void periph_init()
{
	SystemInit();
	SystemCoreClockUpdate();
	UART3_init();
}

uint8_t tx_buf[TX_BUF_SIZE];
uint32_t tx_data_count = 0;
uint32_t tx_buf_cur_pos = 0;

void EasyUSBCOM_Data_Received(uint8_t data[], uint32_t len)
{
	for (uint32_t i=0;i<len;i++)
	{
		if (tx_buf_cur_pos+tx_data_count+i < TX_BUF_SIZE) tx_buf[tx_buf_cur_pos+tx_data_count+i] = data[i];
		else tx_buf[tx_buf_cur_pos+tx_data_count +i-TX_BUF_SIZE] = data[i];
	}
	tx_data_count += len;
}

void EasyUSBCOM_Baud_Changed(uint32_t baud)
{
	UART3->CR = 0;
	uint32_t baud_icoef = HSECLK_VAL / (16 * baud);
	uint32_t baud_fcoef = ((HSECLK_VAL / (16.0f * baud) - baud_icoef) * 64 + 0.5f);
	UART3->IBRD = baud_icoef;
	UART3->FBRD = baud_fcoef;
	UART3->LCRH = (3 << UART_LCRH_WLEN_Pos);
	UART3->CR = UART_CR_TXE_Msk | UART_CR_RXE_Msk | UART_CR_UARTEN_Msk;
}

int main(void)
{
  periph_init();
  EasyUSBCOM_init();
  while(1)
  {
	  if (tx_data_count)
	  {
		  while (UART3->FR&(1<<3));
		  UART3->DR = tx_buf[tx_buf_cur_pos++];
		  if (tx_buf_cur_pos==TX_BUF_SIZE) tx_buf_cur_pos = 0;
		  tx_data_count--;
	  }
  }
  return 0;
}

Для работы с примером на плате BlueBird-VG015 есть два варианта:

  • Либо подключить один USB-кабель к USB-MCU и соединить перемычкой PA14 и PA15, тогда при отправке данных из Терминала эти же данные будут приходить.
  • Либо подключить два USB-кабеля, запустить два терминала, и передавать между ними пакеты данных.
    Подробнее>>

    Лицензия

    Лицензия GPL-3.0.

Описание

Библиотека для микроконтроллера К1921ВГ015, которая позволяет легко добавить функциональность виртуального COM-порта в вашу программу , используя встроенный USB микроконтроллера

Релизы
Конвейеры
0 успешных
0 с ошибкой