PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Программирование микроконтроллеров » Простое USB HID устройство на STM32F103C8T6


Простое USB HID устройство на STM32F103C8T6

Сообщений 1 страница 4 из 4

1

Ранее были рассмотрены аналогичные устройства на ATmega8 и ATmega32U4. На сей раз устройство выполнено на микроконтроллере STM32F103C8T6 (ядро ARM Cortex-M3), производимого компанией STMicroelectronics.
В продаже есть готовые платы содержащие микроконтроллер и необходимый минимум компонентов.

http://s019.radikal.ru/i638/1609/f4/d3cecac408e8.jpg

Программа использует светодиод находящийся на плате (подключен к PC13) необходимо лишь подключить кнопку к общему проводу (на плате обозначен как G) и выводу B12 (находится рядом с USB разъемом).

Разработка прошивки выполнялась в среде EmBitz 0.42 и использованием исходных файлов созданных программой STM32CubeMX 4.15.1. Версия пакета FW_F1 V1.4.0.

Программа для компьютера осталась прежней и разрабатывалась в среде PureBasic 5.31.

Исходные коды и скомпилированные программы для компьютера и микроконтроллера. http://pure-basic.narod.ru/forum_files/ … ice_IO.zip

+1

2

Вариант программы для микроконтроллера с использованием библиотеки STM32 USB-FS-Device 4

Сделал два примера - обмен через конечные точки и запросы Feature. https://yadi.sk/d/u7xo2tSp3Khvs8
В папках PC каждого проекта находится тестовая программа для компа. Светодиод использован имеющийся на плате, а кнопка должна быть подключена между контактом B12 и общим проводом.

Для добавления библиотеки в новый проект нужно сделать следующее.

1. Скопировать папку USB из одного из примеров архива USB_FS_Device_HID_DevIO.zip в папку проекта.
2. Добавить файлы в проект - кликнуть по проекту правой кнопкой мышки и в меню выбрать "Добавить файлы рекурсивно" и указать путь к папке USB.

Скриншот

http://sf.uploads.ru/ElRD1.png

3. Открыть файл src\Main.c и после строки #include "stm32f10x_conf.h" добавить строки

Код:
#include "hw_config.h"
#include "usb_lib.h"
#include "usb_pwr.h"
#include "HidDev_Config.h"

4. В начало функции main добавить строки.

Код:
    Set_System();
    USB_Interrupts_Config();
    Set_USBClock();
    USB_Init();

5. Открыть файл USB\inc\HidDev_Config.h и сконфигурировать библиотеку.

Код:
#define USB_VID           0x1234
#define USB_PID           0x1
#define USB_NUM           0x2   // Серийный номер устройства.

#define ENDP_IN_SIZE      1 // Размер в байтах пакета конечной точки типа Input (0 - 64). Направление из МК в ПК.
#define ENDP_OUT_SIZE     1 // Размер в байтах пакета конечной точки типа Output (0 - 64). Направление из ПК в МК.
#define ENDP_FEATURE_SIZE 0 // Размер в байтах пакета типа Feature (0 - 64). Двунаправленный обмен через нулевую конечную точку.

#define ENDP_IN_INTERVAL  32  // Интервал в миллисекундах опроса конечной точки типа Input (1 - 255).
#define ENDP_OUT_INTERVAL 32  // Интервал в миллисекундах опроса конечной точки типа Output (1 - 255).

Все, теперь можно производить обмен данными по USB. :)

Для этой цели служит ряд функций.

Код:
void HID_Receive(uint8_t *Buff, uint8_t Size)  // Прием данных от компьютера через конечную точку. Данные будут в массиве Buff размер которого указан в аргументе Size.
void HID_SendBuff(uint8_t *Buff, uint8_t Size)  // Передача пакета в комп через конечную точку.
void HID_Feature_Receive(uint8_t *Buff, uint8_t Size)  // Прием данных от компьютера через запрос Feature. Данные будут в массиве Buff размер которого указан в аргументе Size.
uint8_t HID_Feature_Send(uint8_t *Buff, uint8_t Size)  // Передача пакета в комп через запрос Feature. Данные нужно поместить в массив Buff. Функция должна вернуть не 0 если данные были помещены в массив, иначе они не будут переданы.

Только HID_SendBuff нужно вызывать из кода, а остальные функции необходимо разместить в коде (например в файле Main.c) и их будет вызывать USB библиотека когда пришли новые данные, или нужно передать данные через запрос Feature.

0

3

