Суть такая.
Все сокращено до минимальных условностей.
Работаю с STM32_CubeIDE и STM32_CubeMX, последний при изменении параметров конфигурации чипа, ВСЕГДА автогенерит новый файл “AutoGenerate.h”
параметр CUSTOM_HID_EPIN_SIZE в нем изменить нельзя и он всегда = 0х02
это ошибка, да и хрен с ней, суть не в этом, я это знаю, но сегодня забыл, получил геморрой, теперь пытаюсь в основном коде это поймать и исправить.
на самом деле мне надо пропихнуть туда значение 0х40, оно правильно для моей задачи.
основной код (я на дурдуине это все симулировал)
#include "AutoGenerate.h"
// Этот прием проходит, компиляция не проходит и сейчас так, за CUbeMX правлю ручками на 0х40
/*
#if CUSTOM_HID_EPIN_SIZE != 0x40
#error CUSTOM_HID_EPIN_SIZE must bee = 0x40
#endif
*/
// но хочется большего )) если сделать так, предупреждения нет, да CUSTOM_HID_EPIN_SIZE становится 0х40, НО!! структура HID уже проинициализирована с значением CUSTOM_HID_EPIN_SIZE равным 0х02
/*
#ifdef CUSTOM_HID_EPIN_SIZE
#undef CUSTOM_HID_EPIN_SIZE
#define CUSTOM_HID_EPIN_SIZE (0x40U)
#endif
*/
//или так, вылезает предупреждение - редефинед, да CUSTOM_HID_EPIN_SIZE становится 0х40, НО!! структура HID уже проинициализирована с значением CUSTOM_HID_EPIN_SIZE равным 0х02
#define CUSTOM_HID_EPIN_SIZE (0x40U)
void setup()
{
HID myHID;
Serial.begin(9600);
Serial.println("");
Serial.println("Start...");
Serial.print("CUSTOM_HID_EPIN_SIZE = ");
Serial.println(CUSTOM_HID_EPIN_SIZE);
Serial.print("EPIN_size = ");
Serial.println(myHID.EPIN_size);
}
void loop() {}
Почитал насчет моего совета с ключами сборки - тоже не прокатит. Дефайны внутри кода имеют приоритет, так как логически определяются ПОСЛЕ дефайнов из опций, поэтому файл “AutoGenerate.h” снова перезапишет в дефайн свое значение 2.
Можно. Но тут есть нюанс. Если файл “AutoGenerate.h” инклюдится только в данный файл кода (а не ещё в 100500 файлов, включая системные), то проблемы нет вовсе. Можно сделать как у Вас, а можно и вовсе не инклюдить его, а нужную структуру определить самому как хочется. Т.е. нет проблемы.
Если же он инклюдится ещё в х/з скольких местах, то, боюсь, что красивого решения нет. Разве что искать в CubeIDE место откуда он берёт шаблон для автосоздания этого файла и править там.
Шаблон для генерации файлов в программе CubeMX (STM32CubeMX)
находится внутри кода самой программы. Пользователь не может найти
отдельный шаблон для генерации, так как он встроен в код CubeMX и не
доступен для изменения.
community.st.com
Для большинства реальных задач (например, передача показаний датчиков, управление устройствами) 2 байт недостаточно. Обычно требуется увеличить этот размер.
Где менять : В файле usbd_customhid.h вашего проекта.
Максимальное ограничение : Для полноскоростных USB-устройств (Full-Speed, 12 Мбит/с) максимальный размер пакета для HID-класса (Interrupt Transfer) составляет 64 байта (0x40 ).
Пример изменения :
// В файле usbd_customhid.h
#define CUSTOM_HID_EPIN_SIZE 0x40U // Меняем с 0x02 на 0x40 (64 байта)
Важные замечания при изменении
Просто изменить этот макрос недостаточно. Чтобы устройство корректно работало и не «падало» с ошибками драйвера, необходимо согласовать это изменение еще в трех местах:
Дескриптор отчета (Report Descriptor) : Размер отчета, указанный в дескрипторе, должен соответствовать новому размеру конечной точки. Обычно это настраивается в файле usbd_custom_hid_if.c (или аналогичном, где описан дескриптор). Нужно проверить пару REPORT_COUNT и REPORT_SIZE . Если вы хотите передавать 64 байта, REPORT_COUNT должен быть 0x40 (64) при REPORT_SIZE равном 0x08 (8 бит).
// Пример фрагмента дескриптора для 64 байт
0x95, 0x40, // REPORT_COUNT (64)
0x75, 0x08, // REPORT_SIZE (8)
OUT-конечная точка (опционально) : Если ваше устройство также принимает данные от компьютера (например, команды управления), необходимо аналогично изменить макрос CUSTOM_HID_EPOUT_SIZE на то же значение (например, 0x40 ).
Буферы в приложении : В вашем пользовательском коде (например, в main.c ) обязательно убедитесь, что размер буфера, который вы передаете в функцию USBD_CUSTOM_HID_SendReport , не меньше указанного значения (или что вы не пытаетесь записать в него больше данных, чем он может вместить).