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 микроконтроллера