Просветите, я хочу невероятного? (Петрович, пАмАгите..)

Суть такая.
Все сокращено до минимальных условностей.
Работаю с STM32_CubeIDE и STM32_CubeMX, последний при изменении параметров конфигурации чипа, ВСЕГДА автогенерит новый файл “AutoGenerate.h”

#include <stdint.h>

#define CUSTOM_HID_EPIN_SIZE 0x02U

struct HID {
  uint8_t EPIN_size = CUSTOM_HID_EPIN_SIZE;
};

параметр 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() {}

если сумбурно, готов уточнять детали, просто утавши уже сильно))

Дефайн из твоего кода в системные файлы не попадает и при их сборке не используется, поэтому ты хоть слона там обьяви - размер останется 2.

Надо править исходный файл “AutoGenerate.h”, либо файлы, которые его включают

этот слон мне понятен.
хочу решения со львом))
не получится, не ?

я сегодня напоролся просто, поменял конфиг чипа, сгенерил, и получил геморой на 3 часа поисков.
как костыль вставил

#if CUSTOM_HID_EPIN_SIZE != 0x40
#error CUSTOM_HID_EPIN_SIZE must bee = 0x40
#endif

да, теперь хрен компильнется, но яж ленивый шоб еще что то править надо было ))

В коде, по-моему нет. Может Евгений что подскажет.

Это ж тоже самое, как типичный вопрос новичков ардуино - “Как мне определить дефайн в скетче, чтобы он влиял на библиотеку?” - ответ никак

Если есть доступ к ключам сборки, можно попробовать задать ключ компиляции что-то типа

-DCUSTOM_HID_EPIN_SIZE=0x40
1 лайк

спасиб, Петровича дождемся.
он такие мне штуки советовал раньше.. ух, до сих пор пользуюсь.

вспомнил, с темплайтами, мать их эти.

Почитал насчет моего совета с ключами сборки - тоже не прокатит. Дефайны внутри кода имеют приоритет, так как логически определяются ПОСЛЕ дефайнов из опций, поэтому файл “AutoGenerate.h” снова перезапишет в дефайн свое значение 2.

1 лайк

А почему нельзя просто изменить в самой структуре значение?

#include "AutoGenerate.h"

void setup() {
  
  HID myHID;

  myHID.EPIN_size = 0x40;
  
  Serial.begin(9600);

  Serial.println("");
  Serial.println("Start...");

  Serial.print("EPIN_size = ");
  Serial.println(myHID.EPIN_size);
}

void loop() {}

Объясните, пожалуйста, кому не лень…

Разве что вечером. Сегодня я в разъездах, причём не с водителем, а сам, так что никак, пока домой не вернусь.

1 лайк

а что делать молодым прафисионалам ? на ком им тренироваться с их не 100% решениями ?

#include "AutoGenerate.h"

struct HID_Fixed {
    HID inner;
    
    HID_Fixed() : inner() {  // явно вызываем конструктор по умолчанию
        // inner.EPIN_size уже проинициализирован значением 0x02,
        // теперь меняем:
        inner.EPIN_size = 0x40;
    }
    
    // Для доступа к исправленному значению
    uint8_t getEPINsize() const { 
        return 0x40;  // или return inner.EPIN_size;
    }
    
    // Если нужно, чтобы обращались напрямую к полю — оператор преобразования
    operator HID&() { return inner; }
    operator const HID&() const { return inner; }
};

void setup() {
    HID_Fixed myHID;
    
    Serial.println(myHID.getEPINsize());     // 0x40
    Serial.println(myHID.inner.EPIN_size);   // 0x40 (после исправления)
    
    // Если нужен оригинальный HID:
    HID& hid_ref = myHID;  // работает благодаря operator HID&()
    Serial.println(hid_ref.EPIN_size);       // тоже 0x40
}

это сильно упрощенный пример хотелки, в оригинале куб генерит еще и такое

  /* Open EP IN */
  USBD_LL_OpenEP(pdev, CUSTOM_HID_EPIN_ADDR, USBD_EP_TYPE_INTR,
                 CUSTOM_HID_EPIN_SIZE);

и т.д.

1 лайк

@BABOS я знал что ты влезешь
и специально капсом написал

1 лайк

Project → Properties → C/C++ Build → Settings → Tool Settings → MCU GCC Compiler → Preprocessor DCUSTOM_HID_EPIN_SIZE=0x40

как видите не помогло… а нельзя самому его создать ? AutoGenerate.h
добавьте еще один файл…. и заменить название на него

// usb_override.h
#pragma once

// Сначала переопределяем макрос
#define CUSTOM_HID_EPIN_SIZE 0x40U

// Потом включаем оригинальный файл
#include "AutoGenerate.h"

// Проверка для уверенности
#if CUSTOM_HID_EPIN_SIZE != 0x40U
    #error "CUSTOM_HID_EPIN_SIZE override failed!"
#endif

если есть время, у меня еще много идей будет)))

это было очевидно как восход солнца, не удивили…

Можно. Но тут есть нюанс. Если файл “AutoGenerate.h” инклюдится только в данный файл кода (а не ещё в 100500 файлов, включая системные), то проблемы нет вовсе. Можно сделать как у Вас, а можно и вовсе не инклюдить его, а нужную структуру определить самому как хочется. Т.е. нет проблемы.

Если же он инклюдится ещё в х/з скольких местах, то, боюсь, что красивого решения нет. Разве что искать в CubeIDE место откуда он берёт шаблон для автосоздания этого файла и править там.

1 лайк
Шаблон для генерации файлов в программе 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 байта)

:warning: Важные замечания при изменении

Просто изменить этот макрос недостаточно. Чтобы устройство корректно работало и не «падало» с ошибками драйвера, необходимо согласовать это изменение еще в трех местах:

  1. Дескриптор отчета (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)
  1. OUT-конечная точка (опционально) : Если ваше устройство также принимает данные от компьютера (например, команды управления), необходимо аналогично изменить макрос CUSTOM_HID_EPOUT_SIZE на то же значение (например, 0x40 ).
  2. Буферы в приложении : В вашем пользовательском коде (например, в main.c ) обязательно убедитесь, что размер буфера, который вы передаете в функцию USBD_CUSTOM_HID_SendReport , не меньше указанного значения (или что вы не пытаетесь записать в него больше данных, чем он может вместить).

Это (что, наверное, очевидно) ответ от ИИ. Сам я в этом не понимаю.

поменять не проблема, собсна я это и делаю, но при новой генерации CubeMX опять перепишет это значение в 0х02.

Вы писали, что меняете его в AutoGenerate.h.
usbd_customhid.h тоже меняется при каждой генерации?

епта, ну пример был это с AutoGenerate.h.

реально да, меняется usbd_customhid.h, нехотел всем голову морочить просто.

Ясно. Тогда прошу прощения, не буду лезть туда, где ничего не понимаю.