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

STMF207VG + HAL +CDC (STM32CubeMX)

Тестирую проект полученный от STM32CubeMX для STMF207VG.

Использую демоброду TE-STM32F207

Как-то странно работает.

Проблему с замиранием передачи нашел как решить - в ф-ии USBD_CDC_TransmitPacket переместить код hcdc->TxState = 1; до вызова USBD_LL_Transmit.

Вроде заработало, но споткнулся на том, что если за раз передаю меньше 4-х байт, то передается бред - каша из ранее переданных байт.

Под отладчиком нашел место где данные пишутся в регистры - всё пишется правильно (ф-я USB_WritePacket).

Такое впечатление что что-то с инициализацией, но с ходу ошибки не вижу.

Если передаю 4 и более байт за раз - проблем вроде пока не вижу.

Кто-то с таким сталкивался?

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


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

Код в студию(лучше всего usb_cdc_if.c). Я не давно разбирался именно с CDC и я уверен, что я вам могу помочь.

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


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

Код в студию(лучше всего usb_cdc_if.c). Я не давно разбирался именно с CDC и я уверен, что я вам могу помочь.

Вечером отпишу, тестовую платформу дома гоняю - не с собой код.

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


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

Код в студию(лучше всего usb_cdc_if.c). Я не давно разбирался именно с CDC и я уверен, что я вам могу помочь.

Проект и файл. Проект перегенерил и убрал почти всё свое.

Оставил только тестовый код, передающий данные.

И моего: тестовый код в функции StartDefaultTask, отмечено в комментариях, какой вариант работает, а какой - нет.

Исправлена ошибка библиотеки в ф-и USBD_CDC_TransmitPacket

Stack_Size и Heap_Size увеличен до 0x400

usbd_cdc_if.c - оставил как был после генерации кода из STM32CubeMX.

ArmSTM32F2.rar

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


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

4 байта? подозрительно похоже на int, Это не может быть связано где-то с выравниванием данных?

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


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

4 байта? подозрительно похоже на int, Это не может быть связано где-то с выравниванием данных?

не похоже - нашел место, где идет запись в регистр. На первый взгляд всё читается из буфера и пишется в регистр правильно.

Похоже или какая-то особенность реализации у STM32CubeMX, которую не учитываю или ошибка в инициализации железа.

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


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

Сделайте буфферы глобальными или статическими. За время пока по нескольким прерываниям произойдёт передача данных в стек USB, ваши ЛОКАЛЬНЫЕ данные прога может потереть раз 5. То что, у вас одна последовательность прокатывает, это вам просто повезло - просто этот участок памяти не затёрся.

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


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

Сделайте буфферы глобальными или статическими. За время пока по нескольким прерываниям произойдёт передача данных в стек USB, ваши ЛОКАЛЬНЫЕ данные прога может потереть раз 5. То что, у вас одна последовательность прокатывает, это вам просто повезло - просто этот участок памяти не затёрся.
Попробовать можно, но если прочитаете первое сообщение - я дошел до функции USB_WritePacket, в которой идет перезапись из буфера в регистры USB. Так там всё вычитывается правильно, я вижу младшим байтом то, что должна передаться. А реально приходит не тот байт. Уже думал на программу со стороны PC, но потестил древней простой MTTTY.exe из старых примеров VS, много используемой ранее.

Привожу куски, как отправляю:

Если так отправляю, работает

void StartDefaultTask(void const * argument)
{
  /* init code for USB_DEVICE */
  MX_USB_DEVICE_Init();

  /* USER CODE BEGIN 5 */
    uint8_t buf_add1[]="-";
    uint8_t buf_add2[]="123;";
    osDelay(10000);
    
  for(int i=0;1;i++)
  {
        // Этот код работает ---------------------------------------
            while(CDC_Transmit_FS(buf_add1, 1)!=USBD_OK) osDelay(1);
            osDelay(100);
            while(CDC_Transmit_FS(buf_add2+2, 2)!=USBD_OK) osDelay(1);
            osDelay(100);
            while(CDC_Transmit_FS(buf_add2+1, 3)!=USBD_OK) osDelay(1);
            osDelay(100);
            while(CDC_Transmit_FS(buf_add2, 4)!=USBD_OK) osDelay(1);
            osDelay(100);
        }  /* USER CODE END 5 */ 
}

А если так, не работает - кашу получаю

void StartDefaultTask(void const * argument)
{
  /* init code for USB_DEVICE */
  MX_USB_DEVICE_Init();

  /* USER CODE BEGIN 5 */
    uint8_t buf_add1[]="-";
    uint8_t buf_add2[]="123;";
    osDelay(10000);
    
  for(int i=0;1;i++)
  {
    // Этот код НЕ работает - передает "кашу"    
    while(CDC_Transmit_FS(buf_add2, 1)!=USBD_OK) osDelay(1);
    osDelay(100);
    while(CDC_Transmit_FS(buf_add2+1, 1)!=USBD_OK) osDelay(1);
    osDelay(100);
    while(CDC_Transmit_FS(buf_add2+2, 1)!=USBD_OK) osDelay(1);
    osDelay(100);
    while(CDC_Transmit_FS(buf_add2+3, 1)!=USBD_OK) osDelay(1);
    osDelay(100);
}  /* USER CODE END 5 */ 
}

По буферам - буфера хоть и локальные, но статичны по сути, т.к. в функции бесконечный цикл задачи ОС.

 

Сделайте буфферы глобальными или статическими. За время пока по нескольким прерываниям произойдёт передача данных в стек USB, ваши ЛОКАЛЬНЫЕ данные прога может потереть раз 5. То что, у вас одна последовательность прокатывает, это вам просто повезло - просто этот участок памяти не затёрся.

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

 

Добавлю: проблемы наблюдаю, если посылки делаю по 1 или 2 байта, 3 байта вроде уходят нормально, возможно сразу не так что-то посмотрел. Я понимаю, что по USB отправлять пакеты по 1-2 байта не есть гуд, но при малых объемах так удобнее, чем собирать данные в пакет и отправлять пакетом...

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


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

В общем плюнул на код, который с генерировал CubeMX, взял для теста пример - с ходу заработал.

На первый взгляд библиотеки/функции используются те-же самые.

Как будет время - сравню, чем отличаются/где ошибка.

 

Добавлю, кажется нашел. Не нравились мои настройки частот в функции SystemClock_Config.

Перенес настройки из работающего примера в неработающий - вроде всё заработало.

А CubeMX на мои совсем и не ругался, хотят он проверяет корректность.

Вот такой вот забавный эффект от некорректной настройки частот, будьте внимательны...

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


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

Добавлю, кажется нашел. Не нравились мои настройки частот в функции SystemClock_Config.

 

Оно?

In order to guarantee correct operation of the USB OTG FS peripheral, the AHB frequency should be configured to be not less than 14.2 MHz.

http://www.st.com/web/en/resource/technica.../DM00027213.pdf

 

Или что-то ещё?

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


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

Вроде не оно, я это видел, в CubeMX пишет что 25MHz у меня шина, но я не перепроверил что оно там генерировало.

Нет времени разбираться, пока работает, это пока для тестов сделано, протестирую как будет себя вести.

Если интересно - в архиве почти "голый проект" от CubeMX, ничего лишнего, есть и от CubeMX файл.

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


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

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

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

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

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

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

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

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

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

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