PureBasic - форум

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

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


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


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

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

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.
В папках PC каждого проекта находится тестовая программа для компа. Светодиод использован имеющийся на плате, а кнопка должна быть подключена между контактом B12 и общим проводом.

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

1. Скопировать папку USB из одного из примеров архива в папку проекта.
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.
uint8_t 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 если данные были помещены в массив, иначе они не будут переданы.

Файлы  http://pure-basic.narod.ru/forum_files/ … _DevIO.zip

Код:
void HID_Receive(uint8_t *Buff, uint8_t Size)  // Прием данных от компьютера через конечную точку. Данные будут в массиве Buff размер которого указан в аргументе Size.
uint8_t HID_SendBuff(uint8_t EPnum, uint8_t *Buff, uint8_t Size)  // Передача пакета в комп через конечную точку EPnum.
void HID_SendCompleted(uint8_t EPnum); // Информирование о завершении передачи через конечную точку.
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.
Файлы http://pure-basic.narod.ru/forum_files/ … _DevIO.zip

0


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