Перейти к содержанию
    

Win10 64x, CubeMX, STM32F407 discovery

Error in OpenPort: Internal Error when initializing COM3

Была попытка запуска на Win7. Которая оказалось удачной. Предварительно -- проблема с драйверами.

Но вопрос того что один и тот же проект сгенеренный CubeMX под IAR -- работает, а GCC -- нет, остается открытым. Может там какте-то тайминги вступают в работу... хотя...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Была такая же проблема, глубоко не копал, но проблему решил. В кубе при генерации проекта heapsize ставьте 0х400 все будет работать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пробовал, и так и сяк... не помогает :(

В main добавляю простой код и все, работать перестает

for (unsigned char i = 0; i < 32; i++)
{
    transmitBuffer[i] = i + 1;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот тут ребята тоже бадались с подобной проблемой...

https://community.st.com/thread/14400

https://community.st.com/thread/34502-open-...-using-haldelay

Это просто жесть (см. картинку)...

post-25593-1482837243_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тоже столкнулся с такой же проблемой. При подключении к компьютеру stm32f746 через USB и установки драйверов на последовательный USB порт с сайта ST, порт определялся с ошибкой 10 (устройство не может быть запущено).

Я так и не смог найти, где изменить размер кучи (Heap size), но проблема решилась по совету из этой темы: https://community.st.com/message/91508 После уменьшения HS max packet size с 512 до 64 все заработало. Где это изменяется в Cube MX я так и не нашел, поэтому изменил значение CDC_DATA_HS_MAX_PACKET_SIZE в файле usbd_cdc.h

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Вас плата из стандартных или своя?

На каком (HS или FS устройстве) поднято USB и какой windows?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 5/13/2014 at 10:26 AM, ViKo said:

Таже проблема с STM32H743ZI (на плате Nucleo и на моей собственной), пользуюсь USB FullSpeed со встроенной физикой.

В Windows 10 порт появляется, но не открывается терминальными программами и моей собственной на Qt и на C#. C# пишет "The parameter is incorrect", RealTerm пишет тоже самое, PuTTY просто не работает, но все работает с программой Tera Term. Также все работает в Linux Ubuntu x64 и в Raspbian x32.

 

Минимальный размер кучи увеличивал, отредактировал также одну ошибку в дискрипторе usbd_desc.c

 

          ===>Device Descriptor<===
bLength:                           0x12
bDescriptorType:                   0x01
bcdUSB:                          0x0200
bDeviceClass:                      0x02  -> This is a Communication Device
bDeviceSubClass:                   0x02
*!*ERROR:  bDeviceSubClass of 2 is invalid
bDeviceProtocol:                   0x00
bMaxPacketSize0:                   0x40 = (64) Bytes
idVendor:                        0x0483 = STMicroelectronics
idProduct:                       0x5740
bcdDevice:                       0x0200
iManufacturer:                     0x01
     English (United States)  "STMicroelectronics"
iProduct:                          0x02
     English (United States)  "STM32 Virtual ComPort"
iSerialNumber:                     0x03
     English (United States)  "383A34463137"
bNumConfigurations:                0x01

 

- программа UsbView от Microsoft

 

Но в Windows 10 так и не работает

 

Изменено пользователем Manfred

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

bDeviceSubClass должен быть равен 0. На десятке не проверял - негде, а с XP, семеркой, линухом Mint и андроидом работает. Вот мой дескриптор, если чем-то поможет:

descriptor_data<device> const Device_descriptor =
{
    sizeof(device),
    {
        { sizeof(device), type::DEVICE },
        0x0200,
        device_class::COMMUNICATION,
        device_subclass::UNSPECIFIED,
        device_protocol::UNSPECIFIED,
        64,         // bMaxPacketSize0
        0x0483,     // STMicroelectronics
        0x5740,     // STM32 Virtual ComPort in FS Mode
        0x0200,     // Device release number (2.0 in STM32cube)
        1,          // manufacturer string index
        2,          // product string index
        3,          // serial number string index
        1           // bNumConfiguration
    }
};


struct config_descriptor
{
    config                  Config;
    config::cdc             CDC;
} __attribute__((__packed__));

descriptor_data<config_descriptor> const Config_descriptor =
{
    sizeof(config_descriptor),
    {
        {   // config
            { sizeof(config), type::CONFIGURATION },
            sizeof(config_descriptor),
            2,      // Interfaces
            1,      // bConfigurationValue
            0,      // iConfiguration
            {
                false,      // remote wakeup
                true,       // self powered
                1           // must be 1
            },
            500 / 2,        // 500 mA, GSM consumption is high enough
        },
        {   //CDC
            {   // control
                {   // interface
                    { sizeof(config::interface), type::INTERFACE },
                    0,  // bInterfaceNumber
                    0,  // bAlternateSetting
                    1,  // bNumEndpoints
                    interface_class::CDC_COMMUNICATION,
                    interface_subclass::CDC_ABSRTACT_CONTROL, // Abstract modem
                    interface_protocol::CDC_ITU_T_V250,       // AT-commands
                    0,  // string index
                },
                {   // functional::Header
                    {
                        { sizeof(config::cdc::functional::header), type::CS_CDC_INTERFACE },
                        config::cdc::functional::subtype::HEADER
                    },
                    0x110       // CDC specification revision
                },
                {   // functional::CallManagement
                    {
                        { sizeof(config::cdc::functional::call_management), type::CS_CDC_INTERFACE },
                        config::cdc::functional::subtype::CALL_MANAGEMENT
                    },
                    {
                        true,       // Call management enabled
                        true,       // Over data class
                    },
                    1               // Data interface
                },
                {   // functional::AbstractControlManagement
                    {
                        { sizeof(config::cdc::functional::abstract_control_management), type::CS_CDC_INTERFACE },
                        config::cdc::functional::subtype::ABSTRACT_CONTROL_MANAGEMENT
                    },
                    {
                        false,      // Features
                        true,       // Line
                        false,      // SendBreak
                        false,      // NetworkConnection
                    },
                },
                {   // functional::Union
                    {
                        { sizeof(config::cdc::functional::union_<1>), type::CS_CDC_INTERFACE },
                        config::cdc::functional::subtype::UNION
                    },
                    0,
                    {1}
                },
                {   // endpoint,
                    { sizeof(config::endpoint), type::ENDPOINT },
                    { 2, config::endpoint::INPUT },
                    { config::endpoint::INTERRUPT },
                    8,      // max packet size
                    128     // poll interval, ep not used, max interval
                },
            },
            {   // data
                {   // interface
                    { sizeof(config::interface), type::INTERFACE },
                    1,  // bInterfaceNumber
                    0,  // bAlternateSetting
                    2,  // bNumEndpoints
                    interface_class::CDC_DATA,
                    interface_subclass::UNSPECIFIED,
                    interface_protocol::CDC_NO_CLASS_SPECIFIC,
                    0,  // string index
                },
                {   // endpoint_out
                    { sizeof(config::endpoint), type::ENDPOINT },
                    { 1, config::endpoint::OUTPUT },
                    { config::endpoint::BULK },
                    64,     // Max packet size
                    0       // poll interval (not used)
                },
                {   // endpoint_in
                    { sizeof(config::endpoint), type::ENDPOINT },
                    { 1, config::endpoint::INPUT },
                    { config::endpoint::BULK },
                    64,     // max packet size
                    0       // poll interval (not used)
                },
            },
        },
    },
};

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответ, в новых версиях FirmWare структуры выглядят несколько по другому. Device_SubClass я исправлял на 0, но это не играет роли.

Оказалось, что для STM32H7 надо пользоваться FW1.3.2, с ней все в порядке, а FW1.4.0 работает некорректно. От CubeMX 5.2.1 или CubeMX4.27 не зависит.

Интересно, что Си функции fopen("COM6", "r+"), fwrite, fgetc, fclose - работают и в Windows 10, без всякой конфигурации.

Проблема у FW1.4.0 именно в конфигурации COM порта - специализированным библиотекам не удается записать в COM порт какой-то параметров (скорость передачи, количество бит или т.п.) - из-за это вылетает исключение не верные параметры.

Изменено пользователем Manfred

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При добавление в CubeMX 5.2.1 + FW1.3.2 шины FMC (Mux PSRAM) виртуальный COM порт перестает записывать параметры.

 

Если закоментировать инициализацию FMC, то виртуальный COM порт опять работает полноценно.

 

  MX_USB_DEVICE_Init();
//  MX_FMC_Init();

 

Замена порядка инициализации не помогает. Снятие разрешения на запись в FMC в CubeMX тоже не влияет.

 

В варианте CubeMX 4.27.0 и FW1.3.2 все еще хуже. В функции MX_USB_DEVICE_Init(), нет инициализации HAL_PWREx_EnableUSBVoltageDetector(), если добавить в ручную, работает не стабильно. При включенном USB кабеле микроконтроллер при включение питания зависает, так что его даже нельзя его стереть, пока не отключишь UBS кабель. C FMC таже проблема.

 

В варианте CubeMX 5.2.1 + FW1.4.0 запись параметров виртуального COM порта не работает не зависимо, есть FMC или нет.

Изменено пользователем Manfred

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

26.06.2019 в 13:41, Manfred сказал:

В варианте CubeMX 5.2.1 + FW1.4.0 запись параметров виртуального COM порта не работает не зависимо, есть FMC или нет.

Столкнулся с подобной ошибкой записи параметров виртуального COM порта под Windows10 для STM32F411. Использовал разные версии CubeMX и FW вплоть до версий CubeMX 6.0.1 и FW_F4_V1.25.1.

Причём с микроконтроллером STM32F373 подобных ошибок никогда не возникало... 

Соответственно, решить проблему удалось только взяв из репозитория для другого МК (STM32Cube_FW_F3_V1.11.1) нужные файлы для USB и заменив их в своём проекте для STM32F411. Однако, в чём первопричина я так и не разобрался(((.

Если кто выяснит - из-за чего конкретно глюк и как его можно пофиксить - отпишитесь, плиз....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Столкнулся с той же проблемой . На ПК порт открывался и принимались данные если в МК использовалась только функция CDC_Transmit_FS. Как только добавлял свои обработчики в CDC_TransmitCplt_FS или CDC_Receive_FS то порт на ПК не открывался "Error in OpenPort: Internal Error when initializing COM3". Решение проблемы нашел тут: https://stackoverflow.com/questions/40597612/stm32-usb-vcp-virtual-com-port. А точнее:

// usbd_cdc_if.c
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length)
{
  static uint8_t tempbuf[7];
  
  /* USER CODE BEGIN 5 */
  switch(cmd)
  {
// ...
    case CDC_SET_LINE_CODING:
      memcpy(tempbuf, pbuf, sizeof(tempbuf) / sizeof(tempbuf[0]));
    break;

    case CDC_GET_LINE_CODING:
      memcpy(pbuf, tempbuf, sizeof(tempbuf) / sizeof(tempbuf[0]));
    break;
// ...
  }
  
  return (USBD_OK);
  /* USER CODE END 5 */
}

Windows 10

Mcu: STM32F405RGTx. 

Firmware: STM32Cube FW_F4 V1.25.1

Изменено пользователем Bear_ku

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В моем случае все эти ситуации всегда были связаны с нехваткой выделенной памяти. Помотрите настройки "по умолчанию". Гдето нужно добавить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Траблы с USB в классе CDC у STшников качественно закладываются CUBом. Остальные не юзал.  Добры молодцы в функцию USBD_CDC_Init(), которая вызывается в прерывании(!) засунули malloc, выделяющий память под хендлер. Вызывать malloc в прерывании вообще ковбойская практика, а с учетом, что RTOS, без которой F407 становится тупым камнем использует свой malloc, то количество потенциальных глюков сложно представить.
Как фиксить - это надо делать каждый раз при перегенерации CUBом:

1. Для CDC нужно установить/проверить
#define APP_RX_DATA_SIZE  64
#define APP_TX_DATA_SIZE  64

2. Отрехтовать USBD_CDC_Init()
2.1) объявить статическую структуру USBD_CDC_HandleTypeDef  hClassCDC;
2.2)забанить
//  hcdc = USBD_malloc(sizeof(USBD_CDC_HandleTypeDef));
3) проинициализировать указатель.
  hcdc = &hClassCDC;

 3. В функции закрытия класса соответсвенно забанить вызов free().

После этого VCP должен заработать как настоящий)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...