Есть такая библиотека "STM32 USB-FS-Device 4" от STMicroelectronics http://www.st.com/en/embedded-software/ … 32121.html
Как понятно из названия, библиотека предназначена для разработки USB устройств на микроконтроллерах STM32 с аппаратным модулем USB, к которым относится STM32F103C8T6.
Библиотека уже не поддерживается и производитель рекомендует в место нее использовать HAL. Но ее преимущество в том что она требует намного меньше ОЗУ и Flash что тоже имеет значение.
Из архива с библиотекой был взят пример "Custom_HID" и доведен до рабочего состояния - из него выброшены участки кода для EVAL плат, а также максимально упрощен процесс добавления библиотеки в новый проект и ее конфигурации.
Сделал два примера - обмен через конечные точки и запросы Feature. http://pure-basic.narod.ru/forum_files/ … _DevIO.zip
В папках PC каждого проекта находится тестовая программа для компа. Светодиод использован имеющийся на плате, а кнопка должна быть подключена между контактом B12 и общим проводом.
Для добавления библиотеки в новый проект нужно сделать следующее.
1. Скопировать папку USB из одного из примеров архива USB_FS_Device_HID_DevIO.zip в папку проекта.
2. Добавить файлы в проект - кликнуть по проекту правой кнопкой мышки и в меню выбрать "Добавить файлы рекурсивно" и указать путь к папке USB.
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.