Здравствуйте. На основе примера из первого поста делаю управление с компа релейным регулятором громкости Никитина. Проект уже достаточно большой- на контроллере FreeRTOS, управление реле через HC595, два семисегментных индикатора, прием и декодирование пульта ДУ.  Если не сложно, подскажите, как передавать на контроллер и принимать с него массив из 4 элементов. Пока занимаюсь только передачей от контроллера к компу. Делаю следующее

в прошивке контроллера меняю

#define CUSTOM_HID_EPOUT_SIZE                0x04       (было 02)
#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE     4    (было 02)
#define CUSTOM_HID_EPIN_SIZE                 0x04         (было 02)
#define CUSTOM_HID_EPOUT_SIZE                0x04      (было 02)

данные с контроллера передаю следующим образом

  uint8_t dataToSend[4];
  dataToSend[0] = 25;
  dataToSend[1] = 35;
  dataToSend[2] = 45;
  dataToSend[3] = 55;

USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, dataToSend, 4);

на компе поменял следующее

Dim InBuffer.b(4)

принимаю данные и вывожу так

     HID::ReadDevice(R_DeviceHandle, @InBuffer(), 4)

     SetGadgetText(#USB_read_1, StrU(InBuffer(1)))
     SetGadgetText(#USB_read_2, StrU(InBuffer(2)))
     SetGadgetText(#USB_read_3, StrU(InBuffer(3)))
     SetGadgetText(#USB_read_4, StrU(InBuffer(4)))

Вообщем с контроллера ничего не приходит. Когда передавал по одному байту все работало. Наверно в дескрипторах еще что-то надо поменять? Я там полный 0. Прошу помощи.

Отредактировано bnv123 (05.02.2018 17:48:40)

0

4

Вообщем сам спросил, сам и отвечу.

В репорте исправить количество отправляемых байт на 4

Код:
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
  /* USER CODE BEGIN 0 */
    0x06 , 0x00 , 0xFF,            // Usage_page(vendor Defined Page 1)
    0x09 , 0x01,                   // Usage(vendor Usage 1)
    0xA1 , 0x02,                   // Collection(logical)
// Описание конечной точки, типа Input - из контроллера к ПК
    0x09 , 0x01,                   // Usage(pointer)
    0x15 , 0x00,                   // Logical_minimum(0)
    0x25 , 0xFF,                   // Logical_maximum(255)
    0x75 , 0x08,                   // Report_size(8)
    0x95 , 0x04,                   // Report_count(1)                                                    было 1
    0x81 , 0x02,                   // Input( , Var , Abs)
// Описание конечной точки, типа Output     - из ПК к контроллеру
    0x09 , 0x01,                   // Usage(pointer)
    0x15 , 0x00,                   // Logical_minimum(0)
    0x26 , 0xFF , 0,               // Logical_maximum(255)
    0x75 , 0x08,                   // Report_size(8)
    0x95 , 0x01,                   // Report_count(1)                    
    0x91 , 0x02,                   // Output(data , Var , Abs)
  /* USER CODE END 0 */
  0xC0    /*     END_COLLECTION	             */

};


#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE     4    (было 02)
#define CUSTOM_HID_EPIN_SIZE                 0x04         (было 02)
#define CUSTOM_HID_EPOUT_SIZE                0x04      (было 02)


так идет отправка

Код:
uint32_t NecB;

USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, &NecB, 4); 

 

на стороне компа

#PACKET_SIZE   =  4  ; Размер HID репорта

Код:
#PACKET_SIZE   =  4  ; Размер HID репорта


;**********************************************************************
;*********************** чтение данных с STM **************************
;**********************************************************************

Procedure Thread(*xx)
Dim InBuffer.a(#PACKET_SIZE+1) ; Массив, использующися как буфер приема из STM32F103
 Repeat
   If R_DeviceHandle
     
    ; Для отладки 
    ; Err=0
    ; Debug HID_Lib_ReadDevice(R_DeviceHandle, @InBuffer(), #PACKET_SIZE, @Err)
    ; Debug Err
    
     HID_Lib_ReadDevice(R_DeviceHandle, @InBuffer(), #PACKET_SIZE+1)
 
     
     ; Вывод пришедших от контроллера данных 
     SetGadgetText(#USB_read_1, Hex (InBuffer(1)))
     SetGadgetText(#USB_read_2, Hex (InBuffer(2)))
     SetGadgetText(#USB_read_3, Hex (InBuffer(3)))
     SetGadgetText(#USB_read_4, Hex  (InBuffer(4)))
 
       
   EndIf
   Delay(10)
 ForEver
EndProcedure


С контроллера 4 байта отправляются, на компе принимаются.

Отредактировано bnv123 (08.02.2018 18:26:34)

0


Вы здесь » PureBasic - форум » Программирование микроконтроллеров » Простое USB HID устройство на STM32F103C8T6