Для изучения работы USB в микроконтроллерах STM32F105, STM32F107 существует определенное количество отладочных плат. Большинство из них имеет высокую стоимость, но, при этом, существуют демо-проекты, написанные и отлаженные производителем STMicroelectronics, которые без дополнительных усилий можно сразу загрузить в эти платы и все будет работать.
Существуют и дешевые отладочные платы, например STM32-H107 фирмы Olimex. Но проблема в том, что для дешевых плат нельзя найти готовые для использования демо-проекты.
Эта статья представляет демо-проект виртуального COM порта, который содержится в библиотеке от STMicroelectronics stm32_f105-07_f2_f4_usb-host-device_lib STM32_USB-Host-Device_Lib_V2.1.0ProjectUSB_Device_ExamplesVCPTrueSTUDIOSTM3210C-EVAL_USBD-FS, адаптированный для работы с отладочной платой STM32-H107 и результаты тестов скорости передачи.
Скачать его можно по ссылке ниже
Распакуйте архив проекта. Запустите Atollic TrueStudio.
Выберите File->Import->General->Existing Projects into workSpace->Next.
Выберите папку проекта VCP.
Установите галку Copy projects into workspace.
Нажмите Finish.
Скомпилируйте проект и он готов к загрузке в плату STM32-H107.
При создании проекта установлена конфигурация JTAG порта процессора как ST-Link.
Я использовал ST-Link, имеющийся на отладочной плате STM32VLDISCOVERY. См. рисунок ниже.
Схема соединений следующая:
STM32VLDISCOVERY STM32-H107
CN2 “SWD” JTAG
2 (SWCLK) 9 (TCK)
3 (GND) , 8 (GND)
4 (SWDIO) 7 (TMS)
Предварительно, на персональном компьютере (PC) надо установить драйвер от STMicroelectronics VCP_V1.3.1_Setup.exe.
Загрузите исполняемый код в STM32-H107 и запустите его выполнение.
Через небольшое время, необходимое для инициализации виртуального COM порта, на PC в диспетчере оборудования, в разделе порты COM и LPT появится устройство виртуальный COM порт, как показано на рисунке ниже.
Номер порта назначается первый свободный в системе.
Если этот номер не устраивает, его можно изменить средствами операционной системы ОС.
В этой статье не рассматривается использование виртуального COM порта по его прямому назначению, когда данные, принятые от РС через USB, отправляются на передачу через USARTx (UARTx) микропроцессоров STM32F105 или STM32F107, а данные, принятые USARTx(UARTx), отправляются на передачу через USB микропроцессоров на РС. Это требуется лишь в случае построения USB-serial преобразователей.
Гораздо более интересное использование этого демо-проекта для обмена по USB в режиме CDC (common device class).
В классическом варианте использования CDC должна быть библиотека функций для использования в программе микроконтроллера STM32F10x (это
библиотека STM32_USB-Host-Device_Lib_V2.1.0 и она свободно распространяется на сайте STMicroelectronics).
Со стороны РС необходим драйвер CDC (можно свободно скачать с сайта STMicroelectronics) и библиотеки функций для работы с USB при написании программы для РС. Последние STMicroelectronics не предоставляет, но можно купить библиотеки, созданные третьей стороной, причем, не дешево.
Обойти вопрос покупки библиотек можно, используя со стороны микроконтроллера режим передачи CDC, а со стороны РС лишь драйвер виртуального COM порта. Все необходимые функции для работы с виртуальным COM портом такие же, как для обычных СОМ портов и содержатся в WinSDK. Функции объявлены в файле winbase.h, а содержатся в библиотеке kernel32.lib.
Эти функции следующие:
При помощи этой функции открывается СОМ порт.
HANDLE CreateFile(
LPCTSTR lpFileName, // pointer to name of the file
DWORD dwDesiredAccess, // access (read-write) mode
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes
DWORD dwCreationDistribution, // how to create
DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile // handle to file with attributes to copy
);
Ниже дается пример вызова функции:
const char* port = «COM1»;
HANDLE hCommPort;
hCommPort = ::CreateFile(
port, //port name
GENERIC_READ|GENERIC_WRITE, //access read and write
0, //(share) 0:cannot share the COM port
0, //security (None)
OPEN_EXISTING, // creation : open_existing
FILE_FLAG_OVERLAPPED, // we want overlapped operation
0 // no templates file for COM port…
);
При помощи этой функции закрывается СОМ порт.
BOOL CloseHandle(HANDLE hObject); // handle to object to close
Пример вызова:
BOOL result;
result = CloseHandle(hCommPort);
Функция для передачи данных от PC на COM порт:
BOOL WriteFile(
HANDLE hFile, // handle to file to write to
LPCVOID lpBuffer, // pointer to data to write to file
DWORD nNumberOfBytesToWrite, // number of bytes to write
LPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written
LPOVERLAPPED lpOverlapped // pointer to structure needed for overlapped I/O
);
Пример вызова:
bool result;
DWORD dwBytesWritten;
OVERLAPPED ovTx;
byte Buf[64];
result = WriteFile (hCommPort, Buf, sizeof(Buf), &dwBytesWritten, &ovTx);
Данные от СОМ порта принимаются в отдельном потоке при помощи:
BOOL ReadFile(
HANDLE hFile, // handle of file to read
LPVOID lpBuffer, // address of buffer that receives data
DWORD nNumberOfBytesToRead, // number of bytes to read
LPDWORD lpNumberOfBytesRead, // address of number of bytes read
LPOVERLAPPED lpOverlapped // address of structure for data
);
Пример вызова:
byte BufRx[64];
OVERLAPPED ov;
DWORD dwBytesRead;
result = ReadFile(hCommPort, BufRx, sizeof(BufRx), &dwBytesRead,&ov);
Для того, чтобы на стороне микроконтроллера использовать режим CDC, в библиотечный файл usbd_cdc_vcp.c добавлена функция
uint16_t CDC_DataTx (uint8_t* Buf, uint32_t Len); , которая является аналогом имеющейся там функции uint16_t VCP_DataTx (uint8_t* Buf, uint32_t Len);
, с разницей в источнике данных для передачи. Для первой функции это uint8_t* Buf — массив данных, который требуется передать, второй функции данные поставляет USARTx(UARTx) микроконтроллера.
Таким образом, функция CDC_DataTx является точкой входа для передачи данных по USB от микроконтроллера на РС.
На стороне PC использовалась самодельная программа для приема/передачи байтов по порту RS232, окно которой показано ниже:
Рис.1
Она позволяет:
— оперативно открывать/закрывать COM порт с любым номером
— устанавливать требуемую скорость работы порта
— имеет поток, который принимает байты от порта и выводит их на левый экран.
Для случая проверки максимальной скорости передачи, вывод принятых байтов на экран заблокирован, а добавлен счетчик, который выводит на форму количество принятых байтов в секунду(обведено красным).
— передавать из правого окна одиночные байты, массивы байтов и строки.
Для проверки максимальной скорости передачи от микроконтроллера к PC, на плате STM32-H107 надо нажать кнопку WKUP. Загорается зеленый светодиод, микроконтроллер в цикле main следит за переменной USB_Tx_State. Когда она становится равной 0(т.е.ресурсы USB на передачу свободны), загружает эти ресурсы очередным массивом данных.
Из рис.1 видно, что скорость передачи составила 424.5 килобайт/сек. Такая скорость получена при установке в 0 параметра
#define CDC_IN_FRAME_INTERVAL 0 /* Number of frames between IN transfers */ в файле usbd_conf.h. Если параметр увеличивать, скорость будет уменьшаться.
В этой проверке установленная скорость виртуального порта не играет никакой роли.
Прием байтов от РС
Из программы на РС передается байт 123 (см.рис.2)
Рис.2
На рис.3 видно, в каком месте проекта появляется принятый от РС пакет.
Рис.3
Принятый от РС пакет содержит переданный байт 123(фигурная скобка), USB_Rx_Cnt=1, т.е длина пакета равна 1.
Для проверки максимальной скорости передачи байтов от PC на микроконтроллер программа на РС передавала пакет из 64 байтов и ждала подтверждения от микроконтроллера о приеме пакета. Потом цикл повторялся. Функция usbd_cdc_DataOut в программе микроконтроллера была модифицирована следующим образом:
Т.е функция APP_FOPS.pIf_DataRx(USB_Rx_Buffer, USB_Rx_Cnt); закомментирована, чтобы она не передавала принятые байты в USART микроконтроллера. Поток, работающий на прием на РС, подсчитывал, при этом, 1-байтовые ответы от микроконтроллера.
На рис.4 показан результат теста:
Рис.4
Скорость передачи составила 8926 х 64 = 571264 байт/с.
Следует отметить, что и в этом тесте установленная скорость виртуального порта не имеет никакого значения. Можно поставить малую скорость, например 115200 бит/с, а результат остается тем же.
Можно подвести итог:
Прикрепленные файлы:
- VCP.rar (471 Кб)