Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

Проект виртуального СОМ порта для отладочной платы STM32H107

Для изучения работы 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.0\Project\USB_Device_Examples\VCP\TrueSTUDIO\STM3210C-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. См. рисунок ниже.

5.jpg

Схема соединений следующая:

 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.jpg 
Рис.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)  

4.jpg 
Рис.2

На рис.3 видно, в каком месте проекта появляется принятый от РС пакет.

3.jpg 
Рис.3

Принятый от РС пакет содержит переданный байт 123(фигурная скобка), USB_Rx_Cnt=1, т.е длина пакета равна 1.

Для проверки максимальной скорости передачи байтов от PC на микроконтроллер программа на РС передавала пакет из 64 байтов и ждала подтверждения от микроконтроллера о приеме пакета. Потом цикл повторялся. Функция usbd_cdc_DataOut в программе микроконтроллера была модифицирована следующим образом:

7.jpg

Т.е функция APP_FOPS.pIf_DataRx(USB_Rx_Buffer, USB_Rx_Cnt); закомментирована, чтобы она не передавала принятые байты в USART микроконтроллера. Поток, работающий на прием на РС, подсчитывал, при этом, 1-байтовые ответы от микроконтроллера.

На рис.4 показан результат теста:

6.jpg  
Рис.4

Скорость передачи составила 8926 х 64 = 571264 байт/с.

Следует отметить, что и в этом тесте установленная скорость виртуального порта не имеет никакого значения. Можно поставить малую скорость, например 115200 бит/с, а результат остается тем же.

Можно подвести итог:

  1. Данные по скорости обмена по USB получены при минимальной их обработке со стороны микроконтроллера. Если обработка данных будет более сложная, скорость обмена уменьшится.
  2. Скорость обмена ограничивается быстродействием микроконтроллера, работающего на частоте 72МГц.
  3. Скорость обмена достаточно большая и позволяет использовать описанные в статье методы приема и передачи данных по USB микроконтроллеров STM32F105, STM32F107 при написании программ для широкого круга приложений.

Прикрепленные файлы:

Теги:

Опубликована: 0 0
Я собрал 0 1
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 1 чел.

Комментарии (0) | Я собрал (0) | Подписаться

Статью еще никто не комментировал. Вы можете стать первым.
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется сила тока?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Программатор Pickit3
Программатор Pickit3
Модуль радиореле на 4 канала Катушка Тесла
вверх